mikrocontroller.net

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


Autor: Master Snowman (snowman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */
}

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja mach mal und gib dann feedback...

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.