Je suis actuellement en train d'effectuer pas mal de test avec un pic 16f876a et un modile eeprom 24c02.
Pas de probléme pour lire et ecrire dans l'eeprom.
La ou ca se complique et que je veux effectué plusieur enregistrement dans l'eeprom comme je l'ai deja expliqué dans un autre poste qui porté sur la capacité de l'eeprom du type :
DATE : JJ/MM/AA
HEURE : HH/MM
CODE : xxxxxx
Voici ma question, comment faire pour que les enregistrement ne s'ecrase pas au fur et a mesure qu'ils sont validés.
J'aimerais pouvoir recupérer dans mon eeprom au format texte si possible les infos comme ceci:
DATE : JJ/MM/AA
HEURE : HH/MM
CODE : xxxxxx
DATE : JJ/MM/AA
HEURE : HH/MM
CODE : xxxxxx
etc etc
Voici le code que j'utilise actuellement qui est sur la base du code fournie avec le module eeprom de la station easypic 3.
Code:
program I2c_Eeprom
include "Eeprom_24c02.pbas"
dim someText as string[20]
dim someData as char[20]
dim otherData as char[20]
dim ii as byte
dim tmpData as char
sub procedure delay2S
delay_ms(2000)
end sub
main:
EEPROM_24C02_Init
Glcd_Init(PORTB, 2, 3, 4, 5, 7, 6, PORTD)
Glcd_Fill(0x00)
someData = "123456789"
'Example for single-byte write
ii = 0
tmpData = 2
while tmpData <> 0
tmpData = someData[ii]
Inc(ii)
EEPROM_24C02_WrSingle(ii, tmpdata)
Glcd_Set_Font(@FontSystem5x8, 5, 8, 32)
Glcd_Write_Char(tmpData, 5, 8, 1)
wend
' Example for single-byte read
ii = 1
tmpData = 2
' Example for sequential data read
EEPROM_24C02_RdSeq(1, otherData, 20)
Glcd_Set_Font(@FontSystem5x8, 5, 12, 32)
Glcd_Write_Text(otherData, 5, 12, 1)
end.
Code:
module Eeprom_24c02
' EEPROM 24C02 read/write library
implements
'--------------- Performs 24C02 Init
sub procedure EEPROM_24C02_Init
I2C_Init(100000)
end sub
'--------------- Writes data to 24C02 EEPROM - signle location
sub procedure EEPROM_24C02_WrSingle(dim wAddr as byte, dim wData as byte)
I2C_start ' issue I2C start signal
I2C_Wr($A2) ' send byte via I2C (command to 24cO2)
I2C_Wr(wAddr) ' send byte (address of EEPROM location)
I2C_Wr(wData) ' send data (data to be written)
I2C_Stop
end sub
'--------------- Reads data from 24C02 EEPROM - single location (random)
sub function EEPROM_24C02_RdSingle(dim rAddr as byte) as byte
I2C_Start ' issue I2C start signal
I2C_Wr($A2) ' send byte via I2C (device address + W)
I2C_Wr(rAddr) ' send byte (data address)
I2C_Repeated_Start ' issue I2C signal repeated start
I2C_Wr($A3) ' send byte (device address + R)
result = I2C_Rd(0) ' Read the data (NO acknowledge)
while I2C_Is_Idle
asm
NOP ' Wait for the read cycle to finish
end asm
wend
I2C_Stop
end sub
'--------------- Reads data from 24C02 EEPROM - sequential read
sub procedure EEPROM_24C02_RdSeq(dim rAddr as byte,
dim byref rdData as char[20],
dim rLen as byte)
dim i as byte
I2C_Start ' issue I2C start signal
I2C_Wr($A2) ' send byte via I2C (device address + W)
I2C_Wr(rAddr) ' send byte (address of EEPROM location)
I2C_Repeated_Start ' issue I2C signal repeated start
I2C_Wr($A3) ' send byte (device address + R)
i = 0
while i < rLen
rdData[i] = I2C_Rd(1) ' read data (YES acknowledge)
Delay_ms(20)
Inc(i)
wend
rdData[i] = I2C_Rd(0) ' last data is read WITH ack
I2C_Stop
end sub
end.
Si j'ai bien compris, tu veux ne pas écraser les données enregistrées dans ton eeprom, même si ton circuit est mis hors tension puis sous tension ensuite?
Dans ce cas, il faut enregistrer régulièrment dans l'eeprom du PIC, l'adresse actuelle (ou suivante) d'écriture dans l'eeproom 24c02. la marche à suivre pour écrire et lire dans l'eeprom du PIC est écrite dans la datasheet du PIC.
Il faut bien sur aller lire cette adresse à chaque démarrage du PIC, avant de vouloir écrire dans la 24C02.
De même, il faut utiliser cette adresse (qui doit être incrémenté du nombre de données enregistrées à chaque passage dans le programme d'écriture.
NB: il n'est possible d'envoyer que 16 octets à la suite dans l'eeprom par I2C (page write), ceux ci devant être successif et débuter à une adresse modulo 16 (0x00, 0x10, 0x20, ....) sinon il y a écrasement ou enregistrement incohérent.
Dans ton cas, un enregistrement de données en caractères ASCII (ou texte) a juste besoin de 16 octets (6 pour la date, 6 pour l'heure (hhmmss) et 6 pour le code), les informations DATE, HEURE, et CODE non pas besoin d'être enregistrer car :
de 0xY0 à 0xY5, on a la date,
de 0xY6 à 0xYB, on a l'heure,
de 0xYC à 0xYF, on a le code.
(Y peut éventuellement servir à indiquer le numéro d'enregistrement).
PS: avec une 24c02, et ce format d'enregistrement, tu as la possibilité de mémoriser au maximun 128 blocs "DATE-HEURE-CODE"
29/06/2006 - 19h32
joss
Date d'inscription
mars 2005
Localisation
Ajaccio
Messages
132
Re : Lecture et ecriture dans eeprom 24c02
Merci pour ton aide c'est sympa d'avoir de l'aide surtout au debut.
Je compte travailler avec un 24c512 mais le module de la station easypic 3 et a base de 24c02 (je pense qu'il n'y a aucune modif a faire en remplacant l'eeprom vu les datasheets identiques).
J'ai longtemps hésité a enregistrer sur une carte mmc ou sd mais le module et beaucoup plus grand et il faut au final que ca rentre dans ma centrale d'alarme.
Pense tu que l'ecriture des données sur carte mmc ou sd soit beaucoup plus compliqué a metre en oeuvre ???
Peux tu me conseiller, quel mode choisirez tu ??
Merci d'avance.