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 : 2081
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » jeu. 21 juin 2018 07:22 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Sur cet écran tactile à ma grande surprise il n'y a pas d'EEPROM !! :furieux:
Je souhaitais conserver mon code en mémoire morte .

Il me semble que je peux utilisé pour cela la mémoire flash à la place?

Mais j'avoue ne pas très bien avoir compris le fonctionnement.

La bibliothèque de mikroC parle de fonction appelé : void FLASH_Write_64(long address, char* data);

Suis je oblige d'écrire sur les 64 morceaux de la page ou seulement les 4 bytes qui m’intéresse ?
Comment trouver un segment de libre pour stocker mon mot de passe ? en étant certains de ne pas écraser une donnée du programme par inadvertance ?

Quelqu'un a-t-il des infos sur cette fonction et comment elle fonctionne ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1019
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » jeu. 21 juin 2018 10:05 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy et à tous,


Si j'en crois ma datasheet d'un PIC18F46K22,


A read from program memory is executed one byte at a time.

A write to program memory is executed on blocks of 64 bytes at a time.
Program memory is erased in blocks of 64 bytes at a time.
A bulk erase operation cannot be issued from user code.

The program memory space is 16 bits wide, while the
data RAM space is 8 bits wide. Table reads and table
writes move data between these two memory spaces
through an 8-bit register (TABLAT).

6.6 Writing to Flash Program Memory
The programming block size is 64 bytes. Word or byte
programming is not supported.


On peut LIRE un byte à la fois
MAIS ON NE PEUT PAS ECRIRE UN ou plusieurs BYTE en 1 fois
IL FAUT ECRIRE UNE PAGE DE 64 Bytes

Donc , je pense que pour etre plus SECURE
il faudrait LIRE la page ou on veut ranger des donnees, ->buffer de 64 bytes en RAM
verifier si c'est LIBRE : scanner le buffer
et ensuite ecrire les donnees voulues dans le Buffer
et transferer la page via FLASH_Write_64(long address, char* data);


voir datasheet du MCU
exemple (ASM) pour PIC18F46K22
6.6.1 FLASH PROGRAM MEMORY WRITE SEQUENCE
The sequence of events for programming an internal
program memory location should be:
1. Read 64 bytes into RAM.
2. Update data values in RAM as necessary.
3. Load Table Pointer register with address being
erased.
4. Execute the block erase procedure.
5. Load Table Pointer register with address of first
byte being written.
6. Write the 64-byte block into the holding registers
with auto-increment.
7. Set the EECON1 register for the write operation:
• set EEPGD bit to point to program memory;
• clear the CFGS bit to access program memory;
• set WREN to enable byte writ
8. Disable interrupts.
9. Write 55h to EECON2.
10. Write 0AAh to EECON2.
11. Set the WR bit. This will begin the write cycle.
12. The CPU will stall for duration of the write (about
2 ms using internal timer).
13. Re-enable interrupts.
14. Verify the memory (table read).
This procedure will require about 6 ms to update each
write block of memory.



zone flash sur 18F46K22
Block 1 4000h à 7FFFh
Block 2 8000h à BFFFh
Block 3 C00h à FFFFh

=========================================
petit test réel sur 18F26K22

Code : Tout sélectionner



#define Version "180621"
#define PROCESSOR "18F26K22"
#define POWER_SUPPLY  " 5V"

#define OSCILLATEUR_INTERNE
#define FOSC "8.0"  // MHz
#ifdef OSCILLATEUR_INTERNE
#define Config "P18F26K22_FOSC_interne_8Mhz.cfgsch"
#else
#define Config "P18F26K22_FOSC_Q8Mhz.cfgsch"
#endif

#define BAUD 9600  // UART1

#define CLS 12
#define CR 0x0D
#define LF 10
#define TAB 9
#define BACK 8
#define Beep 7
#define Separator 0x20   // space
#define ON 0    // because led tirée au +VCC
#define OFF 1

#ifndef Byte
#define Byte unsigned char
#endif

#ifndef Word
#define Word unsigned int
#endif

#define MAX_LEN1 128
#define MAX_LEN2 80
#define MAX_LEN3 80

unsigned int i,j,k,l,m,n;
unsigned char CRam1[MAX_LEN2];
unsigned char TEXTE [MAX_LEN3];
unsigned char *txt;

//unsigned char ch[3];

void Init_Hardware(void) ;
void CRLF1(void) ;
void Raz_Buffer(void) ;
void UART1_Write_CText(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);



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

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

void UART1_Write_CText(const char *txt)
 { char cx;
   cx=*(txt);
   while (cx>0)
   {  cx=*(txt++);
      UART1_Write(cx);
      }
}


void Init_Hardware()
{

  PORTA = 0x00;
  ANSELA=0;
  TRISA = 0b11000000 ;   // RA0..RA5 as output  RA7 input
 
  ANSELB
=0;
  PORTB = 0x00;
  TRISB = 0x00;    //  B0..B7 Output   ATTENTION B7 B6 for ICSP Pickit3
  INTCON2.RBPU= 1;  // disable Pull up
  WPUB=0xFF;
  LATB=0;
  CM1CON0=0;
  CM2CON0=0;
  PORTC=0;
  ANSELC=;
  ANSELC.ANSC2=1;   // AN14
  TRISC = 0b10000111;    //
  SLRCON=0; // standard rate for PORTA,B,C,D,E

  VREFCON0.FVREN=1;
  VREFCON0.FVRS1=0; // 01 = Fixed Voltage Reference Peripheral output is 1x (1.024V)
  VREFCON0.FVRS0=1;
 }


void Init_Timer1(void)
{
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0xC1;
  TMR1L         = 0x80;
  TMR1IE_bit = 1;
 //INTCON=0;   // pas d'interrupt
}


void main() 
{
#ifdef OSCILLATEUR_INTERNE
  OSCCON.IRCF2=1; //HFINTOSC - (8 MHz)
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=0;
  OSCCON.SCS1=0;
  OSCCON.SCS0=0;
  OSCTUNE=0;
  OSCTUNE.PLLEN=0;  // 1= avec PLL => 32Mhz    0 =sans PLL => 8Mhz
 #endif
  Init_Hardware() ;

  //init des tables pour etre sur de ne pas avoir d'effet de bords
  // avec variables declarées ,mais non initialisées
  for (i=0;i<MAX_LEN2-1;i++) CRam1[i]=0;
  for (i=0;i<MAX_LEN3-1;i++) TEXTE[i]=0;
  i=0;
  txt=&TEXTE[0];

  

 
// Only if Factory setting at 9600b
  UART1_Init(9600);  // HC06 JAUNE   5v    FOSC=8MHz
  UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
  Delay_ms(500);
  CRLF1();

  UART1_Write_CText(" Lecture prealable  Flashrom adresse 0x4000  : \r\n");
  FLASH_Read_N_Bytes(0x00004000, txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();
  i=0;
  do
  
{
    if (*(txt+i)!=0xFF)
     {
       break;
     }
     i++;
   } while(i<64);
  if(i==64)
     UART1_Write_CText(" OK, Zone Vierge  \r\n");
       else
     UART1_Write_CText
(" ATTENTION, Zone NON Vierge  \r\n");
  UART1_Write_CText(" Ecriture de \" Paulfjujo 1234567890\" en Flashrom adresse 0x4000  : \r\n");
  strConstRamCpy(TEXTE,"Paulfjujo 1234567890")    ;
  FLASH_Write_64(0x00004000,txt);
  // RAZ pour etre sur du contenu relu
  for (i=0;i<64;i++) TEXTE[i]=0;
  UART1_Write_CText(" RE-Lecture zone Flashrom précedement ecrite en 0x4000  : \r\n");
  FLASH_Read_N_Bytes(0x00004000, txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();
  i=0;
  do
  
{
    if (*(txt+i)!=0xFF)
     {
       break;
      }
      i++;
  } while(i<64);
  if(i==64) 
    UART1_Write_CText
(" BAD, pas d'ecriture ?  \r\n");
     else
      UART1_Write_CText
(" Ecriture semble OK  \r\n");
  while(1);
 }
 


resultat sur terminal

au 1er test ( suite chargement du HEX dans le PIC )

Code : Tout sélectionner

Lecture prealable  Flashrom adresse 0x4000  :
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
[b] OK, Zone Vierge[/b]
 Ecriture de " Paulfjujo 1234567890" en Flashrom adresse 0x4000  :
 RE-Lecture zone Flashrom précedement ecrite en 0x4000  :
Paulfjujo 1234567890
 Ecriture semble OK




au 2eme test :

Code : Tout sélectionner

Lecture prealable  Flashrom adresse 0x4000  :
Paulfjujo 1234567890
[color=#FF0000][b] ATTENTION, Zone NON Vierge[/b][/color]
 Ecriture de " Paulfjujo 1234567890" en Flashrom adresse 0x4000  :
 RE-Lecture zone Flashrom précedement ecrite en 0x4000  :
Paulfjujo 1234567890
 Ecriture semble OK


A+

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

#3 Message par Jérémy » ven. 22 juin 2018 21:58 lien vers la Data-Sheet : Cliquez ici

Bonsoir Paul,

Merci de ta réponse et de ton test très intéressant !

J'avoue ne pas comprendre quelques subtilité :

Code : Tout sélectionner

  FLASH_Read_N_Bytes(0x00004000, txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);


sur la première ligne tu lis les 64 octets de la flash a partir de l'adresse 0x0004000, mais t ules stock ou ? car c'est un pointeur et je vois pas il pointe ?
Ensuite je pense que tu rajoutes un terminateur de string pour enfin lire sur hyperterminal .

Peut on dédié une partie de cette mémoire pour que rien ne vienne s'inscrire dessus ? car il s'agit de mon code PIN, donc il ne faut pas qu'il soit eraser par inadevertance
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

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

Bonjour à tous,

Bon.... je savais que je' n’aurais pas du jouer avec la mémoire FLASH ... Mon écran reste noir et il n'ai plus detecter par le câble USB . Je pense que j'ai effacé une partie du bootloader USB ! donc je ne peut plus le programmé !

Est il seulement possible de réinjecter le bootlaoder USB ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

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

Ouff !!

Mon erreur est réparée :!

J'ai du souder le connecteur ICSP, pour pouvoir brancher mon programmateur. Ensuite j'ai télécharger le bootloader USB, puis j'ai fais une installation pour le programmateur .

Je peux à nouveau programmer mon écran par USB ! :sifflotte:

Je me suis fait une belle frayeur ! Je pense que je vais abandonner cette idée, car cela complique énormément le programme pour pas grand chose au final.
La gestion de modification du code PIN est une véritable usine à gaz . même si j'acvais finis il ne me restait plus qu'a stocker le code PIN dans une mémoire non volatile.
Chose trop compliqué sur ce 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 : 1019
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#6 Message par paulfjujo » sam. 23 juin 2018 13:54 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy , et à tous


sur la première ligne tu lis les 64 octets de la flash a partir de l'adresse 0x0004000,
mais t ules stock ou ? car c'est un pointeur et je vois pas il pointe ?



txt est le pointeur de destination.

Code : Tout sélectionner

#define MAX_LEN3 80
unsigned char TEXTE [MAX_LEN3];
unsigned char *txt;

.....
 
txt=&TEXTE[0];
 
FLASH_Read_N_Bytes(0x00004000txt,64);
  


Ensuite je pense que tu rajoutes un terminateur de string pour enfin lire sur hyperterminal


YES !


Bon.... je savais que je' n’aurais pas du jouer avec la mémoire FLASH ...


d'ou la precaution de lire d'abord la zone ,
pour verifier si elle est bien vierge avant d'y ecrire dessus!

tu n'as pas de RTC sur ton montage pour stocker le code PIN ?
RAM RTC sauvegardé par la pile...

à tester :
const code unsigned char CODEPIN[64]; pour reserver une zone en flash

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

#7 Message par Jérémy » sam. 23 juin 2018 14:37 lien vers la Data-Sheet : Cliquez ici

Code : Tout sélectionner

 txt=&TEXTE[0]; 


Ok je n'avais pas vu cette ligne. La je comprends mieux , le pointeur pointe en début de tableau !

tu n'as pas de RTC sur ton montage pour stocker le code PIN ?

Non, ne crois pas . J'ai une mémoire flash ( 8M) mais il faut que je dialogue en SPI et ca reviens a une autre usine a gaz pour seulement quatres bytes
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#8 Message par Jérémy » sam. 23 juin 2018 15:09 lien vers la Data-Sheet : Cliquez ici

J'ai essayé :

Code : Tout sélectionner

const code unsigned char CODEPIN[64]; pour reserver une zone en flash

Mais le compilateur ne peux pas écrire txt = &CODEPIN[0]; après . Certainement que comme c'est une constante, il ne sait pas ou va mettre mis l'adresse !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1019
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#9 Message par paulfjujo » sam. 23 juin 2018 17:13 lien vers la Data-Sheet : Cliquez ici

je viens de tester ça..

resultat sur terminal

UART1_Write_CText(CodePin)
...........0123456789...................................
Lecture Flash Zone CodePin :
Pointeur CodePin PP= 2892 soit 00000B4C
...........0123456789...................................
Ecriture de " Paulo 9876543210" en Flashrom adresse CodePin :
...........0123456789...................................


A priori l'ecriture ne se fait pas ...
La lecture , Oui, reste OK

de plus , le message " RE-Lecture zone Flashrom précedement ecrite en CodePin " n'apparait pas ?
programme perturbé ?

Le pointeur de la zone CodePin est bien lu
ici 0x00000B4C
on le retrouve dans le fichier *.Lst
mais il me semble que le probleme principal , est qu'il faut etre aligné modulo 64 bytes dans le code !
et là, je ne sais pas comment faire .
..
J'ai essayé d'ajouter de la reservation en amont de la table CodePin
pour retrouver une adresse PP modulo 64 , mais c'est une vraie galere
le compilo ajoutant avant ou apres cette reservation.

//** Constants locations **
//ADDRESS SIZE CONSTANT
//----------------------------------------------
0x0B0A [66] ?lstr_5__18F26K22_Flash_Write_Read_tests_180622
0x0B4C [64] _CodePin


mais si tu utilise la 1ere solution, avec verification prealable de la zone vierge, il ne devrai pas
y avoir de probleme d'ecrasment de bootloader..



Code : Tout sélectionner




#define Version "180623"
#define PROCESSOR "18F26K22"
#define POWER_SUPPLY  " 5V"

#define OSCILLATEUR_INTERNE
#define FOSC "8.0"  // MHz
#ifdef OSCILLATEUR_INTERNE
#define Config "P18F26K22_FOSC_interne_8Mhz.cfgsch"
#else
#define Config "P18F26K22_FOSC_Q8Mhz.cfgsch"
#endif

#define BAUD 9600  // UART1

#define CLS 12
#define CR 0x0D
#define LF 10
#define TAB 9
#define BACK 8
#define Beep 7
#define Separator 0x20   // space
#define ON 0    // because led tirée au +VCC
#define OFF 1

#ifndef Byte
#define Byte unsigned char
#endif

#ifndef Word
#define Word unsigned int
#endif

#define MAX_LEN1 128
#define MAX_LEN2 80
#define MAX_LEN3 128

unsigned int i,j,k,l,m,n;
unsigned char CRam1[MAX_LEN2];
unsigned char TEXTE [MAX_LEN3];
unsigned char *txt;

const code  unsigned char CodePin [64]="...........0123456789...................................";
long int  PP;
unsigned char c1;


void Init_Hardware(void) ;
void CRLF1(void) ;
void Raz_Buffer(void) ;
void UART1_Write_CText(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);

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

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

void UART1_Write_CText(const char *txt)
 { char cx;
   cx=*(txt);
   while (cx>0)
   {  cx=*(txt++);
      UART1_Write(cx);
      }
}


void Init_Hardware()
{

  PORTA = 0x00;
  ANSELA=0;
  TRISA = 0b11000000 ;   // RA0..RA5 as output  RA7 input
 
  ANSELB
=0;
  PORTB = 0x00;
  TRISB = 0x00;    //  B0..B7 Output   ATTENTION B7 B6 for ICSP Pickit3
  INTCON2.RBPU= 1;  // disable Pull up
  WPUB=0xFF;
  LATB=0;
  CM1CON0=0;
  CM2CON0=0;
  PORTC=0;
  ANSELC=;
  ANSELC.ANSC2=1;   // AN14
  TRISC = 0b10000111;    //
  SLRCON=0; // standard rate for PORTA,B,C,D,E

  VREFCON0.FVREN=1;
  VREFCON0.FVRS1=0; // 01 = Fixed Voltage Reference Peripheral output is 1x (1.024V)
  VREFCON0.FVRS0=1;
 }


void Init_Timer1(void)
{
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0xC1;
  TMR1L         = 0x80;
  TMR1IE_bit = 1;
 //INTCON=0;   // pas d'interrupt
}

void main()
{
#ifdef OSCILLATEUR_INTERNE
  OSCCON.IRCF2=1; //HFINTOSC - (8 MHz)
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=0;
  OSCCON.SCS1=0;
  OSCCON.SCS0=0;
  OSCTUNE=0;
  OSCTUNE.PLLEN=0;  // 1= avec PLL => 32Mhz    0 =sans PLL => 8Mhz
 #endif
  Init_Hardware() ;

  //init des tables pour etre sur de ne pas avoir d'effet de bords
  // avec variables declarées ,mais non initialisées
  for (i=0;i<MAX_LEN2-1;i++) CRam1[i]=0;
  for (i=0;i<MAX_LEN3-1;i++) TEXTE[i]=0;
  i=0;
  txt=&TEXTE[0];


  UART1_Init(9600);  // HC06 JAUNE   5v    FOSC=8MHz
  UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
  Delay_ms(500);
  CRLF1();

 /*
  UART1_Write_CText(" Lecture prealable  Flashrom adresse 0x4000  : \r\n");
  FLASH_Read_N_Bytes(0x00004000, txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();
  i=0;
  do
  {
    if (*(txt+i)!=0xFF)
     {
       break;
     }
     i++;
   } while(i<64);
  if(i==64)
     UART1_Write_CText(" OK, Zone Vierge  \r\n");
       else
     UART1_Write_CText(" ATTENTION, Zone NON Vierge  \r\n");
  UART1_Write_CText(" Ecriture de \" Paulfjujo 1234567890\" en Flashrom adresse 0x4000  : \r\n");
  strConstRamCpy(TEXTE,"Paulfjujo 1234567890")    ;
  FLASH_Write_64(0x00004000,txt);
  // RAZ pour etre sur du contenu relu
  for (i=0;i<64;i++) TEXTE[i]=0;
  UART1_Write_CText(" RE-Lecture zone Flashrom précedement ecrite en 0x4000  : \r\n");
  FLASH_Read_N_Bytes(0x00004000, txt,64);
  *(txt+64)=0;
  UART1_Write_Text(txt);
  CRLF1();
  i=0;
  do
  {
    if (*(txt+i)!=0xFF)
     {
       break;
      }
      i++;
  } while(i<64);
  if(i==64)
    UART1_Write_CText(" BAD, pas d'ecriture ?  \r\n");
     else
      UART1_Write_CText(" Ecriture semble OK  \r\n");
*/

  UART1_Write_CText(" UART1_Write_CText(CodePin)\r\n");
  Delay_ms(100);
  UART1_Write_CText(CodePin);
  CRLF1();
  Delay_ms(100);
  UART1_Write_CText(" Lecture Flash Zone CodePin  : \r\n");
  Delay_ms(100);
  txt=&TEXTE[0];
  
  PP
=CodePin;
  UART1_Write_CText(" Pointeur CodePin PP=");
  LongWordToStr(PP,CRam1);
  UART1_Write_Text(CRam1);
  UART1_Write_CText(" soit  ");
  LongWordToHex(PP,CRam1);
  UART1_Write_Text(CRam1);
  CRLF1();

  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_Write_64(PP,txt);
  Delay_ms(100);

  UART1_Write_CText(" RE-Lecture zone Flashrom précedement ecrite en CodePin  : \r\n");
   Delay_ms(100);
  PP=CodePin;
  for (i=0;i<64;i++)
  {
    c1=  FLASH_Read(PP);
    PP++;
    UART1_Write(c1);
    Delay_ms(10);
   }
  // --  RAZ pour etre sur du contenu relu
  //for (i=0;i<64;i++) TEXTE[i]=0;
  // txt=&TEXTE[0];
  // FLASH_Read_N_Bytes(CodePin, txt,64);
  // *(txt+64)=0;
  //  UART1_Write_Text(txt);
  CRLF1();

      
  while
(1);
 }
 
 

Memoire flash versus EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1019
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#10 Message par paulfjujo » sam. 23 juin 2018 17:53 lien vers la Data-Sheet : Cliquez ici

j'ai trouvé une astuce ...

je declare une zone de 128 bytes pour etre sur de loger un depart de modulo 64 bytes
const code unsigned char CodePin [128]="...........0123456789...................................";

recuperation de la l'adresse de cette table
long int PP; // le pointeur
long int PP0; // pour l'ajustement
......
PP=CodePin;

recadrage modulo 64 de cette adresse
PP0 =PP>>6 ; // l'adresse modulo 64 inferieure
PP=(PP0+1)<<6 ; // le +1 pour etre dans l'espace des 128 bytes et non pas en dehors du debut de table..

on utilise donc ce pointeur calé modulo 64
pour lire
et pour ecrire

par contre , j'ai vu qu'il faut ABSOLUMENT utiliser FLASH_Erase_Write_64 et non pas FLASH_Write_64
ce qui est un peu contraire aux explication Help MikroC comparant 16F et 18F
sinon , le programme plante ..

avec cette soluce, OK, pas de rique d'ecrasement programme,
puisqu'on s'est reservé 128 bytes .. c'est un peu cher en nombre de Bytes .. mais bon .
on sait exactement où on écrit



UART1_Write_CText(CodePin)
...........0123456789...................................
Pointeur Initial CodePin PP= 3062 soit 00000BF6
Pointeur CodePin corrige modulo 64 PP= 3072 soit 00000C00
Lecture Flash Zone CodePin :
.0123456789...................................
Ecriture de " Paulo 9876543210" en Flashrom adresse CodePin :
RE-Lecture zone Flashrom precedement ecrite en CodePin :
Paulo 9876543210







Code : Tout sélectionner

#define MAX_LEN3 128
unsigned int i,j,k,l,m,n;
unsigned char CRam1[MAX_LEN2];
unsigned char TEXTE [MAX_LEN3];
unsigned char *txt;

const 
code  unsigned char CodePin [128]="...........0123456789...................................";
long int  PPPP0;
unsigned char c1;

void Init_Hardware(void) ;
void CRLF1(void) ;
void Raz_Buffer(void) ;
void UART1_Write_CText(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);

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

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

void UART1_Write_CText(const char *txt)
 { 
char cx;
   
cx=*(txt);
   while (
cx>0)
   {  
cx=*(txt++);
      
UART1_Write(cx);
      }
}


void Init_Hardware()
{

  
PORTA 0x00;
  
ANSELA=0;
  
TRISA 0b11000000 ;   // RA0..RA5 as output  RA7 input
 
  
ANSELB=0;
  
PORTB 0x00;
  
TRISB 0x00;    //  B0..B7 Output   ATTENTION B7 B6 for ICSP Pickit3
  
INTCON2.RBPU1;  // disable Pull up
  
WPUB=0xFF;
  
LATB=0;
  
CM1CON0=0;
  
CM2CON0=0;
  
PORTC=0;
  
ANSELC=;
  
ANSELC.ANSC2=1;   // AN14
  
TRISC 0b10000111;    //
  
SLRCON=0// standard rate for PORTA,B,C,D,E

  
VREFCON0.FVREN=1;
  
VREFCON0.FVRS1=0// 01 = Fixed Voltage Reference Peripheral output is 1x (1.024V)
  
VREFCON0.FVRS0=1;
 }

void main()
{
#ifdef OSCILLATEUR_INTERNE
  
OSCCON.IRCF2=1//HFINTOSC - (8 MHz)
  
OSCCON.IRCF1=1;
  
OSCCON.IRCF0=0;
  
OSCCON.SCS1=0;
  
OSCCON.SCS0=0;
  
OSCTUNE=0;
  
OSCTUNE.PLLEN=0;  // 1= avec PLL => 32Mhz    0 =sans PLL => 8Mhz
 #endif
 
  
Init_Hardware() ;
  
txt=&TEXTE[0];

  
UART1_Init(9600);  // HC06 JAUNE   5v    FOSC=8MHz
  
UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
  
Delay_ms(500);
  
CRLF1();

  
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>>;
  
PP=(PP0+1)<<;
  
UART1_Write_CText(" Pointeur CodePin corrige modulo 64  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];
  
FLASH_Read_N_Bytes(PPtxt,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_64(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 du contenu relu
  
for (i=0;i<64;i++) TEXTE[i]=0;
  
txt=&TEXTE[0];
  
FLASH_Read_N_Bytes(PPtxt,64);
  *(
txt+64)=0;
  
UART1_Write_Text(txt);
  
CRLF1();

      
  while(
1);
 }
 
 


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité