Forum: Mikrocontroller und Digitale Elektronik PIC24f32KA304 EEPROM lesen und schreiben


von Holger W. (sirmortimer)


Lesenswert?

Hallo Leute

Ich bräuchte mal einen Tipp oder Code wie man bei einem PIC24F32KA304 
von MicroChip das EEPROM beschreibt und wieder ausliest.

Die Beispiele in den Manuals, die die Funktionen tblpage, tbloffset, 
tblrdh und tblwth benutzen, habe ich nicht zum Laufen bekommen.

Vielen Dank für Eure Mühe.

von Lukas D. (lukas_d)


Lesenswert?

Hallo Holger,

hast du dir mal Section 7 Data EEPROM von Microchip angesehen? Da ist 
das in Assembler beschrieben und anhand der Kommentare lässt sich das 
relativ einfach in anderen Sprachen realisieren.

http://ww1.microchip.com/downloads/en/DeviceDoc/31007a.pdf

Grüße

Lukas

: Bearbeitet durch User
von Holger W. (sirmortimer)


Lesenswert?

Hallo Lukas,

vielen Dank für Deine schnelle Antwort.

Ich habe mir den Text mal durchgelesen. Prinzipiell sieht das gut aus, 
aber ich kann bei dem PIC24 keine Register EECON1 usw. finden, auch 
nicht in dem entsprechenden PIC24-Family-Dokument.

Ist der Artikel evtl. für andere Pics?

In dem Family-Dokument steht das auch mit den tbl.. Befehlen drin, aber 
ich bekomme immer im Debuger die Anzeige "Invalid adress"

Viele Grüße Holger

von Klaus (Gast)


Lesenswert?

Lukas D. schrieb:
> hast du dir mal Section 7 Data EEPROM von Microchip angesehen? Da ist
> das in Assembler beschrieben und anhand der Kommentare lässt sich das
> relativ einfach in anderen Sprachen realisieren.
>
> http://ww1.microchip.com/downloads/en/DeviceDoc/31007a.pdf

Ist auch das falsche Dokument, ist für die 8 Bitter. Das für die PIC24 
heißt DS39720A und ist Kapitel 5. War blöd zu finden, habs mir vor 
längerer Zeit runtergeladen und lebe aus der lokalen Kopie.

Bei den PIC24 gibts weniger Register, sind ja auch 16 Bit breit.

MfG Klaus

von neuer PIC Freund (Gast)


Lesenswert?

Und warum nicht RTFM im Datenblatt? Kapitel 6.4, copy&paste nach MPLABX 
und der xc16 ist zufrieden.

von Holger W. (sirmortimer)


Lesenswert?

Hallo PIC Freund (so viel Zeit muss sein),

das FM habe ich schon gelesen, ich nehme an Du meinst sicher 
PIC24_Family_39995d.pdf (war mir nicht sicher).

Der Code:

        unsigned int offset;
    NVMCON = 0x4004;
    // Set up a pointer to the EEPROM location to be erased
    TBLPAG = __builtin_tblpage(&eeData); // Initialize EE Data page 
pointer
//    offset = __builtin_tbloffset(&eeData) + (addr & 0x01ff); // 
Initizlize lower word of address
    offset = __builtin_tbloffset(&eeData); // Initizlize lower word of 
address
    __builtin_tblwtl(offset, 0x3637); // Write EEPROM data to write 
latch

    asm volatile ("disi #5"); // Disable Interrupts For 5 Instructions
    __builtin_write_NVM(); // Issue Unlock Sequence & Start Write Cycle
    while(NVMCONbits.WR==1); // Optional: Poll WR bit to wait for
    // write sequence to complete


steht, so wie er im Dokumentsteht, im main. Beim deguggen ergab sich, 
dass es einen SChreibfehler gibt, wenn der Befehl:__builtin_write_NVM();
ausgeführt wird. In TBLPAG (0x7F) und offset (0xFE00) stehen 
offensichtlich die rictigen Daten drinn.

Leider freut sich der X16 nicht, weißt Du warum?

Danke für die Antwort, Holger

von Holger W. (sirmortimer)


Lesenswert?

Hallo Klaus

Danke für den Tipp. Leider habe ich das Dokument (noch) nicht gefunden.

Könntest Du mir den Link oder das Dokument senden?

Danke schonmal und Grüße zurück, Holger

von jasmin (Gast)


Lesenswert?

Hallo,

ist für den C18 Compiler

#include <EEP.h>

schreiben
                          Adr, Data
  Busy_eep(); Write_b_eep(123, 22);

lesen
                    Adr,
  temp = Read_b_eep(123);

Gruß Jasmin

von Klaus (Gast)


Lesenswert?

Holger W. schrieb:
> Könntest Du mir den Link oder das Dokument senden?

Link habe ich nicht (mehr), Dokument ist nicht meins, mag ich nicht 
schicken. Aber hier ein Stück von meinem Code
1
int __attribute__ ((space(eedata))) eeData; // Global variable located in EEPROM
2
3
/* needs about 1.2ms */
4
5
void EEP_Erase(void) {
6
    NVMCON = 0x4050;            // Set up NVMCON to bulk erase the data EEPROM
7
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
8
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
9
__delay_us(100);
10
    while(_WR)
11
        ;
12
    Nop();                      // place for a breakpoint
13
}
14
15
uint16_t EEP_Read(int index){
16
    unsigned int offset;
17
    if(index > 0xff)
18
        return 0xffff;
19
    if(index < 0)
20
        return 0xffff;
21
22
    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
23
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
24
    offset += index * sizeof(int);
25
    return __builtin_tblrdl(offset);    // read EEPROM data
26
}
27
28
int EEP_Write(int index, int data){
29
    unsigned int offset;
30
31
    if(index > 0xff)
32
        return -1;
33
    if(index < 0)
34
        return -1;
35
36
    NVMCON = 0x4004;    // Set up NVMCON to erase one word of data EEPROM
37
38
    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
39
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
40
    offset += index * sizeof(int);
41
    __builtin_tblwtl(offset, data);
42
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
43
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
44
    while(_WR)
45
        ;
46
    return 0;
47
}
MfG Klaus

von Holger W. (sirmortimer)


Lesenswert?

Hallo Jasmin, Hallo Klaus,

Vielen Dank erstmal für Eure Antworten.

@Jasmin
Ob ich das so für den X16-Compiler übernehmen kann, glaube ich nicht, 
aber es ist eine gute Idee bei MircoChip mal nach EEP.h/EEP.c für den 
X16 zu suchen.

@Klaus
Das Du das Dok nicht weitergeben willst, kann ich verstehen. Aber die 
Information, die ich brauche hast Du mir ja dankenswerter Weise 
geschickt.

Der Code sieht weitestgehen so aus, wie ich ihn schon getestet habe 
(siehe oben). Den Read-Code habe ich schon getstet, der funktioniert. 
Naja, eins von zwei ist ja auch schon ganz gut.

Leider komme ich erst Heute Abend dazu den Code auszuprobieren. Ich 
melde mich dann, wie es gelaufen ist.

von jasmin (Gast)


Lesenswert?

Hallo Holger,

Ich habe MPLAPX nur auf meinem Notebook installiert, der ist leider zur 
Zeit in Reparatur. Kann deshalb leider nicht nachsehen.

Schreib doch einfach die paar Zeilen von mir in deinen Code. Der 
Compiler wird dir schon sagen, ob es richtig ist.

Ich verwende diese schon sehr lange unter MPLAP und C18.

Gruß Jasmin

von Holger W. (sirmortimer)


Lesenswert?

Hallo Jasmin, Hallo Klaus,

@ Jasmin
Leider funktioniert das so nicht, der Compiler sucht immer die Datei 
EEP.h und EEP.c. Ich müsste die also irgend wo herkriegen.
Aber trotzdem Danke für Dein engagement, bis dann Holger

@ Klaus
Ich weiß jetzt auf den Stutz nicht wo der Unterschied zwischen Deinem 
und dem Code, den ich gepostet habe, ist, aber Deiner funktioniert.

Vielen Dank dafür und schöne Woche Euch beiden, Holger

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.