Forum: Mikrocontroller und Digitale Elektronik EEPROM Verständnisproblem beim PIC 16F18344


von Karsten (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Thomas E. (picalic)


Lesenswert?

Das Wortbreite des EEPROM ist 8 Bit, d.h. NVMDATH ist nur beim Zugriff 
auf den Programmspeicher (14 Bit Wortbreite = 8+6 Bit) relevant.

von Klaus (Gast)


Lesenswert?

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

von Karsten (Gast)


Lesenswert?

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

von pic (Gast)


Lesenswert?

>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?

von Klaus (Gast)


Lesenswert?

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

von Karsten (Gast)


Lesenswert?

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

von Jannyboy (Gast)


Lesenswert?

Probieren mal in Test Programm zwichen ...

writeEEPROM
NVMDAT=0;
readEEPROM

Ich glaube nicht das man 16 Bit in eine Zelle schreiben kann.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

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

von Thomas E. (picalic)


Lesenswert?

Vielleicht solltest Du auch zum Lesen des EEPROMs das 
NVMCON1bits.NVMREGS Bit auf 1 setzen!

von Karsten (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.