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.
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)
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
@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