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 ---
Programmation EEPROM
- Gérard
Expert- Messages : 1644
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
Merci pour vos idées.
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.
Merci pour vos idées.
Programmation EEPROM
Programmation EEPROM
Bonjour,
Un exemple pour une Eeprom 24C02 : http://www.rlx.sk/mikroelektronika/eepr ... l_v100.pdf
Un exemple pour une Eeprom 24C02 : http://www.rlx.sk/mikroelektronika/eepr ... l_v100.pdf
Programmation EEPROM
- Gérard
Expert- Messages : 1644
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
Programmation EEPROM
- Gérard
Expert- Messages : 1644
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
Programmation EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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+1 ); // 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=(k <<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
Expert- Messages : 1644
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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 ...
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 ...
Programmation EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à tous,
Meme écrit en C, on peut toujours y voir par "transparence" ou "instinct" de l'ASM ou du BASIC
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 ..
Gérard a écrit : J'avais pensé à un 18F27J13 ou 27J53. Quelqu'un connait ces bestioles?
...
Meme écrit en C, on peut toujours y voir par "transparence" ou "instinct" de l'ASM ou du BASIC
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
Programmation EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Listing :
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
adresse BMP1 2396
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,6 :: _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,0 :: ?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 48 invités