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 ---
- 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 ---
Modérateur : Jérémy
Memoire flash versus EEPROM
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
Sur cet écran tactile à ma grande surprise il n'y a pas d'EEPROM !!
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 ?
Sur cet écran tactile à ma grande surprise il n'y a pas d'EEPROM !!
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 ?
Memoire flash versus EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
resultat sur terminal
au 1er test ( suite chargement du HEX dans le PIC )
au 2eme test :
A+
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=0 ;
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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonsoir Paul,
Merci de ta réponse et de ton test très intéressant !
J'avoue ne pas comprendre quelques subtilité :
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
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
Memoire flash versus EEPROM
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 ?
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 ?
Memoire flash versus EEPROM
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 !
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.
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 !
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.
Memoire flash versus EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Jeremy , et à tous
txt est le pointeur de destination.
YES !
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
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(0x00004000, txt,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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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
Memoire flash versus EEPROM
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'ai essayé :
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 !
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 !
Memoire flash versus EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
je viens de tester ça..
resultat sur terminal
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..
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=0 ;
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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 PP, PP0;
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=0 ;
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>>6 ;
PP=(PP0+1)<<6 ;
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(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_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(PP, txt,64);
*(txt+64)=0;
UART1_Write_Text(txt);
CRLF1();
while(1);
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 51 invités