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