Forum: Mikrocontroller und Digitale Elektronik MPLAB XC16 PIC24F32KA302 => EEPROM Read


von Andreas B. (biosniper)


Lesenswert?

PIC24F32KA302 (MPLAB XC16)
1
//====================================
2
//EEPROM Lesen & Schreiben. 16 Bit.
3
//====================================
4
5
void ReadEEdata(unsigned int *dest, unsigned int *addr) {
6
unsigned int offset;
7
8
TBLPAG = __builtin_tblpage(&addr); //Argument to __builtin_tblpage() is not the address ...
9
offset = __builtin_tbloffset(&addr); //Argument to __builtin_tbloffset() is not the address ...
10
*dest = __builtin_tblrdl(offset);
11
}

Ich habe schon alles mögliche probiert, und so wie ich es jetzt 
evaluiert habe haben auch andere solche Probleme mit dem EEPROM 
Schreiben und Lesen.

Der Kommentar ist der ERROR:
//Argument to __builtin_tblpage() is not the address of an object in a 
code, psv, or eedata section;
the object must not be qualified with any form of index

//Argument to __builtin_tbloffset() is not the address of an object in a 
code, psv, or eedata section;
the object must not be qualified with any form of index

Danke

von Klaus (Gast)


Lesenswert?

So hat es bei mir funktioniert. Das EEPROM wird hier als Array von 256 
ints verwendet.
1
int __attribute__ ((space(eedata))) eeData; // Global variable located in EEPROM
2
3
void EepErase(void) {
4
    NVMCON = 0x4050;            // Set up NVMCON to bulk erase the data EEPROM
5
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
6
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
7
    while(_WR)
8
        ;
9
}
10
11
int EepRead(int index){
12
    unsigned int offset;
13
14
    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
15
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
16
    offset += index * sizeof(int);
17
    return __builtin_tblrdl(offset);    // read EEPROM data
18
}
19
20
int EepWrite(int index, int data){
21
    unsigned int offset;
22
23
    NVMCON = 0x4004;    // Set up NVMCON to erase one word of data EEPROM
24
25
    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
26
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
27
    offset += index * sizeof(int);
28
    __builtin_tblwtl(offset, data);
29
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
30
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
31
    while(_WR)
32
        ;
33
}

MfG Klaus

von Andreas B. (biosniper)


Lesenswert?

Danke für den Quelltext, aber was mache ich, wenn ich mehrere Words aus 
dem EEPROM lesen will ? Also, mehrere Variablen/Konstanten. Das kann 
Deine Routine ja nicht.

Ausserdem finde ich es nicht sehr gut eine EEPROM-Variable eeData zu 
nennen. Es gibt Leute die nicht sofort raffen, dass eedata und eeData 
nicht das gleiche ist.
Aber ich weiss, dass Du das aus einem anderen Forum hast, da hab ich 
auch schon gesucht.

Ich habe jetzt mal rausgefunden was das Problem ist. Das EEPROM wird mit 
einer 24 Bit Adresse angesprochen, aber ein normaler Pointer hat nur 16 
Bit, deshalb will

1
TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
2
offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address

das nicht haben.

Man müsste den normalen Pointer in einen 24 Bit Pointer konvertieren.
Aber dafür habe ich noch keine Lösung, obwohl es eigentlich ganz simpel 
sein müsste.

von Klaus (Gast)


Lesenswert?

Ich schaffe es damit, das ganze EEPROM zu schreiben und auszulesen, 
wenn mir danach ist. Aber wenn dir mein Code und die Variablennamen 
nicht gefallen, schreib dir einen eignen.

MfG Klaus

von Andreas B. (biosniper)


Lesenswert?

Wenn man nur mit Integer arbeiten möchte, dann kann man das notfalls so 
machen, ansonsten wird es etwas umständlich.

von Klaus (Gast)


Lesenswert?

Andreas Bayer schrieb:
> Wenn man nur mit Integer arbeiten möchte, dann kann man das notfalls so
> machen, ansonsten wird es etwas umständlich.

Entschuldigung, daß ich einen Code gepostet habe, den man nur im 
Notfall benutzen kann. Wenn ich angemeldet wäre, würde ich ihn sofort 
löschen.

Mea maxima culpa Klaus

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.