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
Versuch mal ein paar Zeitschleifen, mit ins Programm zu nehmen. Beim lesen und beim schreiben auf den Chip.
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 :-(
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.
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.
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
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 */ }
@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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.