PIC: int. EEProm läuft nur im Debug-Modus

OP #1212005
Lesenswert?

hallo

ich habe schon in einem anderen forum gefragt, doch bekam ich keine 
antwort - vielleicht hier? nun, ich bin daran ein programm zu schreiben. 
darin schreibe ich werte ins interne EEProm des PIC18F2420 und lese 
diese auch wieder raus. ich benutze MPLAB mit C18 und einen ICD3.
Wenn ich nun das programm im debug-modus brenne und in diesem modus 
laufen lasse, so funktioniert alles einwandfrei. wenn ich aber das 
programm im release-modus brenne funktioniert das programm bis auf die 
schreib- und lese-zugriffe aufs EEProm (das register EEDATA wird 
beschrieben oder gelesen, aber von diesem register werden die daten 
jeweils irgendwie nicht ins interene EEProm geschrieben oder von dort 
ins EEDATA geschrieben). das eigenartige ist, dass es im debug-modus 
läuft und im release-modus dann nicht...

ich habe schon viel zeit beim suchen des problems verbraten, und komme 
einfach nicht auf den grund. hat jemand das problem auch schon gehabt? 
lösung? vielen dank für hilfe
Angehängte Dateien:
OP #1212018
Lesenswert?

ja, die idee hatte ich auch schon. laut datenblatt, sollte beim 
schreiben ein status abgewartet und erst dann das nächste byte 
geschrieben werden: Microchip schlägt dies mit 'while (!PIR2bits.EEIF)' 
vor und selbst mit der entsprechenden status-bit-abfrage (so wie im 
datenblatt beschrieben), änder dies nichts. beim lesen sollte es keine 
zeit-probleme geben. beschreibe ich einmal das EEDATA, so liefern alle 
lese-operationen (mit der angehängten funktion) genau die selben 
ergebnisse, nämlich das, was gerade im EEDATA steht. z.b. schreibe ich 
0x05 mit der angehängten funktion ins EEProm, werden einerseits die dort 
nie gespeichert und wenn ich nachher z.b. 10x aus unterschiedlichen 
EE-speicherzellen lese, so liefern alle lesevorgänge eben genau wieder 
diese 0x05 :-(
Gast #1212062
Lesenswert?

Sorry, habe leider keine 18er da, arbeite
mit der 16er Reihe. Sonst könnte ich es mal testen,
wo der Fehler liegt. Kannste mit dem Programmiergerät
direkt ins EEprom schreiben ? Wenn ja mal ausprobieren
ob das geht. Sonst weis ich auch nichts.
Gast #1212136
Lesenswert?

Ich schreibe problemlos auf einen 4580er, vielleicht liegts an den 
config bits:
/***********************************/
/*** data eeprom code protection ***/
/***********************************/

#pragma config CPD = OFF

/************************************/
/*** data eeprom write protection ***/
/************************************/

#pragma config WRTD = OFF


Im Debug-Mode sind einige configs ja für debug (aus)geschaltet, z.B. 
watchdog. Probier doch mal die beiden Pragmas zum Schreiben der C-Bits.

Grüße
Gast #1212143
Lesenswert?

Hier übrigens meine Routine (habe deine nicht angeschaut):

void Eeprom_write(uint8 adress, uint8 data)
{
  ClrWdt();               /* clear the watchdog timer */

  EEADR = adress;         /* set adress of eeprom */
  EEDATA = data;          /* move data to SFR */
  EECON1bits.EEPGD = 0;   /* data memory selected */
  EECON1bits.CFGS = 0;    /* access eeprom */
  EECON1bits.WREN = 1;    /* enable writing */

  RCONbits.IPEN = 0;
  INTCONbits.GIEH = 0;    /* disable all IR */
  INTCONbits.GIEH = 0;

  EECON2 = 0x55;          /* required routine of uC */
  EECON2 = 0xAA;          /* required routine of uC */
  EECON1bits.WR = 1;      /* start writing */

  while(!PIR2bits.EEIF);  /* still writing */
  PIR2bits.EEIF = 0;      /* clear EE IR flag */
  EECON1bits.WREN = 0;    /* disable writing */

  ISR_init();    /        /* enable all IR */
}
OP #1212164
Lesenswert?

@Pascal: danke, werde ich mal ausprobieren, wenn auch ich denke, dass 
wenn ich das lesen/schreiben nicht axplizit deaktive, so sollt's doch 
eigentlich nicht 'protected' sein. ich probier's mal aus.

in deinem code sehe ich hauptsächlich nur zusätzlich 'EECON1bits.CFGS = 
0' mehr, mal sehen, vielleicht brint's das.

vielen dank für den input, ich werde es heute abend testen (bin zur zeit 
@work).
OP #1213252
Lesenswert?

EECON1bits.CFGS = 0
das war die lösung. ich neheme an, dass der ICD3 hier noch einen bug hat 
und dieses flag nicht zurücksetzt nach dem programmieren. wenn ich 
dieses zu beginn meines programs aufrufe (in der init), dann 
funktioniert das lesen/schreiben des internen EEProms. vielen dank für 
deinen code, so dass ich das rausfinden konnte.
Gast #1215871
Lesenswert?

ja super,
ich hab auch nochmal im DB nachgeschaut und die Bits EEPGD und CFGS sind 
nach POR oder BOR unknown, d.h. du solltest sie auf jeden Fall der 
Anwendung entsprechend setzen oder löschen...

Grüße

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