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.
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
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
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
Und warum nicht RTFM im Datenblatt? Kapitel 6.4, copy&paste nach MPLABX und der xc16 ist zufrieden.
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
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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.