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

Initialisation de l'EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » jeu. 26 janv. 2023 12:21 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Je joue actuellement sur mon application maison avec un PIC128F46K22.

Par Bluetooth je lui envoie des infos qui les stocke dans un buffer de 370 caractères . A chaque réception d'une mise a jour par Bluetooth , j'enregistre le buffer en EEPROM. Ceci afin de retrouver mes infos en cas de coupure de courant par exemple.

Donc au démarrage de mon pic je vais lire mon EEPROM pour remplir mon Buffer avec les valeurs enregistrées et pouvoir faire mon extraction de données sur un buffer correct.
J'ai cru comprendre dans la DS en page 65, dans le memory map, que l'EEPROM commence à 0x10000 .

Avant ma boucle principale, je fais donc :

Code : Tout sélectionner


unsigned int i 
;

   for(i=0; i<370; i++)     // Parcours le buffer
   {
      Buffer[i] = EEPROM_Read( 0x10000+i);
   }


Le HIC c'est qu'a la première utilisation mon buffer est remplit de 0xFF.
Cela fait naturellement planté mon extraction qui attend des caractères de séparation "~" ( comme vu sur mon précédent post).

Du coup je me suis dit que j'allais rusé.
Je vérifie les 5 premiers octets de mon buffer. Si ils sont égales à 0XFF je pourrais considérer que c'est la première fois que je le lis et donc affecté des valeurs cohérentes pour ne pas planté.

Code : Tout sélectionner


unsigned int i 
;

   for(i=0; i<370; i++)     // Parcours le buffer
   {
      Buffer[i] = EEPROM_Read( 0x10000+i);
   }
      if ((Buffer[0]==0xFF)&&(Buffer[1]==0xFF)&&(Buffer[2]==0xFF)&&(Buffer[3]==0xFF)&&(Buffer[4]==0xFF))
      Buffer[0]="1~2 ~3 ~4 ~5 ~6 ~";

      extraction_buffer();



Mais cela ne fonctionne pas.

Avez vous déjà initialiser une EEPROM seulement une fois au démarrage ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Initialisation de l'EEPROM
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#2 Message par francois77 » jeu. 26 janv. 2023 13:00 lien vers la Data-Sheet : Cliquez ici

Bonjour Jérémy,
Perso j’utilise le premier octet comme octet de validation avec une valeur x

Si l’initialisation a déjà été faite je trouve une 0x55 par exemple

Apres je fais un test

Je ne sais pas si cela répond à ta question

A+

Francois

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

#3 Message par paulfjujo » jeu. 26 janv. 2023 15:57 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy ,


avec mikroC, on ne gere pas l'adresse absolue de l'eeprom

exemple routine de lecture

Code : Tout sélectionner



unsigned char 
Read_Msg_Eepromunsigned char debut)

 
unsigned char Tampon[33];
 
int i1;
 
unsigned char Ce;
  
i1=debut;
  do
  {
  
Ce EEPROM_Read(i1);
  if ( 
Ce==0) break;
  if ( 
i1>254) break;
  
Tampon[i1-debut]=Ce;
  
Delay_ms(5);
  
i1++;
   }
  while (
Ce!=0) ;
  
Tampon[i1]=0;
  return 
Tampon;
 }
 
 
 
lecture de parametre stockés à l'adress eeprom 0x70
 [code=php]
   UART1_Write_CText(" Horaire Validation Melodie en eeprom : ");  
   Melodie=STOP;
   //Valid.Melo=08;21
   p2= Read_Msg_Eeprom(0x70) ;
   *(p2+13)=0;
   MinHour=atoi(p2+11);
   WordToStr(MinHour,CRam1);
   UART1_Write_Text(CRam1);
    *(p2+16)=0;
   MaxHour=atoi(p2+14);
   WordToStr(MaxHour,CRam1);
   UART1_Write_Text(CRam1);
   CRLF1();[/code]
 



ecriture de parametres reçus par UART (bluetooth)

Code : Tout sélectionner

  if((*(p1)=='G') && (*(p1+1)=='V') && (*(p1+2)=='M') && (*(p1+3)=='=') && (strlen(Buffer1)>=8))
      
// GVM=07;22<CR>
      
{
       
UART1_Write_CText("Game Validation Melodie : ");
       
UART1_Write_Text(p1);
        *(
p1+6)=0;
        
k=atoi(p1+4);
        *(
p1+9)=0;
        *(
p1+10)=0;
        
m=atoi(p1+7);
       if ((
m>12) && (m<24) && (k>=5) && (k<=12))
       {

         
MinHour=k;
         for (
i=0;i<2;i++)
          {  
c1=*(p1+4+i);
             
EEPROM_Write(0x7B+ic1);
             
Delay_ms(25);
             }
         
MaxHour=m;
          for (
i=0;i<2;i++)      // was <2
          
{  c1=*(p1+7+i);
             
EEPROM_Write(0x7E+ic1);
             
Delay_ms(25);
             }
         
UART1_Write_CText(" Nouvel horaire Melodie : ");
          
p2=Read_Msg_Eeprom(0x7A) ;
          
UART1_Write_Text(p2);
         }
         else
            
UART1_Write_CText(" BAD ! ");
        
CRLF1();
        
p1=0;
      } 


En principe ne j'initialise pas le contenu de l'eeprom
qui contient 0xFF par defaut
une fois mon programme demarré et que j'ai stocké quelques chose dedans , je reserve l'adresse 0x00 pour y mettre un flag
different de 0xFF ex: 0x99
Bien sur la premiere chose à faire au moment du lancement de programme, c'est de lire l'adresse 0x00 pour
savoir si le programme a déja été initialisé (valeurs deja contenue dans l'eeprom)

Ne pas oublier les delais
apres ecriture 25ms
et 5ms en lecture .
Aide toi, le ciel ou FantasPic t'aidera

Initialisation de l'EEPROM
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#4 Message par francois77 » ven. 27 janv. 2023 08:42 lien vers la Data-Sheet : Cliquez ici

Bonjour a tous ,

Si j'ai bien compris la solution de Paul , c'est le même principe que j'avais mis précédemment

Question complémentaire : peut -on effacer les données eprom directement depuis MPLAB sans programmation ?

Peut-on intégrer un fichier BIN pour l'initialisation dans MPLAB ?


A+

Francois

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

#5 Message par paulfjujo » ven. 27 janv. 2023 10:18 lien vers la Data-Sheet : Cliquez ici

avec MikroC,
on peut initialiser l'eeprom directement
via
Tools
Eeprom editor

la remplir completement avec une valeur donnée
ou byte par byte ...ligne par ligne..etc
en hexa ou en ascii et sauvegarder le tout dans un fichier avec extension Nomduprogramme.ihex

cette init sera relue au moment de la compilation du programme


avec MPLABX XC8 (avec 18F27K42)
exemple d'init EEPROM

Code : Tout sélectionner

// eeprom config   14 lignes 
__EEPROM_DATA (0,'2','3','4','5','6','7','8');__EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0000
__EEPROM_DATA (0x30,0,0,0,0,0,0,0);            __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0010
// code Progr
__EEPROM_DATA ('1','2','8','7',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0020
// code des 5 relais
__EEPROM_DATA ('1','1','3','4',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0X0030
__EEPROM_DATA ('2','2','2','5',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0040
__EEPROM_DATA ('3','3','3','6',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0050
__EEPROM_DATA ('4','4','4','7',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0060
__EEPROM_DATA ('5','5','5','8',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0070
// config 5 relais  0=ON/OFF,   1=monostable  ,9=bloque
__EEPROM_DATA ('0','0','0','0','1','0',0,0);   __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0080
// Validation modif code 1=valid
__EEPROM_DATA ('0','1','1','1','1','1',0,0);   __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x0090
// memo des Etats relais
__EEPROM_DATA ('0','0','0','0','0','0',0,0);   __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x00A0
// code PIN module BlueTooth
__EEPROM_DATA ('1','2','3','4',0,0,0,0);       __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x00B0
// memo autorisation mode bluetooth
__EEPROM_DATA ('0',0,0,0,0,0,0,0);             __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x00C0
__EEPROM_DATA ('D','i','g','i','3','0','0','0'); __EEPROM_DATA(0,0,0,0,0,0,0,0); // 0x00D0



NOTA : attention BUG mikroC avec eeprom 18F27K42 !
:furieux: MikroC n'est plus réactualisé depuis 2019 !!!!
Aide toi, le ciel ou FantasPic t'aidera

Initialisation de l'EEPROM
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#6 Message par francois77 » ven. 27 janv. 2023 12:58 lien vers la Data-Sheet : Cliquez ici

Bonjour Paul,

Merci pour ton retour d’info, cela a fait tilt dans mon petit cerveau

En ASM/ MPLAB on initialise les data de la même façon
ORG 0x2100 ; adresse EEPROM
eeprom:
; valeur d'inititialisation permet de tester si la memoire est ecrite
Init_Memoire: de 0x55 ; valeur d''init

La confusion vient du simulateur ou il faut que je fournisse un fichier BIN pour l’init

A+

Francois

Initialisation de l'EEPROM
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » ven. 27 janv. 2023 16:45 lien vers la Data-Sheet : Cliquez ici

Merci pour ces indications,

En effet mikroC gère l'adresse de l'EEPROM il faut donc commencer à l'adresse 0x00 .

dans cas je ne peux pas faire exactement comme toi.

Car au démarrage de mon PIC je dois lire les valeurs de l'EEPROM pour les envoyer à mon BT.
Mais si mon EEPROM est vierge il n'y a que des 0xFF et donc mon message est faux .

Pour contourner cela, au démarrage, je vais lire les 2 premiers octets de mon EEPROM. Si elle sont a 0XFF c'est que mon EEPROM est vierge, j'écris tout desuite avec un formatage à ma guise.
Et ensuite je peux envoyer mon message a mon BT .

Ca fonctionne bien !

Code : Tout sélectionner

   if ((Buffer[0]==0xFF)&&(Buffer[1]==0xFF)) // Je verifie les valeurs du buffer
   
{
      for(
i=0i<16 ;i+=2)     // Si le buffer est vide je le remplis avec des valeurs de base
      
{
         
Buffer[i] = 0x2D;     // Buffer[]= " ~ ~ ~ ~ ~ ~"
         
Buffer[i+1] = 0x7E;
         
EEPROM_Write(0x00+i0x2D);
         
EEPROM_Write(0x01+i0x7E);
      }
   } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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