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 ---
Tout ce qui n'a pas de catégorie !
Programmation EEPROM
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 824
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#1 Message par Gérard » lun. 11 juin 2018 08:27 lien vers la Data-Sheet : Cliquez ici

Bonjour,

Je voudrais programmer une EEPROM. Le PICKit2 le permet (à priori), mais j'ai un doute. En mettant les données dans la fenêtre, puis "WRITE" tous se passe normalement. En cliquant sur "READ", je vois bien les données.
Je rebranche le PIC et la lecture me donne des FF sur l'afficheur LCD.
J'ai fais le test avec 2 EEPROM et c'est pareil.
Je suis sûr de l'adresse : %1010000x pour la mémoire, la patte R/W est à 0.
J'ai aussi fait un essai en écrivant directement avec le PIC et même résultat. Ca fait plusieurs heures sur 3 jours que je me casse la tête sur ce problème.

Que dois-je en conclure? Ma patience est mise à rude épreuve. :mur:
Merci pour vos idées.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Programmation EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1059
Âge : 68
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » lun. 11 juin 2018 13:13 lien vers la Data-Sheet : Cliquez ici

Gérard a écrit :Je voudrais programmer une EEPROM. ...


EEPROM I2C ?
reference ?

Adresse 0xA0 pour lecture
Adresse 0xA1 pour lecture
si les pin d'adresse sont à 0.
Pin WP Write protect ?
ecriture byte par Byte , ou par page ?

Programmation EEPROM
pspic
Débutant
Débutant
Messages : 30
Âge : 71
Enregistré en : septembre 2017
Localisation : 68

#3 Message par pspic » lun. 11 juin 2018 13:33 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Un exemple pour une Eeprom 24C02 : http://www.rlx.sk/mikroelektronika/eepr ... l_v100.pdf

Programmation EEPROM
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 824
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#4 Message par Gérard » lun. 11 juin 2018 14:26 lien vers la Data-Sheet : Cliquez ici

paulfjujo a écrit :
Gérard a écrit :Je voudrais programmer une EEPROM. ...


EEPROM I2C ?
reference ?

Adresse 0xA0 pour lecture
Adresse 0xA1 pour lecture
si les pin d'adresse sont à 0.
Pin WP Write protect ?
ecriture byte par Byte , ou par page ?


EEPROM I2C type 24LC128 (datasheet en lien)
Adresse %1010000x les 3 pin d'adresse sont à 0
Pin WP à 0
Ecriture par octet.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Programmation EEPROM
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 824
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#5 Message par Gérard » lun. 11 juin 2018 14:27 lien vers la Data-Sheet : Cliquez ici

pspic a écrit :Bonjour,
Un exemple pour une Eeprom 24C02 : http://www.rlx.sk/mikroelektronika/eepr ... l_v100.pdf


J'ai fait un essai d'écriture du PIC --> l'EEPROM sans résultat.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Programmation EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1059
Âge : 68
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#6 Message par paulfjujo » lun. 11 juin 2018 15:01 lien vers la Data-Sheet : Cliquez ici

l'exemple MikroC pôrte sue trop petite EEPROM , addesse sur 8 bits,
il faut une adresse sur 16 bits ou raisonner par page..
un exemple avec une 24FC1026 32Kbytes ( en C)
parties testées OK sur une appli compteur Velo appart.. 18F26K22

:!!: ATTENTION si il y a d'autres devices sur le BUS , l'adresse 0xA0 etant tres repandue ..
et les R de rappel 2,7K à 4,K sur SCL et SDA
il a fallu que je decale l'adresse 24FC1026 , car il ya une 24C32 sur mon module RTC DS1307

Code : Tout sélectionner



#define Eeprom_24FC1026  // 32 Kbytes
#define RTC_DS1307

#define DS1307_ADDR 0xD0 // RTC DS1307
#define EEPROM_4K_ADR 0xA0 // EEPROM 24LC32  sur le module RTC
#define EEPROM_128K_ADR 0xA8 // EEPROM 24FC1026  128Kbits 32Ko  Block=0  A1=0 A2=1


unsigned char  donnee;
unsigned int addr;
unsigned int Adr_24FC1026;
unsigned int  Adr_24C32;
unsigned int erreurs;
unsigned char err;
unsigned int NumPage, Idx;
static unsigned char Page_Eeprom[128];
unsigned char Device_Adresse;
unsigned char Bloc; 


// === Eeprom 32 Kbytes 24FC1026 --256Kbits
void Write_To_24FC1026(unsigned int Adr, unsigned char c);
unsigned char Read_From_24FC1026(unsigned int Adr);
void Write_Page_To_24FC1026(unsigned int Page);
void Read_Page_From_24FC1026(unsigned int Page);
void  Affiche_Page_Eeprom(void);

void Save_NumPage_24FC1026_To_PIC_Eeprom(void);
void Save_Date_Time_To_24FC1026(void);
void Restore_NumPage_24FC1026_From_PIC_Eeprom(void);
void Read_NumPage_From_24FC1026(unsigned int Page);
void Restore_Last_Cumul_Kms_From_PIC_Eeprom(void) ;


// ***************  24FC1026 ***********************
void Write_To_24FC1026(unsigned int Adr, unsigned char cx)
{
 Device_Adresse= EEPROM_128K_ADR+ Adr>>9;
I2C1_Is_Idle();
I2C1_Start();
err=I2C1_Wr(Device_Adresse );      // write
err=I2C1_Wr(hi(Adr));    // send data (data to be written)
err=I2C1_Wr(lo(Adr));
err=I2C1_Wr(cx);    // send data (data to be written)
I2C1_Stop();
I2C1_Is_Idle();
Delay_ms(5);  // was 10mS
}

unsigned char Read_From_24FC1026(unsigned int Adresse)
{
unsigned char c3;
Device_Adresse= EEPROM_128K_ADR;  // limite sur le 1er block  blocd=0
// Device_Adresse= EEPROM_128K_ADR+ Adresse>>9;
I2C1_Is_Idle();
 Delay_ms(1);
I2C1_Start();
err=I2C1_Wr(Device_Adresse );  // write
err=I2C1_Wr(hi(Adresse));    // send adress to be read)
err=I2C1_Wr(lo(Adresse));
I2C1_Is_Idle();
 Device_Adresse= EEPROM_128K_ADR + 1;
 // Device_Adresse= EEPROM_128K_ADR + 1 + Adresse>>9;
I2C1_Repeated_Start();
err=I2C1_Wr(Device_Adresse );  // Read
c3=I2C1_Rd(0u);    // data to be read)
I2C1_Stop();
I2C1_Is_Idle();
return c3;
}

void Write_Page_To_24FC1026(unsigned int Page)
{
 unsigned int Ad;
 unsigned char Is;
 if(GIE_bit) Is=1;
 GIE_bit=0;
 erreurs=0;
 Device_Adresse= EEPROM_128K_ADR ;//+ Page>>8;
 Ad=Page << 7;
 I2C1_Is_Idle();
 I2C1_Start();
 err=I2C1_Wr(Device_Adresse );      // write
 err=I2C1_Wr(hi(Ad));    // send data (data to be written)
 err=I2C1_Wr(lo(Ad));
 if (err>0) erreurs++;
 for (Ad=0;Ad<127;Ad++)
 {
 err=I2C1_Wr(Page_Eeprom[Ad]);    // send data (data to be written)
 if(err>0) erreurs++;
 }
 I2C1_Stop();
 I2C1_Is_Idle();
 if (Is==1)GIE_bit=1;
}

void Read_NumPage_From_24FC1026(unsigned int Page)
{
 unsigned int Ad;
 unsigned char AdreH,AdreL;
 unsigned char Is;
 if(GIE_bit) Is=1;
  GIE_bit=0;
 Ad=(Page << 7) ;
 AdreH=Hi(Ad);
 AdreL=Lo(Ad);
 Device_Adresse= EEPROM_128K_ADR; //+ Page>>8;
// debug
// UART1_Write_CText("AdrH= ");ByteToHex(AdreH,CRam1); UART1_Write_Text(CRam1);
// UART1_Write_CText(" AdrL= ");ByteToHex(AdreL,CRam1); UART1_Write_Text(CRam1);
// CRLF1();
 I2C1_Is_Idle();
 I2C1_Start();
 err=I2C1_Wr( Device_Adresse );  // write
 err=I2C1_Wr(hi(Ad));    // send data (data to be written)
 err=I2C1_Wr(lo(Ad));
 I2C1_Repeated_Start();
 err=I2C1_Wr( Device_Adresse+);  // Read
 I2C1_Is_Idle();
 for (Ad=0;Ad<127;Ad++)
 {
  Page_Eeprom[Ad]=I2C1_Rd(1u);    // data to be read)
 }
  Page_Eeprom[Ad]=I2C1_Rd(0u);    // data to be read)
 I2C1_Stop();
  I2C1_Is_Idle();
  if (Is==1)GIE_bit=1;
}

 void Save_Cumul_Kms_To_PIC_Eeprom(void)
 {
  unsigned char cx;
  cx=lo(Cumul_Kms);
  EEPROM_Write(0x03FA,cx);  Delay_ms(20);
   cx=hi(Cumul_Kms);
  EEPROM_Write(0x03FB,cx);  Delay_ms(20);
   cx=higher(Cumul_Kms);
  EEPROM_Write(0x03FC,cx);  Delay_ms(20);
   cx=highest(Cumul_Kms);
  EEPROM_Write(0x03FD,cx);  Delay_ms(20);
  sprintf(txt,"\r\n Sauve Cumul_Kms %5.1f dans EEPROM du PIC ,  0x03FA...0x03FD=LSB\r\n",Cumul_Kms);
  UART1_Write_Text(txt) ;
}



void Save_NumPage_24FC1026_To_PIC_Eeprom(void)
{
unsigned char cx;
  Idx=0;
  cx=(NumPage >> 8 );   // MSB
  EEPROM_Write(0x03FE,cx);  Delay_ms(20);
  cx=NumPage & 0x00FF; //LSB
  EEPROM_Write(0x03FF,cx);  Delay_ms(20);
  sprintf(txt,"\r\n Sauve Numpage % 3d dans EEPROM du PIC , at 0x03FE =MSB et 0x03FF=LSB\r\n",NumPage);
  UART1_Write_Text(txt) ;
}

 void Save_Date_Time_To_24FC1026(void)
 { int i;
   for (i=0;i<128;i++)Page_Eeprom[i]=0;
   Refresh_display_date_Time() ;
   Idx=0;
   UART1_Write_CText("\r\n Stockage horodatage\t");
   strncpy(Page_Eeprom+Idx,date,5); // JJ/MM  sauf AA
   Idx=5;
   Page_Eeprom[Idx]=';';
   Idx=6;    //HH:MM
   strncpy(Page_Eeprom+Idx,time,5);Idx=11;
   Page_Eeprom[Idx]=';';Idx=12; Page_Eeprom[12]=0;
   txt=TEXTE;
   sprintf(txt,"\r\n DateTime=  %s   next Idx Page_Eeprom = % 5d  \r\n",Page_Eeprom,Idx);
   UART1_Write_Text(txt);
}




void Restore_NumPage_24FC1026_From_PIC_Eeprom()
  {   int k;
       // recupere  indice 24FC1026 stocké dans les 2 derniers bytes de l'Eeprom du PIC
      Dummy= EEPROM_Read(0X03FE) ; // lecture a l'adresse adrL
      k=Dummy;
      Dummy=EEPROM_Read(0x03FF) ;
      NumPage=(<<8) + Dummy;
      if (NumPage==0xFFFF) NumPage=0;
      UART1_Write_CText( " NumPage 24FC1026 recupérée de L'EEPROM du PIC en 0x03FE et 0x3FF= ");
      txt=TEXTE;
      WordToStr( NumPage, txt);
      UART1_Write_Text(txt);
      CRLF1();
      Idx=0;   // on demarre sur un debut de page
   }

void Affiche_Page_Eeprom()
{
 int i;
 for (i=0;i<128;i++)
 {
  if (i%8==0)
  {
   CRLF1();
   WordToStr(i,txt);
   UART1_Write_Text(txt);   UART1_Write(TAB);
   }
   ByteToStr(Page_Eeprom[i],txt);
   UART1_Write_Text(txt);UART1_Write(TAB);
 }
}




void main(void)
{

......
 Adr=LCD_ADDR;
  I2C1_Init(400000);
  I2C1_Stop();
  I2C1_SetTimeoutCallback(1000, I2C1_TimeoutCallback);

  Read_Msg_Eeprom(0x50);
  Led_Rouge=0;

  LCD_init_4x20();
  LCD_Cmd(LCD_CLEAR);  // LCD Clear

 
  
// recupere Numpage   AVANT d'etre en mode interruption !
  Restore_NumPage_24FC1026_From_PIC_Eeprom() ; 
.....
  Affiche_Time(1);
   Save_Date_Time_To_24FC1026() ;
   ....
     sprintf(txt,"ECRITURE 24FC1026 PAGE= % 5d\r\n",NumPage);
   UART2_Write_Text(txt);
   // next numpage
   NumPage=NumPage+1;
   Save_NumPage_24FC1026_To_PIC_Eeprom() ;
   Save_Cumul_Kms_To_PIC_Eeprom() ;
   ....
     p1=strstr(Buffer1,"RELECT");
     if(p1>0)
     {
        UART1_Write_CText("\r\nRelecture 24FC1026 :");CRLF1();
        for (i=0;i<NumPage;i++)
        {   k=i;
            Read_NumPage_From_24FC1026(k);
            UART1_Write_Text(Page_Eeprom);
        }
        CRLF1();
      }
   



Programmation EEPROM
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 824
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#7 Message par Gérard » lun. 11 juin 2018 22:36 lien vers la Data-Sheet : Cliquez ici

Merci Paul pour ton aide et ton dévouement.
L'ennui pour moi, c'est que le C, c'est presque du chinois et quand je regarde ton programme, je me dis que je ne t'arrive pas à la cheville. Je suis bien loin de pouvoir faire ce que tu fais.
Ceci dit, j'ai résolu mon problème. Je ne savais pas qu'il faut donner l'adresse qu'on veut lire sur 2 octets même si c'est en début de mémoire.
J'utilise Proton+ comme compilateur, pour lire et écrire, il existe plusieurs façons et je n'employais pas la bonne.
J'ai fait mon boulet ...
Je voulais déjà acheter un PIC avec beaucoup de mémoire pour caser toutes les données. J'avais pensé à un 18F27J13 ou 27J53. Quelqu'un connait ces bestioles?

Ce soir je vais pouvoir aller tranquillement poser ma tête sur l'oreiller.

Bonne nuit à tout le monde.

Et vive le Basic ... dehors!!
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Programmation EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1059
Âge : 68
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#8 Message par paulfjujo » mar. 12 juin 2018 11:03 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,


Gérard a écrit : J'avais pensé à un 18F27J13 ou 27J53. Quelqu'un connait ces bestioles?
...


:sifflotte: Meme écrit en C, on peut toujours y voir par "transparence" ou "instinct" de l'ASM ou du BASIC

:+1: C'est une bete de course !
j'ai la version Clicker2 PIC18F47J53 , un vrai regal ..
attention 3,3V !
le Clicker PIC18F87J50 n'est pas mal non plus ..

Programmation EEPROM
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 824
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#9 Message par Gérard » mar. 12 juin 2018 13:26 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,
Je n'avais pas noté que ce PIC n'admet que du 3,3V.
Concernant la mémoire de programme, il me semble qu'elle fait 16 de large, est-il possible de mettre 2 octets de données à la suite?
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Programmation EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1059
Âge : 68
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#10 Message par paulfjujo » mar. 12 juin 2018 14:12 lien vers la Data-Sheet : Cliquez ici

On ne stocke , à priori, qu'un seul Byte par adresse en memoire programme
j'ai verifié sur mon appli avec ecran OLED
entre la declaration Source C et le listing obenu

source C

Code : Tout sélectionner

const  unsigned char font_regular_6x8[92][6] =
{
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // sp
    0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,   // !
    0x00, 0x00, 0x07, 0x00, 0x07, 0x00,   // "
    0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,   // #
    0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,   // $
    0x00, 0x62, 0x64, 0x08, 0x13, 0x23,   // %
    0x00, 0x36, 0x49, 0x55, 0x22, 0x50,   // &
    0x00, 0x00, 0x05, 0x03, 0x00, 0x00,   // '
    0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,   // (
    0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,   // )
    0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,   // *
    0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,   // +
    0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,   // ,
    0x00, 0x08, 0x08, 0x08, 0x08, 0x08,   // -
...etc ... 


Listing :

Code : Tout sélectionner

;OLED_I2C2_161214.c,:: _font_regular_6x8
0x2DB1        0x0000 
;_font_regular_6x8+0
0x2DB3        0x0000 
;_font_regular_6x8+2
0x2DB5        0x0000 
;_font_regular_6x8+4
0x2DB7        0x0000 
;_font_regular_6x8+6
0x2DB9        0x2F00 
;_font_regular_6x8+8
0x2DBB        0x0000 
;_font_regular_6x8+10
0x2DBD        0x0000 
;_font_regular_6x8+12
0x2DBF        0x0007 
;_font_regular_6x8+14
0x2DC1        0x0007 
;_font_regular_6x8+16
0x2DC3        0x1400 
;_font_regular_6x8+18
0x2DC5        0x147F 
;_font_regular_6x8+20
0x2DC7        0x147F 
;_font_regular_6x8+22
0x2DC9        0x2400 
;_font_regular_6x8+24
..etc 


donc 1 seul Byte par adresse ..
sans doute parce que c'est un MCU 8 bits ...
et le reliquat de l'adressage sur 14 bits + PCLATH


comme en RAM d'ailleur

Code : Tout sélectionner


unsigned char BMP1
[] =    // 1024 bytes
{
        0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0,0x00,0xF0,0x00,0xF8,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0xFF,0x11,0xAA,0x44,0x00,0x00,0x00,
        ... etc 
        64 lignes de 16 bytes
}


adresse BMP1 2396

Code : Tout sélectionner

;OLED_I2C2_161214.c,:: ?ICS_BMP1
0x2396        0x0300 
;?ICS_BMP1+0
0x2398        0x0905 
;?ICS_BMP1+2
0x239A        0xFF11 
;?ICS_BMP1+4
0x239C        0x8911 
;?ICS_BMP1+6
0x239E        0xC305 
;?ICS_BMP1+8
0x23A0        0xE000 
;?ICS_BMP1+10


Retourner vers « Coin Fourre-tout »

Qui est en ligne

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