Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Lecture et ecriture dans eeprom 24c02



  1. #1
    joss

    Lecture et ecriture dans eeprom 24c02


    ------

    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.

    -----

  2. #2
    umfred

    Re : Lecture et ecriture dans eeprom 24c02

    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"

  3. #3
    joss

    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.

Discussions similaires

  1. probleme lecture mémoire EEPROM M952256
    Par smartise73 dans le forum Électronique
    Réponses: 1
    Dernier message: 23/07/2007, 15h17
  2. ecriture et lecture eeprom
    Par traxxa dans le forum Électronique
    Réponses: 2
    Dernier message: 21/03/2007, 10h22
  3. Opépration de lecture/écriture dans une SRAM
    Par preston dans le forum Électronique
    Réponses: 1
    Dernier message: 11/02/2007, 19h36
  4. Accès en lecture EEPROM
    Par Toufinet dans le forum Électronique
    Réponses: 16
    Dernier message: 01/12/2006, 21h10
  5. Ecriture dans EEPROM 24LC16
    Par gimmy dans le forum Électronique
    Réponses: 3
    Dernier message: 06/09/2005, 22h19
Découvrez nos comparatifs produits sur l'informatique et les technologies.