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
Gast
#960426
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
#960651
Verwende das Schlüsselwort 'const' const unsigned char var1;
Gast
#960825
@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
Gast
#961218
> 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
Und wie kann man eigentlich Werte in den EEPROM speichern ?
Gast
#962517
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
Gast
#962577
> 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 | |
2 | |
Beispiel Variante 2:
1 | |
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.
Gast
#963114
ja, der hat 2k Eeprom on Chip...
Da steht irgendwas das der so zu beschreiben ist wie der XRAM aber wie macht man das dann in C ?
Gast
#963211
Hi! Probier mal folgendes:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Zum auslesen von Daten würd ich eher den Befehl CBYTE nehmen oder irre ich mich grad da MFG Patrick
Gast
#963247
CBYTE ließt ein Byte aus dem Code Bereich, du willst jedoch aus dem EEPROM lesen.
Egentlich will ich schreiben und lesen können
Gast
#963270
Wo ist das Problem? Schreiben geht analog zu ReadEepromByte.
Ich hab jetzt noch eine blöde Frage. Ich versteh diese code Zeile nicht ganz.
1 | |
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
Hi Patrick!
1 | |
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 | |
das ist mir nicht ganz klar.
Gast
#963767
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.