Hallo, ich möchte im EEPROM des PIC16F18344 ein paar Konfigurationswerte ablegen. Dabei habe ich folgendes Problem, bzw. verstehe ich nicht, wie das von den Erschaffern des PIC gedacht war, Werte im EEPROM abzulegen. (Kleiner Spoiler vorweg: Prinzipiell kann ich Werte speichern und laden) Ausgangssituation: Der PIC hat laut Datenblatt 256 Bytes EEPROM mit jeweils 8 Bit. Diese können wortweise beschrieben werden (1 Wort sind für mich 16Bit). -> siehe Seite 119 im Datenblatt Um ins EEPROM zu schreiben muss ich mit den diversen NVM-Registern arbeiten, am Ende landen dann die Bits aus dem NVMDAT-Doppelregister im EEPROM, nämlich an der Stelle des NVMADR-Doppelregisters. Das funktioniert auch soweit und ich kann die Daten wie gesagt auch wieder auslesen. -> siehe hierzu S. 122. Jetzt kommt das eigentlich Problem: Die besagten NVMDAT-Register haben keine 16 Bit. Seite 133 im Datenblatt zeigt, dass das NVMDATH-Register nur 6 Bit hat, mit diesen Registern kann ich also keine 16Bit schreiben, sondern nur 14. Wie soll ich jetzt also echte 8Bit Werte im EEPROM unterbringen, wenn bei jedem zweiten Wert 2 Bit fehlen? Vielen dank für eure Hilfe Karsten PS: Das Datenblatt habe ich mal angehängt, um es euch leichter zu machen mir zu helfen. Da mein Code ja funktioniert und es eher ein konzeptionelles Problem ist, habe ich auf dessen Anhang verzichtet. Wenn ihn noch jemand sehen will, reiche ich ihn nach.
Das Wortbreite des EEPROM ist 8 Bit, d.h. NVMDATH ist nur beim Zugriff auf den Programmspeicher (14 Bit Wortbreite = 8+6 Bit) relevant.
Karsten schrieb: > Der PIC hat laut Datenblatt 256 Bytes EEPROM mit jeweils 8 Bit. Diese > können wortweise beschrieben werden (1 Wort sind für mich 16Bit). Für dich, aber nicht für den Prozessor. Ein EEPROM-Word ist 8 Bit, ein Programm-Word ist maximal 14 Bit. Daher reichen 14 Bit im Datenregister für beide Arten Zugriffe. 16 BIT NVM gibt es gar nicht. MfG Klaus
Danke schonmal für die Antworten. Dass die 14Bit mit der Wortbreite des Programmspeichers zusammenhängen hatte ich mir schon gedacht. Mit einem 8-Bit-Zugriff aufs EEPROM wäre ich auch zufrieden. Nur scheint es so zu sein, dass er beim EEPROM-Zugriff immer die vollen 14 Bit schreibt, inklusive eines impliziten Löschprozesses. Also werden immer 14 Bit verändert. Oder wie kann ich dem PIC beibringen, nur 8 Bit zu schreiben? Lesen ist ja kein Thema, da kann ich DATH einfach ignorieren. Grüße Karsten
>Mit einem 8-Bit-Zugriff aufs EEPROM wäre ich auch zufrieden. Nur scheint >es so zu sein, dass er beim EEPROM-Zugriff immer die vollen 14 Bit >schreibt, inklusive eines impliziten Löschprozesses. Also werden immer >14 Bit verändert. Wie erkennst Du, das 14 Bit geschrieben werden?
Karsten schrieb: > Also werden immer 14 Bit verändert. Bist du sicher? Schreib ein Muster auf Adresse 1. Dann schreib auf Adresse 0 und schau, ob sich die unteren 6 Bit von Adresse 1 ändern. Wenn nicht, sind Bit 8 bis 14 im Datenregister beim EEPROM ungenutzt. Ich geh mal davon aus, daß das so ist. Alles andere würde sicher auch im Datenblatt stehen. Ist ja lang genug. MfG Klaus
So, eben nochmal getestet: Ich habe mittels Debug-Funktion nacheinander 0x00DD, 0x0011 und 0x00FF in die Speicherstellen 0, 1 und 2 geschrieben und nacheinander wieder ausgelesen. Interessanterweise konnte ich jetzt keine Beeinflussung der nebenstehenden Speicherstellen mehr feststellen. Dafür ist mir jetzt ein anderes Problem aufgefallen: Nach der Trennung der Stromversorgung und Neustart des Controllers im Debug-Modus (ich teste, indem ich die EEPROM-Funktionen mit "Set PC at Cursor" manuell von eigentlich nicht erreichbaren Codestellen aus starte), stehen in den Speicherstellen völlig andere Werte, dafür sind es aber nach jedem Neustart die gleichen. Kann es sein, dass der Debug-Modus ins EEPROM schreibt? Warum sollte er? Die andere Möglichkeit, die ich mir vorstellen könnte ist, dass ich gar nicht ins EEPROM schreibe, sondern irgendwo in den Programmspeicher... Scheint so, als müsste ich meine Aussage "Lesen und Schreiben funktioniert" bis auf weiteres zurückziehen. Hier sind die Lese- und Schreibfunktionen, vielleicht findet ja jemand meinen Fehler:
1 | //entsperrt das EEPROM für Schreib und Löschprozesse |
2 | void unlockEEPROM (void) |
3 | { |
4 | interruptOff(); |
5 | NVMCON2 = 0x55; |
6 | NVMCON2 = 0xAA; |
7 | |
8 | NVMCON1bits.WR = 1; |
9 | } |
10 | |
11 | //Liest 16Bit aus dem EEPROM |
12 | unsigned int readEEPROM(unsigned int address) |
13 | { |
14 | unsigned int receivedData = 0; |
15 | |
16 | NVMADR = (address + 0x7000); |
17 | NVMCON1bits.RD = 1; |
18 | |
19 | receivedData = NVMDAT; |
20 | return receivedData; |
21 | } |
22 | |
23 | //Schreibt 16Bit ins EEPROM |
24 | void writeEEPROM(unsigned int data, unsigned int address) |
25 | { |
26 | NVMCON1bits.NVMREGS = 1; //EEPROM anwählen |
27 | |
28 | NVMADR = (address + 0x7000); |
29 | NVMDAT = data; |
30 | NVMCON1bits.WREN = 1; |
31 | unlockEEPROM(); |
32 | |
33 | while (NVMCON1bits.WR) |
34 | ; |
35 | |
36 | NVMIF = 0; |
37 | } |
Schonmal vielen Dank für eure Hilfe Karsten
Probieren mal in Test Programm zwichen ... writeEEPROM NVMDAT=0; readEEPROM Ich glaube nicht das man 16 Bit in eine Zelle schreiben kann.
Karsten schrieb: > ich möchte im EEPROM des PIC16F18344 ein paar Konfigurationswerte > ablegen. Mit dem XC8 compiler hab ich keine Probleme - siehe angehaengtes Bild. An der Adresse 9 habe ich den Wert 5 gespeichert.Dieser Wert wird im EEPROMfenster erst sichtbar wenn der Simulator laeuft.Die ersten 8 Zellen werden direkt beim Brennen im Speicher abgelegt und koennen dann nicht mehr veraendert werden.Der XC8-UserGuide enthaelt alle informationen.Den notwendigen EEPROM-Code kannst du aus dem Bild entnehmen. Sollte ich dein Anliegen missverstanden haben - vergiss mein Posting
Vielleicht solltest Du auch zum Lesen des EEPROMs das NVMCON1bits.NVMREGS Bit auf 1 setzen!
@Thomas: Aua, danke... Das tat weh. Jetzt sehe ich auch, dass die Daten im speicher bleiben. Ich schreibe also tatsächlich ins EEPROM und das funktioniert auch. @Toxic: Danke für den Hinweis mit dem Manual. Das habe ich hier zwar schon ewig auf der Platte, hätte aber durchaus mal reinlesen sollen. Da sind ja einige echt nette Makros drin und eine Variable direkt ins EEPROM zu legen hat auch was. Dann werde ich meinen Code wohl mal umstellen. Danke euch! MfG Karsten
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.