mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC EEPROM schreiben/lesen


Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HHhhhmmmmm - ich habs immer noch nich raus und leider keinen 
Ansprechpartner.

Könnt ihr mir helfen?

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heiko Hanickel (daheik)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht 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
while(!PIR2bits.EEIF);

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: soso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.