Nutzung des EEPROM bei einem 80c51

Gast #960426
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
Gast #961218
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)
Gast #962577
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
#962829
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
Gast #963211
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
}
OP #963500
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
Gast #963551
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
Gast #963767
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren