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

OP #1212005
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
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
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.
OP
ja, beim programmieren, kann ich ins EE schreiben (kann jeder brenner: 
einfach adresse und daten definieren, dann wirds auch gebrannt), nur 
sollte das programm die werte auch auslesen und ggf. neu beschreiben 
können. tut es aber nur wenn's im debug-modus läuft.
Gast
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
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
@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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.