int. EEPROM

Gast #57904
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
Angehängte Dateien:
Gast #57905
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;
}
Gast #57906
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
Gast #57907
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
Gast #57909
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
Gast #57910
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

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