Forum: Mikrocontroller und Digitale Elektronik PIC: int. EEProm läuft nur im Debug-Modus


von Master S. (snowman)


Angehängte Dateien:

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

von Gast (Gast)


Lesenswert?

Versuch mal ein paar Zeitschleifen, mit ins
Programm zu nehmen. Beim lesen und beim
schreiben auf den Chip.

von Master S. (snowman)


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 :-(

von Gast (Gast)


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.

von Master S. (snowman)


Lesenswert?

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.

von Pascal (Gast)


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

von Pascal (Gast)


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 */
}

von Master S. (snowman)


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).

von Pascal (Gast)


Lesenswert?

ja mach mal und gib dann feedback...

von Master S. (snowman)


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.

von Pascal (Gast)


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

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.