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 64pour 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
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);
void strConstRamCpy(unsigned char *dest, const code char *source)
{
while (*source)*dest++ = *source++ ;
*dest = 0 ; }
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 ; ANSELB=0;
PORTB = 0x00;
TRISB = 0x00; INTCON2.RBPU= 1; WPUB=0xFF;
LATB=0;
CM1CON0=0;
CM2CON0=0;
PORTC=0;
ANSELC=0 ;
ANSELC.ANSC2=1; TRISC = 0b10000111; SLRCON=0; VREFCON0.FVREN=1;
VREFCON0.FVRS1=0; VREFCON0.FVRS0=1;
}
void main()
{
OSCCON.IRCF2=1; OSCCON.IRCF1=1;
OSCCON.IRCF0=0;
OSCCON.SCS1=0;
OSCCON.SCS0=0;
OSCTUNE=0;
OSCTUNE.PLLEN=0; Init_Hardware() ;
txt=&TEXTE[0];
UART1_Init(9600); UART1_Write(CLS); 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);
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);
}