Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Memoire flash versus EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#11 Message par Jérémy » sam. 23 juin 2018 20:45 lien vers la Data-Sheet : Cliquez ici

Re moi,

PAs évident de comprendre , je ne suis toujours pas trés à l'aise avec les pointeurs mais ca vient .

Je n'arrive pas a avoir le même résultat que toi en transposant ton code avec mon PIC .
N'étant pas très a l'aise je ne trouve pas mon erreur !

Je pense que je vais pas trop faire triturer mon programme, j'ai deja pas ma la de chose à traiter lol

Code : Tout sélectionner


unsigned char Texte
[50];

unsigned long *txt;
const code  unsigned char CodePin [128]="...........0123456789....................................";
long int  PP, PP0;


//------------------------------------------------------------------------------------
// --- Copie le texte depuis ROM vers RAM
void strConstRamCpy(char *dest, const char *source) {
  while(*source) *dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}




//------------------------------------------------------------------------------------
         strConstRamCpy(Texte, " UART1_Write_CText(CodePin)\r\n");
         UART1_Write_Text(Texte);
         strConstRamCpy(Texte, CodePin);
         UART1_Write_Text(Texte);
         UART1_Write(13);
         UART1_Write(10);
         delay_ms(100);
         
         PP
=CodePin;
         strConstRamCpy(Texte, " Pointeur Initial CodePin   PP=");
         UART1_Write_Text(Texte);
         LongWordToStr(PP,Texte);
         UART1_Write_Text(Texte);
         strConstRamCpy(Texte, " soit ");
         UART1_Write_Text(Texte);
         LongWordToHex(PP,Texte);
         UART1_Write_Text(Texte);
         UART1_Write(13);
         UART1_Write(10);
         
         PP0
=PP>>;
         PP=(PP0+1)<<;
         strConstRamCpy(Texte, " Pointeur Corrige modulo 64 PP=");
         UART1_Write_Text(Texte);
         LongWordToStr(PP,Texte);
         UART1_Write_Text(Texte);
         strConstRamCpy(Texte, " soit ");
         UART1_Write_Text(Texte);
         LongWordToHex(PP,Texte);
         UART1_Write_Text(Texte);
         UART1_Write(13);
         UART1_Write(10);
         
         strConstRamCpy
(Texte, " Lecture Flash Zone CodePin  : \r\n");
         UART1_Write_Text(Texte);
         Delay_ms(100);
         txt=&TEXTE[0];
         FLASH_Read_N_Bytes(PP, txt,64);
         *(txt+64)=0;
         UART1_Write_Text(txt);
         UART1_Write(13);
         UART1_Write(10);
         
         strConstRamCpy
(Texte, " Ecriture de \" Paulo 9876543210\" en Flashrom adresse CodePin : \r\n");
         UART1_Write_Text(Texte);
         Delay_ms(100);
         txt=&TEXTE[0];
         strConstRamCpy(txt,"Paulo 9876543210")    ;
         FLASH_Write_64(PP,txt);
         Delay_ms(100);
         
         strConstRamCpy
(Texte, " RE-Lecture zone Flashrom precedement ecrite en CodePin  : \r\n");
         UART1_Write_Text(Texte);
         Delay_ms(100);
         // --  RAZ pour etre sur du contenu relu
         for (i=0;i<64;i++) TEXTE[i]=0;
         txt=&TEXTE[0];
         FLASH_Read_N_Bytes(PP, txt,64);
         *(txt+64)=0;
         UART1_Write_Text(txt);
         UART1_Write(13);
         UART1_Write(10); 


Résultat sur hyper terminal
Sans titre.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#12 Message par paulfjujo » sam. 23 juin 2018 20:58 lien vers la Data-Sheet : Cliquez ici

tu as des debordement de variable
essaie avec
unsigned char Texte[128];

deja avec strConstRamCpy(Texte, CodePin);
UART1_Write_Text(Texte);
UART1_Write(13);
UART1_Write(10);
CodePIN fait 95 cars
Aide toi, le ciel ou FantasPic t'aidera

Memoire flash versus EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#13 Message par Jérémy » sam. 23 juin 2018 22:07 lien vers la Data-Sheet : Cliquez ici

En mettant :

Code : Tout sélectionner

unsigned char Texte[128]; 


J'ai une erreur de compilation sur cette ligne .

Code : Tout sélectionner

         strConstRamCpy(TexteCodePin); 


Illegal pointer conversion
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#14 Message par paulfjujo » dim. 24 juin 2018 08:12 lien vers la Data-Sheet : Cliquez ici

J'ai une erreur de compilation sur cette ligne
strConstRamCpy(Texte, CodePin);


:sifflotte:
je ne vois aucune errreur sur cette ligne là ..
par contre :

Code : Tout sélectionner


      strConstRamCpy
(Texte, " Ecriture de \" Paulo 9876543210\" en Flashrom adresse CodePin : \r\n");
         UART1_Write_Text(Texte);
         Delay_ms(100);
         txt=&TEXTE[0];
         strConstRamCpy(txt,"Paulo 9876543210")    ;
         FLASH_Write_64(PP,txt);
         Delay_ms(100);




Attention: il faut utiliser FLASH_Erase_Write !

Code : Tout sélectionner

strConstRamCpy(txt,"Paulo 9876543210")    ;
  FLASH_Erase_Write_64(PP,txt);
  Delay_ms(100);
Aide toi, le ciel ou FantasPic t'aidera

Memoire flash versus EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#15 Message par Jérémy » dim. 24 juin 2018 09:04 lien vers la Data-Sheet : Cliquez ici

Re,

Merci encore de ton œil avertis .

Sur mon pic il me semble que je suis opbligé d'effacer par bloc de 1024 bytes ou 512 words (page 102). Ce que mon confirme la librairie avec ce pic je n'ai que FLASH_Erase_Write_1024 de disponible !

Laisse tomber Paul , c'est trop compliqué pour moi ! j'y reviendrais dans quelques années lol. ca m'auras permis de me frotter a ce genre de chose et de débroussailler mon esprit :-D

Un grand merci d'avoir jeter un oeil. JE regrette seulement que ce soit si compliqué pour enregistrer des valeurs en dur. je tombe un peu des nues , Je trouve ca abérant de ne pas avoir un peu d'EEPROM sur ce genre de PIC
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#16 Message par paulfjujo » dim. 24 juin 2018 11:18 lien vers la Data-Sheet : Cliquez ici

idea !
une autre piste !
pour un code PIN , ce doit etre suffisant..

4.5 User ID
Four memory locations (8000h-8003h) are designated
as ID locations where the user can store checksum or
other code identification numbers. These locations are
readable and writable during normal execution.
Zone USER ID Locations 8000h..8003h:

testé sur un 16F1847. .
à verifier pur ton MCU
Aide toi, le ciel ou FantasPic t'aidera

Memoire flash versus EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#17 Message par Jérémy » dim. 24 juin 2018 11:38 lien vers la Data-Sheet : Cliquez ici

Re,

Je n'ai pas trouvé de chose similaire sur mon pic! :mur:

JE pensais qu'il y avait uen zone réservée pour le programme et le bootlaoder, et ensuite une zone pour l'utilisateur . Mais non ....
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#18 Message par paulfjujo » dim. 24 juin 2018 15:59 lien vers la Data-Sheet : Cliquez ici

effectivement
sur la datasheet du 18F87J50 , on peut lire

The TBLPTR is comprised of three SFR registers:
Table Pointer Upper Byte, Table Pointer High Byte and Table Pointer Low Byte
(TBLPTRU:TBLPTRH:TBLPTRL). These three registers join to form a 22-bit wide pointer.
The low-order 21 bits allow the device to address up to 2 Mbytes ofp rogram memory space.
The 22nd bit allows access to the device ID, the user ID and the Configuration bits.

ce qui est contredit plus loin !!!

Par contre j'ai refait des test avec le clicker2 18F87J50 .. OK
qui s'averent positif , à condition de respecter un effacement de 1024 byte,
une ecriture possible de 1024 bytes (pas moins!)
et en lecture
2 possibilités:
et une lecture byte par byte
ou une lecture par N bytes


Code : Tout sélectionner



 
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\\_18F87J50_Clicker2"
  #define Projet "PIC18F87J50_Test_Ecr_Lect_FLASH.mcppi"
  #define Version "180624"
  #define Source "PIC18F87J50_Test_Ecr_Lectu_Zone_Flash"
  #define OSCILLATEUR_INTERNE     // 8MHz*PLL=48Mhz
 
 
//  ac:PIC18F87J50_schem
 
  
//-- commandes terminal VT220
#define CLS 12     // effacement de page sur Terminal VBRAY
#define CR 13
#define VT 10
#define LF 10
#define TAB 9
#define BELL 7


#define MAXLEN1 80


const code char chaine0[]="Projet : "Projet"\r\n";
const code char chaine1[]="FOSC=8MHZ No PLL => 8MHz  \r\n";
const code char chaine2[]="UART COM1:19200, UART2 COM2 :19200 \r\n";
const code char chaine3[]="18F87J50 : Tests IT UART1\r\n ";
const code char chaine4[]="Source: "Source"_"Version".c \r\n";
const code char *RS_Str[]={chaine0,chaine1,chaine2,chaine3,chaine4};

const code  unsigned char CodePin [2048]=
"...........0123456789..................................."
"...........0123456789..................................."
"...........0123456789..................................."
"...........0123456789..................................."
 ;






long int  PP,PP0;


// pin definitions
sbit LD1 at LATD4_bit;
sbit LD2 at LATE4_bit;
sbit LD1_Direction at TRISD4_bit;
sbit LD2_Direction at TRISE4_bit;

sbit BP1 at RD7_bit;
sbit BP2 at RH3_bit;
sbit BP1_Direction at TRISD7_bit;
sbit BP2_Direction at TRISH3_bit;



char TEXTE[128];
char * txt;
unsigned char CRam1[64];

char *p;
unsigned int i,j,k,l,m;
unsigned int L1;

unsigned char buffer1[MAXLEN1];
unsigned int Index1=0;
unsigned int UART1_DataReady=0;
unsigned int i1=0;
unsigned char c1;
int CptErr;

unsigned char r;

void RAZ_UART1()
{
      int i1;
      for (i1=0;i1<MAXLEN1;i1++) buffer1[i1]=0;
      Index1=0;
      i1=0;
      c1=RCREG;  // vide le buffer RCREG
      c1=0;
      UART1_DataReady=0;
     // REGISTER 8-2: PIE1: PERIPHERAL INTERRUPT ENABLE REGISTER 1
      //PIE1.RC1IE
      RCIE_bit=;
}

void UART1_Write_CText(const char *txt1)
 {
   while (*txt1)
      UART1_Write(*(txt1++));
}

// --- Copie le texte depuis ROM vers RAM
void strConstRamCpy(char *dest, const char *source)
 {
  while(*source) *(dest++) = *(source++) ;
  *dest = 0 ;    // terminateur
}

void CRLF1()
{
 UART1_Write(CR);
  UART1_Write(LF);
 }


 
 void Decompile_byte
(unsigned char un)
{
 unsigned char masque;
 masque = 0x80;
 while (masque > 0u )
 {
   if ((un & masque)>0)
       UART1_Write(49u);  //  '1'
    else
       UART1_Write
(48u);  //  '0'
    masque =masque >>1;
  }
}



void Hardware_Init(void)
 {

  ANCON0=0xFD ; // AN1= analog
  ANCON1=0xFF; // No analog on AN15--AN10
  TRISA=0xFF;
  TRISA2_bit=0; // output for UART asm TX output
  TRISB=0xFF;
  TRISC=0xFF;
  TRISG=0xFF;
  ADSHR_bit = 1;            // Alternate SFR is selected
  ANCON0 = 0xFF;            // All pins to digital
  ANCON1 = 0xFF;

  BP1_Direction = 1;         // Set direction for buttons
  BP2_Direction = 1;
  LD1_Direction = 0;        // Set direction for LEDs
  LD2_Direction = 0;
  LD1 = 0;                  // turn off LEDs
  LD2 = 0;
  }
  


// main function
void main() {

 #ifdef OSCILLATEUR_INTERNE
//  the internal oscillator is set to the default frequency of 1 MHz.
// The Internal Oscillator Frequency Select bits  (IRCF<2:0>)
// select the frequency output of the internal oscillator block
// pour conserver 19200 bauds à 16Mhz sinon retombe à 1200 bauds
// OSCCON=0x70; //  8MHz
 //OSCCON=0x60; // 4MHz
 // OSCCON=0x50 ;  // 2Mhz
 // OSCCON=0x40 ;  // 1Mhz
  // OSCCON=0x30 ;  // 500Khz
 // OSCCON=0x10 ;  // 125Khe
 //  OSCCON=0b01110000;
  OSCCON.IRCF2=1; //HFINTOSC – (8 MHz)
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=1;

 OSCCON=0x72;  // 8Mhz
 OSCTUNE=0;
 //OSCTUNE.PLLEN=0;  //   0 =sans PLL => FOSC interne 8Mhz  ou Q= 8MHz
OSCTUNE.PLLEN=1;  // 1= avec PLL => FOSC=48 Mhz
#endif

  Hardware_Init();
  
  
  txt
=&TEXTE[0];
  UART1_Init(19200); // Hardware UART init won't work with RB2 as RX  , and  RB5 as TX is OK
  Delay_ms(100);
  CRLF1();

 // init pointeur
  CRLF1();
  //ci dessous  met le boxon !
  for (i=0;i<4;i++)
  {
    strConstRamCpy(txt, RS_Str[i]);
    UART1_Write_Text(txt);
  }

  UART1_Write_CText(" Test Ecriture lecture en zone FLASH sur Clicker2 18F87J50\r\n");
  UART1_Write_CText("\r\n Init  UART\r\n");

 UART1_Write_CText(" UART1_Write_CText(CodePin)\r\n");
  Delay_ms(100);
  UART1_Write_CText(CodePin);
  CRLF1();
  Delay_ms(100);


  PP=CodePin;
  UART1_Write_CText(" Pointeur Initial CodePin PP=");
  LongWordToStr(PP,CRam1);
  UART1_Write_Text(CRam1);
  UART1_Write_CText(" soit  ");
  LongWordToHex(PP,CRam1);
  UART1_Write_Text(CRam1);
  CRLF1();

  PP0=PP>>10 ;
  PP=(PP0+1)<<10 ;
  UART1_Write_CText(" Pointeur CodePin corrige modulo 1024  PP=");
  LongWordToStr(PP,CRam1);
  UART1_Write_Text(CRam1);
  UART1_Write_CText(" soit  ");
  LongWordToHex(PP,CRam1);
  UART1_Write_Text(CRam1);
  CRLF1();




  UART1_Write_CText(" Lecture Flash Zone CodePin  : \r\n");
  Delay_ms(100);
  txt=&TEXTE[0];
    // RAZ pour etre sur de bien relire le contenu Flash
  for (i=0;i<64;i++) TEXTE[i]=0;
  EECON1.WPROG=0;    //modulo64
  FLASH_Read_N_Bytes(PP,txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();

  UART1_Write_CText(" Ecriture de \" Paulo 9876543210\" en Flashrom adresse CodePin : \r\n");
  Delay_ms(100);
  txt=&TEXTE[0];
  strConstRamCpy(txt,"Paulo 9876543210")    ;

  FLASH_Erase_Write_1024(PP,txt);
  Delay_ms(100);
  UART1_Write_CText(" RE-Lecture zone Flashrom precedement ecrite en CodePin  : \r\n");
  Delay_ms(100);
  // RAZ pour etre sur de bien relire le contenu Flash
  for (i=0;i<64;i++) TEXTE[i]=0;
  txt=&TEXTE[0];
  
  
   
//lecture byte par byte
 // for (i=0;i<64;i++)
 // {
 //   *(txt+i)=  FLASH_Read(PP+i);
  //  while(EECON1.WRERR==1);
  //  }
 
   FLASH_Read_N_Bytes
(PP,txt,8);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();
  while(1);

}
/*

Projet : PIC18F87J50_Test_Ecr_Lect_FLASH.mcppi
FOSC=8MHZ No PLL => 8MHz
UART COM1:19200, UART2 COM2 :19200
18F87J50 : Tests IT UART1
  Test Ecriture lecture en zone FLASH sur Clicker2 18F87J50

 Init  UART
 UART1_Write_CText(CodePin)
...........0123456789..............................................0123456789..............................................0123456789..............................................0123456789...................................
 Pointeur Initial CodePin PP=      3288 soit  00000CD8
 Pointeur CodePin corrige modulo 1024  PP=      4096 soit  00001000
 Lecture Flash Zone CodePin  :

 Ecriture de " Paulo 9876543210" en Flashrom adresse CodePin :
 RE-Lecture zone Flashrom precedement ecrite en CodePin  :
Paulo 9876543210

 1ere solution :
 RE-Lecture zone Flashrom Byte par Byte
 
 
 2em solution:
 RE-Lecture zone Flashrom via  FLASH_Read_N_Bytes(PP,txt,8);
Paulo 98

*/
 


sinon , 1 petite EEPROM en boitier T0-72 ( like a transistor!)
DS2431
1024-Bit 1-Wire EEPROM
1Kb Serial EEPROM Operates from Single-Contact 1-Wire Interface
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités