Forum: Mikrocontroller und Digitale Elektronik PIC EEPROM schreiben/lesen


von Olli (Gast)


Lesenswert?

Hi Leute,

will bei meinem PIC18F458 das EEPROM beschreiben und lesen. Hab dazu 
folgende Funktionen im Internet gefunden:

unsigned char eeprom_read(unsigned char uint8_adress)
{
    while (EECON1bits.WR);         // Wait if READ/WRITE/.....
    EECON1bits.EEPGD = 0;          // Select EEPROM Memory
    EECON1bits.CFGS = 0;    // Select Memory - not Config_Word
    EEADR = uint8_adress;      // Select EEPROM Cell
    EECON1bits.RD = 1;             // Start Reading

    return EEDATA;       // Return Cell_Value
}

void eeprom_write(unsigned char uint8_adress, unsigned char uint8_data)
{
    unsigned char uint8_gieh_backup;
    unsigned char uint8_giel_backup;

    while (EECON1bits.WR);           // Wait if READ/WRITE/.....

    EECON1bits.EEPGD = 0;            // Select EEPROM Memory
    EECON1bits.CFGS = 0;      // Select Memory - not Config_Word
    EEADR = uint8_adress;        // Select EEPROM Cell
    EEDATA = uint8_data;

    uint8_gieh_backup = INTCONbits.GIEH;
    uint8_giel_backup = INTCONbits.GIEL;

    INTCONbits.GIEH = 0;             // Disable Interrupts
    INTCONbits.GIEL = 0;

    EECON1bits.WREN = 1;                // Authorize EEPROM_writing
    EECON2 = 0x55;
    EECON2 = 0xaa;
    EECON1bits.WR = 1;                  // Start EEPROM_writing
    EECON1bits.WREN = 0;                // Deactivate EEPROM_writing

    INTCONbits.GIEH = uint8_gieh_backup;
    INTCONbits.GIEL = uint8_giel_backup;
}

Wenn ich meinen PIC starte, die Funktionen ausführe und danach mit 
picKit2 das eeprom auslese, steht leider nix drin.

Wollte fragen, ob hier ein PIC-Kenner schonmal was ins EEPROM 
geschrieben hat. Wenn ja, sind meine FUnktionen falsch oder muss ich 
sonst noch irgendwas beachten?

Wie lange dauert so ein Schreibvorgang?


Gruß Olli

von Olli (Gast)


Lesenswert?

HHhhhmmmmm - ich habs immer noch nich raus und leider keinen 
Ansprechpartner.

Könnt ihr mir helfen?

von tastendrücker (Gast)


Lesenswert?

>Wie lange dauert so ein Schreibvorgang?

Steht bestimmt im Datenblatt, z. B. auf Seite 61:

At the completion of the write cycle, the WR bit is
cleared in hardware and the EEPROM Write Complete
Interrupt Flag bit (EEIF) is set. The user may either
enable this interrupt or roll this bit. EEIF must be
cleared by software.

von Heiko H. (daheik)


Lesenswert?

OK, die Schreibdauer könnte ich mir also berechnen bzw. ausgeben lassen.
Mein Problem ist aber ja, dass das EEPROM schreiben gar nicht 
funktioniert.

Hat mir da jmd mit Erfahrung einen Tip?

von Der M. (steinadler)


Lesenswert?

>     EECON1bits.WREN = 1;                // Authorize EEPROM_writing
>     EECON2 = 0x55;
>     EECON2 = 0xaa;
>     EECON1bits.WR = 1;                  // Start EEPROM_writing
>     EECON1bits.WREN = 0;                // Deactivate EEPROM_writing
>
>     INTCONbits.GIEH = uint8_gieh_backup;
>     INTCONbits.GIEL = uint8_giel_backup;

Das könnte unter Umständen daran liegen, dass du den Schreibvorgang 
startest und dann gleich das WREN-Bit zurücksetzt.
Besser ist, wenn du an dieser Stelle erst wartest, bis der 
Schreibvorgang abgeschlossen ist, also
1
while(!PIR2bits.EEIF);

von Gerhard (Gast)


Lesenswert?

Hallo Olli

ich denke, dass das so gar nicht geht.

EECON1bits.WREN = 1;                // Authorize EEPROM_writing
>     EECON2 = 0x55;
>     EECON2 = 0xaa;
>     EECON1bits.WR = 1;

Beim Schreiben auf das EECON2 register muss in bestimmtesTiming 
eingehalten werden, das beim Programmieren unter C nicht funktioniert. 
Ich hab das schon mal dür einen PIC30 versucht und bin gescheitert. Aber 
es gibt dafür - zumindest beim PIC30 - ne Assemblerfunktion, wo das dann 
umgesetzt wird. Ich weiss nicht mit welchem Compiler du arbitest, aber 
evtl ist da ja was dabei.


Gerhard

von Gerhard (Gast)


Lesenswert?

Hallo Olli

in meinem C18-Compiler-Verzeichnis hab ich ein Beispiel gefunden. Also, 
es sollte doch in C funktionieren. Das ist ein Ausschnitt:

button (void)
{


  /*
   * Store the new direction in EEDATA.
   * Note that since we are already
   * in the high priority interrupt, we do
   * not need to explicitly enable/disable
   * interrupts around the write cycle
   */
  EECON1bits.EEPGD = 0;  /* WRITE step #1 */
  EECON1bits.WREN = 1;   /* WRITE step #2 */
  EEADR = 0;             /* WRITE step #3 */
  EEDATA = direction;    /* WRITE step #4 */
  EECON2 = 0x55;         /* WRITE step #5 */
  EECON2 = 0xaa;         /* WRITE step #6 */
  EECON1bits.WR = 1;     /* WRITE step #7 */
  while (!PIR2bits.EEIF) /* WRITE step #8 */
    ;
  PIR2bits.EEIF = 0;     /* WRITE step #9 */

  /* clear the interrupt flag */
  INTCONbits.INT0IF = 0;
}

Gerhard

von soso (Gast)


Lesenswert?

hi,

du kannst nicht eeprom daten aulesen und wieder überschreiben. Das ist 
so zusagen ein  sicherheit. Wenn das möglich wäre hättest du vielles 
anstellen könne.  Also es ist nicht möglich. sogar wenn du dass EEPROM 
mit nicht protected brennst liest pick kit drei immer null.

soso

mfg

von usuru (Gast)


Lesenswert?

> Wie lange dauert so ein Schreibvorgang?

Das Datenblatt sagt auf S. 339: typ. 4 msec, das passt auch zu den 
üblichen externen EEPROMS, da sind es auch meist 3-5 msec

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.