mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24f32KA304 EEPROM lesen und schreiben


Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas D. (lukas_d)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: neuer PIC Freund (Gast)
Datum:

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

Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jasmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
int __attribute__ ((space(eedata))) eeData; // Global variable located in EEPROM

/* needs about 1.2ms */

void EEP_Erase(void) {
    NVMCON = 0x4050;            // Set up NVMCON to bulk erase the data EEPROM
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
__delay_us(100);
    while(_WR)
        ;
    Nop();                      // place for a breakpoint
}

uint16_t EEP_Read(int index){
    unsigned int offset;
    if(index > 0xff)
        return 0xffff;
    if(index < 0)
        return 0xffff;

    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
    offset += index * sizeof(int);
    return __builtin_tblrdl(offset);    // read EEPROM data
}

int EEP_Write(int index, int data){
    unsigned int offset;

    if(index > 0xff)
        return -1;
    if(index < 0)
        return -1;

    NVMCON = 0x4004;    // Set up NVMCON to erase one word of data EEPROM

    TBLPAG = __builtin_tblpage(&eeData);    // Initialize EE Data page pointer
    offset = __builtin_tbloffset(&eeData);  // Initizlize lower word of address
    offset += index * sizeof(int);
    __builtin_tblwtl(offset, data);
    asm volatile ("disi #5");   // Disable Interrupts For 5 Instructions
    __builtin_write_NVM();      // Issue Unlock Sequence and Start Erase Cycle
    while(_WR)
        ;
    return 0;
}
MfG Klaus

Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: jasmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger W. (sirmortimer)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.