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
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
@Ralph: Dann wird die Variable aber soweit ich weiss trotzdem im RAM abgelegt. Ralf
Danke Ralph Das Zauberwort ist echt "code" und nicht "const" MFG Patrick
> 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)
Naja das mit dem "ph" ist so eine gewohnheit von mir :-). Aber entschuldige bitte das ich dich umtaufen wollt. MFG Patrick
gar nicht, weil nicht vorhanden. Zumindest nicht bei Standard-8051.
Wie ist das bei externen EEPROM ? Kann man den zum Speichern von Variablen usw nutzen ? MFG Patrick
> 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
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
Naja ich hab einen AT89C51ED2 und als Kompiler verwend ich den von Keil µVision 2. Zur Programmierung verwende ich das FLIP.
Da steht irgendwas das der so zu beschreiben ist wie der XRAM aber wie macht man das dann in C ?
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 | }
|
Zum auslesen von Daten würd ich eher den Befehl CBYTE nehmen oder irre ich mich grad da MFG Patrick
CBYTE ließt ein Byte aus dem Code Bereich, du willst jedoch aus dem EEPROM lesen.
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
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
was sagt dem compiler eigentlich dann
1 | (unsigned char xdata*)address; |
das ist mir nicht ganz klar.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.