PIC EEPROM schreiben/lesen

Gast #549780
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
Gast #553920
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.
#553966
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);
Gast #554033
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
Gast #554137
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
Gast #2456760
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren