Forum: Mikrocontroller und Digitale Elektronik PIC18F26K80 EEPROM erhalten bei erneutem Flashen


von Marcel W. (macew)


Lesenswert?

Hallo,
es gibt schon einen ältern Beitrag zu diesem Thema 
(Beitrag "MPLAB X und EEPROM Problem"), aber ich erlebe das 
gleiche Problem:
Ich möchte im EEPROM Variablen speichern und beim erneuten Flashen des 
MCUs den vorher gespeicherten Wert auslesen. Ich verwende einen 
PIC18F26K80 und das MPLAB X v3.55, als Programmer verwende ich das 
PICkit3.

Im MPLAB kann man unter Project Properties -> PICkit3
folgende Einstellungen vornehmen, die den EEPROM Speicher erhalten 
sollte:

->Manually select memories and ranges
   -> Häkchen bei EEPROM
   -> Häkchen bei Preserve EEPROM
   -> EEPROM Preserve Range: 0 - 3FD (kompletter Speicher)

Die Stromversorgung des PIC übernimmt eine externe Spannungsquelle.

Das Häkchen unter
Program Options
-> Erase all before program

muss gesetzt werden, damit das Flashen funktioniert. Soweit so gut.

Mit folgendem Testprogramm schreibe ich jetzt was in das EEPROM:
1
void main(void)
2
{
3
    UART_init();
4
    
5
    unsigned char string[20];
6
7
// ****************
8
//     MARKER1
9
// ****************
10
    EEADRHbits.EEADRH = 0x00;
11
    EEADRbits.EEADR = 0x00;
12
    
13
    // write bytes to EEPROM
14
    EECON1bits.EEPGD = 0;       // access EEPROM
15
    EECON1bits.CFGS = 0;        // access EEPROM/program memory and NOT configuration registers
16
    EECON1bits.WREN = 1;        // allow writing to EEPROM
17
    EEDATAbits.EEDATA = 0xBA;
18
19
    INTCONbits.GIE = 0;         // disable interrupts    
20
    // fixed write procedure EEPROM    
21
    asm("MOVLW 55h");
22
    asm("MOVWF EECON2");
23
    asm("MOVLW 0AAh");
24
    asm("MOVWF EECON2");
25
    EECON1bits.WR = 1;          // initiate EEPROM write
26
    while(EECON1bits.WR);
27
    
28
    INTCONbits.GIE = 1;
29
    
30
    __delay_ms(1000);
31
32
// ****************
33
//     MARKER2
34
// ****************
35
36
    // read bytes from EEPROM
37
    unsigned char dummy = 0x00;
38
    
39
    EEADRHbits.EEADRH = 0x00;
40
    EEADRbits.EEADR = 0x00;
41
    
42
    EECON1bits.EEPGD = 0;       // access EEPROM
43
    EECON1bits.CFGS =  0;       // access EEPROM/program memory and NOT configuration registers  
44
    EECON1bits.RD = 1;          // initiate EEPROM read
45
    asm("NOP");
46
    dummy = EEDATA;
47
    
48
    writeString("test \t");
49
    sprintf(string, "%02X",dummy);
50
    writeString(string);
51
    writeString("\r\n");
52
53
    while(1);
54
}

Als Kontrolle schaue ich mir an, was die UART Schnittstelle empfängt:
test BA

-> soweit ist alles gut. Jetzt kommentiere ich den Teil zw. Marker1 und 
Marker2 aus und lese nur noch aus dem EEPROM.

Ich würde bei den o.g. Konfigurationen davon ausgehen, dass ich nach 
erneutem Flashen wieder

test BA

an der UART Schnittstelle erhalten würde. Dem ist leider nicht so,
es erscheint

test FF

also der Standardwert nach Neu-Initialisierung. Wieso wurde der EEPROM 
trotz entsprechender Konfiguration in MPLAB nicht erhalten?

Kann mir da jemand weiterhelfen?

Beste Grüße

von chris (Gast)


Lesenswert?

Einfach absolute eeprom adresse eintragen,
also 310000-31000f z.b. .
I'm Datnblatt steht die genaue adressen.

von Marcel W. (macew)


Lesenswert?

chris schrieb:
> Einfach absolute eeprom adresse eintragen,
> also 310000-31000f z.b. .

Danke für den Tipp, allerdings funktioniert das auch nicht. Beim 
PIC18F26K80 ist das EEPROM im Speicherbereich F00000-F003FF angesiedelt 
(nur herausgefunden durch die *.map Datei, im ganzen Datenblatt findet 
sich nichts darüber!).
Trage ich diese in die Preserve EEPROM Range an, gibt er mir einen 
Fehler zurück:
1
>> Failed to program device
2
The selected preserve range, F00000-F003FF, does not fall within the proper range for the memory area selected. Please check the manual program ranges on the debug tool's, "Memories to Program" property page.
... ISt das vllt eine Einschränkung vom PICkit3?

LG

von Peter D. (peda)


Lesenswert?

Ich hab das gleiche Problem mit dem Galep5 beim AVR, der löscht auch 
immer den EEPROM mit. Es liegt nicht am AVR, denn mit dem STK500 bleibt 
der EEPROM erhalten.

Ich lese daher erst den AVR aus, lösche im Hexfile den Code unter den 
EEPROM-Daten und füge das neue Hexfile hinzu. Dann programmiere ich 
alles in den AVR zurück.

von Marcel W. (macew)


Lesenswert?

Eine solche Vorgehensweise würde ich nur sehr ungern machen, da es 
einfach zu aufwendig ist, wenn öfters neue Software-Versionen getestet 
werden müssen. Ist es denn nicht irgendwie anders möglich das EEPROM 
automatisch in MPLAB zu konservieren?!

von skorpionx (Gast)


Lesenswert?

Mit Sprut Brenner8 ist das möglich. Mit einer Option wird vor der
Programmierung  EEprom gerettet und dann  nach Flash wird
auch EEprom beschrieben. Das Problem: beim löschen von PIC wird Flash
und EEprom gelöscht.

von chris (Gast)


Lesenswert?

Dann nimm Mplab8 und nicht X und berichte, ob es da funktioniert.

von Marcel W. (macew)


Lesenswert?

Hallo allerseits,
ich habe es bisher nicht geschafft, das EEPROM zu erhalten, MPLAB 8 habe 
ich nicht installiert (ist mit unserer IT immer ein bisschen 
komplizierter).

Ich habe das Problem jetzt so "gelöst", dass ich das EEPROM mit 
entsprechenden Werten über den __EEPROM_data(...) Befehl initialisiere. 
Natürlich nutzt mir das nichts, wenn ich während des Betriebs den Inhalt 
des EEPROMs ändere, aber zurzeit reicht mir das.

Wenn jemand noch eine andere Idee hat, nur zu :-)!

Schonmal danke für eure Tipps.

von Gerhard M. (ggcode)


Lesenswert?

Hallo,
Funktioniert das schreiben auch?
Kannst du mal verschiedene Adressen schreiben?
Das 'preserve EEProm' funktioniert eigentlich immer im MPLABX, hatte bis 
jetzt noch keine Probleme damit.

Was ich schon hatte war ein Fehler in den schreib/lese Routinen auf das 
EEProm.

Gruß

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

Hat sich schon mal einer das Progrämmchen IPE4 angegugt?

von Gerhard M. (ggcode)


Lesenswert?

Microchip MPLABX IPE 4.01 ??

Ja.

von Teo D. (teoderix)


Lesenswert?

Gerhard M. schrieb:
> Microchip MPLABX IPE 4.01 ??
>
> Ja.

Klar.
Wär auch zu einfach gewesen, aber erwähnen musste ich es.

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.