Forum: Mikrocontroller und Digitale Elektronik Nutzung des EEPROM bei einem 80c51


von Patrick W. (seennoob)


Lesenswert?

Wie kann man ein Array mit Konstantenten beim 80c51 und als Kompiler 
Keil nutzen, ohne das die Variablen wieder in den RAM geladen werden. 
Achja ich mein die Programmiersprache C.

MFG Patrick

von Ralf (Gast)


Lesenswert?

Hi,

> Wie kann man ein Array mit Konstantenten beim 80c51 und als Kompiler
> Keil nutzen, ohne das die Variablen wieder in den RAM geladen werden.
Indem du die Variablen im CODE-Segment deklarierst. Dann werden sie im 
Codespeicher abgelegt, belegen also kein RAM, sondern FLASH.

Beispiel: unsigned char code ucVar1;

Das (Online)-Manual zu Keil hat mir da schon sehr geholfen, und die 
beiden C51-Bücher von Michael Baldischweiler (www.c51.de) kann ich auch 
sehr empfehlen.

Gruß Ralf

von Ralph (Gast)


Lesenswert?

Verwende das Schlüsselwort 'const'

const unsigned char var1;

von Ralf (Gast)


Lesenswert?

@Ralph:

Dann wird die Variable aber soweit ich weiss trotzdem im RAM abgelegt.

Ralf

von Patrick W. (seennoob)


Lesenswert?

Danke Ralph
Das Zauberwort ist echt "code" und nicht "const"

MFG Patrick

von Ralf (Gast)


Lesenswert?

> Danke Ralph
> Das Zauberwort ist echt "code" und nicht "const"
Dann heisst es aber: Danke Ral_f_ :)

Nein, quatsch, die Hauptsache ist, wir konnten helfen.

Ralf <- f (Ich konnts mir nicht verkneifen)

von Patrick W. (seennoob)


Lesenswert?

Naja das mit dem "ph" ist so eine gewohnheit von mir :-). Aber 
entschuldige bitte das ich dich umtaufen wollt.


MFG Patrick

von Patrick W. (seennoob)


Lesenswert?

Und wie kann man eigentlich Werte in den EEPROM speichern ?

von crazy horse (Gast)


Lesenswert?

gar nicht, weil nicht vorhanden. Zumindest nicht bei Standard-8051.

von Patrick W. (seennoob)


Lesenswert?

Wie ist das bei externen EEPROM ? Kann man den zum Speichern von 
Variablen usw  nutzen ?

MFG Patrick

von Ralf (Gast)


Lesenswert?

> Wie ist das bei externen EEPROM ? Kann man den zum Speichern von
> Variablen usw  nutzen ?
Ja, das geht. Du musst dann halt einen "Treiber" dafür schreiben. Wenn 
du C verwendest, wird's etwas komplizierter, wenn du die Werte wie 
normale Variablen behandeln willst. Die andere Möglichkeit wäre, eine 
Funktion zu schreiben, die eine übergebene Variable an eine übergebene 
Adresse speichert.

Der Unterschied zwischen beiden Varianten ist, dass du im letzten Fall 
ein bisschen RAM verbrauchst und nicht wie mit normalen Variablen 
arbeiten kannst. Du musst in diesem Fall darauf achten, dass du nicht 
aus Versehen die falsche Adresse angibst. Im ersten Fall kann der 
Compiler den EEPROM eben wie einen normalen Speicher sehen, daher kann 
er auch die Adresse automatisch vergeben. Diese Variante ist aber 
schwieriger zu implementieren.

Beispiel Variante 1:
1
unsigned char eeprom ucTest;  //Variable im EEPROM Speicher deklarieren
2
ucTest = 0x55;                //Zugriff wie bei normalen Variablen

Beispiel Variante 2:
1
WRITE_EEPROM(ucData, uiAddress); //EEPROM Funktion aufrufen

Für die EEPROMs bieten sich die mit synchroner serieller Schnittstelle 
an, wie z.B. SPI oder I2C. Wenn dein Controller entsprechende Hardware 
dafür onboard hat, würde ich das entsprechende Interface verwenden.

Welchen Controller und welches C verwendest du?

Ralf

von Peter D. (peda)


Lesenswert?

crazy horse wrote:
> gar nicht, weil nicht vorhanden. Zumindest nicht bei Standard-8051.

Rein formal richtig, aber wer läßt sich heutzutage noch nen echten Intel 
80C51 maskenprogrammieren?

Wenn es um konstante Daten im internen Flash geht, dann ist "code" schon 
goldrichtig.

Wenn es aber darum geht, Daten zur Laufzeit nichtflüchtig zu speichern, 
dann muß man schon mal den konkreten 80C51-Typ nennen.

Die mit Bootloader haben einen API-Call, um in den Flash zu speichern.
Andere haben einen 2kB Data-EEPROM,der nach XDATA gemappt werden kann.
Die alten Maxim DS5000 haben nen internen SRAM mit Batterie.
Manche können es aber garnicht intern.


Peter

von Patrick W. (seennoob)


Lesenswert?

Naja ich hab einen AT89C51ED2 und als Kompiler verwend ich den von Keil 
µVision 2. Zur Programmierung verwende ich das FLIP.

von crazy horse (Gast)


Lesenswert?

ja, der hat 2k Eeprom on Chip...

von Patrick W. (seennoob)


Lesenswert?

Da steht irgendwas das der so zu beschreiben ist wie der XRAM aber wie 
macht man das dann in C ?

von mars (Gast)


Lesenswert?

Hi!

Probier mal folgendes:
1
unsigned char ReadEepromByte(unsigned short address) {
2
 unsigned char tmp;
3
 unsigned char xdata* ptr = (unsigned char xdata*)address;
4
 
5
 while (EECON & 0x01)
6
  ;
7
 
8
 EA = 0;
9
 
10
 EECON = 0x02;
11
 tmp = *ptr;
12
 EECON = 0x00;
13
 
14
 EA = 1;
15
16
 return tmp;
17
}

von Patrick W. (seennoob)


Lesenswert?

Zum auslesen von Daten würd ich eher den Befehl CBYTE nehmen oder irre 
ich mich grad da

MFG Patrick

von mars (Gast)


Lesenswert?

CBYTE ließt ein Byte aus dem Code Bereich, du willst jedoch aus dem 
EEPROM lesen.

von Patrick W. (seennoob)


Lesenswert?

Egentlich will ich schreiben und lesen können

von mars (Gast)


Lesenswert?

Wo ist das Problem?
Schreiben geht analog zu ReadEepromByte.

von Patrick W. (seennoob)


Lesenswert?

Ich hab jetzt noch eine blöde Frage.
Ich versteh diese code Zeile nicht ganz.
1
unsigned char xdata* ptr = (unsigned char xdata*)address;


Ich würde mich sehr freuen über eine kurze erklärung.

Danke euch allen für die hilfe und spezial Dank an mars und Ralf (heute 
mal ohne "ph" und mit "f")

MFG Patrick

von mars (Gast)


Lesenswert?

Hi Patrick!
1
unsigned char xdata* ptr = (unsigned char xdata*)address;
Ist ein Pointer auf den XData Bereich(Brauchst du, da auf den EEPROM per 
MOVX zugegriffen wird), welcher mit dem Wert von address initialisiert 
wird.

Lg

von Patrick W. (seennoob)


Lesenswert?

was sagt dem compiler eigentlich dann
1
(unsigned char xdata*)address;
das ist mir nicht ganz klar.

von mars (Gast)


Lesenswert?

Hi Patrick!
(unsigned char xdata*)address; castet den Parameter address auf einen 
Pointer ins XDATA Segment. Dannach zeigt ptr auf die Adresse die du per 
address Parameter übergeben hast und du kannst dann mit *ptr auf diesen 
Speicherbereich zugreifen.

Lg

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.