mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik int. EEPROM


Autor: Wolfram Hildebrandt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe hier ein Problem bei eigentlich einer Kleinigkeit.
Ich will in das interne EEPROM des PIC18F252 schreiben.
Im Anhang ist ein Codeschnipsel dazu.
In der Simulation läuft alles so, wie es soll. An Adresse 5 im internen
EEPROM wird der Wert 5 (dezimal) abgelegt.
Danach wird er nach etwas warten sofort wieder ausgelesen. Ich erhalte
bei jeder EEPROM-Adresse aber immer den Wert Null.
Ich verwende einen standard-tait-brenner und spruts pic18 software
(www.sprut.de).

-Ist der Codeschnipsel funktionsfähig?
-Muss ich den Fehler in der Hardware suchen, da ja die Simulation
funktioniert? evtl. in Config-Bytes?
-Wie würde die Config-Zeile im Quellcode lauten, die das schreiben auf
das int. EEPROM erlaubt?


mfg   Wolfram Hildebrandt

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Geht mir gleich. Kennt von Euch vielleicht jemand das Problem?  Anbei
der Code zum Lesen und Schreiben auf einen PIC18F452.
Beim Lesen erhält man aus jeder Speicherzellen den letzen Wert - hier
3


void main(void)
{
..
  eeprom_write  (0,1);
  eeprom_write  (1,2);
  eeprom_write  (2,3);
  eeprom_write  (3,4);
  eeprom_write  (4,5);

  Data = my_eeprom_read(0x00); // liefert den Wert 5
...
  Data = my_eeprom_read(0x01); // liefert den Wert 5
...
}

Beste Grüsse und vielen Dank für Eure Hinweise

Geri


void eeprom_write(unsigned char addr, unsigned char value)
{
  char giel_temp;
  char gieh_temp;

  EECON1bits.EEPGD=0; //write to EEPROM, not data memory
  if (INTCONbits.GIEH) {INTCONbits.GIEH = 0; gieh_temp = 1;}
  if (INTCONbits.GIEL) {INTCONbits.GIEL = 0; giel_temp = 1;}

  EEADR=(unsigned char)(addr);
  EEDATA=(unsigned char)(value);

  EECON1bits.WREN=1;  //enable writes
  EECON2=0x55;
  EECON2=0xAA;
  EECON1bits.WR=1;
  while (EECON1bits.WR!=0)
  {
    //do nothing - wait WR to be cleared in hardware
  }
  if (gieh_temp != 0)  INTCONbits.GIEH=1; //restore GIE
  if (giel_temp != 0)  INTCONbits.GIEL=1;      EECON1bits.WREN=1; 
//enable
writes
}

unsigned char eeprom_read(unsigned char addr)
{
  EECON1bits.EEPGD=0;
  EEADR=(unsigned char)addr;
  EECON1bits.RD=1;
  return (unsigned char)EEDATA;
}

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht EECON1bits.CFGS nicht auf Null ?
Ansonsten sieht das identisch mit meinen (Assembler-) Schreib und
Leseroutinen aus.
Nur gebe ich die INTs vor der Warteschleife
while (EECON1bits.WR!=0)
wieder frei.


Dieter

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dieter

Vielen Dank für Deine Rückmeldung und die Hinweise. Habe

Habe nun mit
...
    EEDATA = _data;
    EEADR = address;
    // start write sequence as described in datasheet, page 91
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EECON1bits.WREN = 1; // enable writes to data EEPROM
...

geht auch nicht??

Die Abbrage von:
 if(EECON1bits.WRERR){
        printf("ERROR: writing to EEPROM failed!\n");
    }

liefert auch keinen Fehler

Beste Grüsse
Geri

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja,

ich habe es gerade mir dem ICD2 geprüft. Die Schreibroutine
funktioniert. Die Daten stehen im EEPROM

Irgendwie muss beim Lesen demnach etwas faul sein.

Beste Grüsse

Geri

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ältere 18F242, 442, 252 und 452 - so ca. bis Ende 2003 - hatten mal
Schwierigkeiten beim Lesen des EEPROM:

Auszug aus dem errata sheet, microchip doc Nr. DS80150C

Module: Data EEPROM
When reading the data EEPROM, the contents of
the EEDATA register may become corrupted in the
second instruction cycle after the RD bit
(EECON1<0>) is set. The actual contents of the
EEPROM remains unaffected.
Work around
To ensure the integrity of the contents of EEDATA,
the register must be read in the instruction immediately
following the setting of the RD bit. Use the
MOVF or MOVFF instructions to do this (see
Example 1).
Additionally, all interrupts must be disabled prior to
the read instruction sequence. Interruptions of the
sequence may have the same result of altering the
contents of EEDATA.

Example 1
BCF   INTCON,GIEH ;disable interrupts if using interrupts
BSF   EECON1,RD ;start the read operation
MOVF  EEDATA,W ;move the data out of EEDATA
BSF   INTCON,GIEH ;enable interrupts if using interrupts

Dieter

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dieter

Super!! Vielen Dank, dass du dir die Mühe gemacht hast die Passage
herauszusuchen! Ja, lesen bildet halt:)

Nun habe ich noch ein weiteres sehr dubioses Problem - ersichtlich im
beigefügten Beispiel. Entweder ich habe heute einen schlechten Tag oder
der Compiler.

Beste Grüsse

Geri

gcoolfire@yahoo.de

Autor: Geri (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hat es mir gerade das Attachment rausgeschmissen

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.