www.mikrocontroller.net

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


Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwende das Schlüsselwort 'const'

const unsigned char var1;

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ralph:

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

Ralf

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Ralph
Das Zauberwort ist echt "code" und nicht "const"

MFG Patrick

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Patrick Weinberger (seennoob)
Datum:

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


MFG Patrick

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie kann man eigentlich Werte in den EEPROM speichern ?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gar nicht, weil nicht vorhanden. Zumindest nicht bei Standard-8051.

Autor: Patrick Weinberger (seennoob)
Datum:

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

MFG Patrick

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char eeprom ucTest;  //Variable im EEPROM Speicher deklarieren
ucTest = 0x55;                //Zugriff wie bei normalen Variablen

Beispiel Variante 2:
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick Weinberger (seennoob)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, der hat 2k Eeprom on Chip...

Autor: Patrick Weinberger (seennoob)
Datum:

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

Autor: mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Probier mal folgendes:
unsigned char ReadEepromByte(unsigned short address) {
 unsigned char tmp;
 unsigned char xdata* ptr = (unsigned char xdata*)address;
 
 while (EECON & 0x01)
  ;
 
 EA = 0;
 
 EECON = 0x02;
 tmp = *ptr;
 EECON = 0x00;
 
 EA = 1;

 return tmp;
}

Autor: Patrick Weinberger (seennoob)
Datum:

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

MFG Patrick

Autor: mars (Gast)
Datum:

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

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Egentlich will ich schreiben und lesen können

Autor: mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist das Problem?
Schreiben geht analog zu ReadEepromByte.

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt noch eine blöde Frage.
Ich versteh diese code Zeile nicht ganz.
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

Autor: mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Patrick!
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

Autor: Patrick Weinberger (seennoob)
Datum:

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

Autor: mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.