Forum: Mikrocontroller und Digitale Elektronik int. EEPROM


von Wolfram Hildebrandt (Gast)


Angehängte Dateien:

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

von Geri (Gast)


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;
}

von Dieter Werner (Gast)


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

von Geri (Gast)


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

von Geri (Gast)


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

von Dieter Werner (Gast)


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

von Geri (Gast)


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

von Geri (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt hat es mir gerade das Attachment rausgeschmissen

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.