Hallo, ich möchte das EEPROM des 89c51CC03 verwenden. Hat jemand von euch ein Beispielprogramm, indem er das schon einmal getan hat. Oder, kann mir jemand sagen, wo ich Beispielprogramme bekommen kann. Gruß Klaus
Super !!! Klasse Antwort. Ich habe das Datenblatt gelesen. Ich frage nach SW.
>Ich habe das Datenblatt gelesen. Ich frage nach SW.
C, ASM, JAVA, FORTRAN, FORTH, Kisuaheli?
Hi, warum fragst du nach Software, wenn du doch im Datenblatt stehen hast, wie es geht? Erstens glaube ich, dass du sicher in der Lage bist, das Geschriebene in C umzusetzen, und zweitens garantiere ich dir, dass die SW, die man dir zur Verfügung stellt, entweder nicht passt, weil sie z.B. nicht so geschrieben ist, wie du es erwartest (z.B. Rückgabewert usw.) oder weil sie evtl. für einen anderen Compiler geschrieben ist. Dann ist noch fraglich, wie du es dir überhaupt vorgestellt hast, nämlich ob du direkt immer die Adressen angeben willst, oder ob du es so haben willst, dass dein Compiler einfach denkt, er schreibt/liest eine normale Variable, also vom Verhalten her wie ganz normale Variablen im RAM. Falls Punkt eins nicht zutrifft, solltest du lieber mit etwas einfacherem anfangen, und für Punkt zwei wirst du in jedem Fall die Software umschreiben müssen. Daher denke ich, selber schreiben ist in jedem Fall besser. Hier gibts genug Leute, die dir helfen werden, wenns dann nicht klappt. Ist aber nur meine Meinung, also nicht falsch auffassen. Ralf
Hallo Ralf, zunächst vielen Dank für deine Antwort und deine Tipps. Für mich wäre es am besten, wenn ich das EEPROM wie einen normalen RAM-Bereich ansprechen könnte. Ich möchte einen Struktur von ca. 500Byte im EEPROM ablegen. Nach meinem Verständnis geht dies nicht so einfach, weil mit Pages gearbeitet werden muss. Ich würde mich über ein C-Beispiel riesig freuen, das zeigt, wie auf das EEPROM zugegriffen werden kann. Ich suche eben alle Infos zusammen. DANKE
> Für mich wäre es am besten, wenn ich das EEPROM wie einen normalen > RAM-Bereich ansprechen könnte. Aha, siehst du, die Info hat gefehlt. Desweiteren fehlt noch, welchen C-Compiler du verwendest. > Ich möchte einen Struktur von ca. 500Byte im EEPROM ablegen. Nach meinem > Verständnis geht dies nicht so einfach, weil mit Pages gearbeitet werden > muss. Okay, die Größe spielt erst mal keine Rolle, egal, ob du dem Compiler vorgaukelst, dass die Variable im RAM zu sein scheint. Wichtig ist da erstmal, dass er das unterstützt. Die Sache mit den Pages musst du nur dann beachten, wenn du mehrere Bytes auf einmal schreiben willst, ansonsten kannst du die Pages ignorieren, weil du dann nach jedem Byte den Schreibvorgang startest. Jetzt kommts eben drauf an, wie du das implementieren willst. Wenn dein Compiler prinzipiell die Möglichkeit bietet, das EEPROM als RAM zu behandeln, wirst du für den Zugriff wahrscheinlich auch angepasste Funktionen schreiben müssen. Beispiel Keil C51-Compiler, dort wird der Zugriff auf externes RAM vom Compiler geregelt, hat der Controller internes XRAM und/oder EEPROM (wie z.B. der AT89C51ED2, der hat beides), dann kann man über die XBANKING.A51 angepasste Routinen verfassen, die den Zugriff regeln. Die Variablen erhalten dann über eine #pragma-Direktive einen "Typ" verpasst (konkret wird eine 24-Bit Adresse vergeben, deren High-Byte den Typ angibt). Die Routinen in der XBANKING.A51 prüfen dann, ob der Adressbereich zu den Routinen gehört, und schreiben dann das EEPROM. Da aber der C-Compiler die Zugriffe immer byteweise erledigt, kannst du theoretisch auf die Arbeit mit Pages wiederum verzichten, es sei denn, du findest ne Möglichkeit, dem Compiler beizubiegen, das Ende der Struktur zu erkennen und erst dann zu schreiben (die letzte Adresse einer Page zu ermitteln ist dagegen easy), aber wie soll der Compiler erkennen, dass er erst nach dem letzten Byte der Struktur das Schreiben aktivieren soll. Fazit: Du hast drei Möglichkeiten: 1. Du implementierst die Schreib-/Lesefunktionen als ganz normale C-Funktionen -> nicht als RAM-Variablen handhabbar 2. Du implementierst das EEPROM als RAM, aber nur byteweise (Zeitverlust, da immer nur ein Byte geschrieben wird und nicht ein ganzer Block) 3. Wie Punkt zwei, aber die angepassten Routinen schreiben automatisch, sobald das Page-Ende erreicht ist, und die letzte Page wird durch den Aufruf einer Funktion geschrieben Vielleicht kennt noch jemand andere Möglichkeiten, aber jetzt schreib erstmal, was für einen Compiler du verwendest... > Ich würde mich über ein C-Beispiel riesig freuen, das zeigt, wie auf das > EEPROM zugegriffen werden kann. Hättest du dir übrigens die Mühe gemacht, auf der ATMEL-Homepage nicht nur das Datenblatt zu saugen, sondern auch den Rest, hättest du deine C-Beispiele gefunden: http://www.atmel.com/dyn/products/product_card.asp?part_id=3186 Und dort das ZIP-File "C Flash Drivers for the AT89C51CC03C for Keil Compiler v1.0.0" bzw. "C Flash Drivers for the AT89C51CC03U and AT89C51AC3 for Keil Compiler v1.0.0" runtergeladen, da stehts nämlich drin :) Ralf
Und um dir Frust zu ersparen: Man kann NICHT Daten vom XRAM direkt ins EEPROM kopieren. Entweder ist der XRAM im external Memory nach 0x0000 gemapped oder das EEPROM. Beides gleichzeitig geht nicht. Gruss, rweber
> Und um dir Frust zu ersparen: Man kann NICHT Daten vom XRAM direkt ins > EEPROM kopieren. Entweder ist der XRAM im external Memory nach 0x0000 > gemapped oder das EEPROM. Beides gleichzeitig geht nicht. Richtig, die Befehle des 8051 lassen das nicht zu, bzw. es liegt daran, dass selbst dem Controller vorgekaukelt wird, dass er bei EEPROM-Zugriff auf XRAM zugreift. Da aber bei MOVX-Befehle das Ergebnis eh immer aus dem Akku kommt bzw. dort landet, wäre der Ablauf etwa so: Aus EEPROM ins XRAM: - auf EEPROM Zugriff schalten - Auslesen in Akku - auf XRAM umschalten - Akku ins Ziel schreiben Umgekehrt dann genauso... Ralf
Hallo, ich möchte mich für eure Infos bedanken. Richtig, mit den Flashtreibern auf der ATMEL-Homepage kann des EEPROM problemlos angesprochen werden. Meine Strukur lese ich nun bei Controllerstart und schreibe die Struktur am Ende wieder ins EEPROM. Zum schreiben ins EEPROM nehme ich einen Zeiger der jeweils auf ein Byte der Struktur zeigt. Lese den Wert und schreibe ihn ins EEPROM. Danach wird der Zeiger um eine Adresse erhöht. Wert wird wieder gelesen und ins EEPROM geschrieben. Dies geschieht bis die ganze Struktur im EEPROM ist. Hier seht ihr einen kleinen Teil des Programms. struct daten { unsigned char tag; unsigned char stunde; unsigned int sensor; }; struct daten Messungen[300]; unsigned char* pointerToDaten; unsigned char a; unsigned char b; unsigned char c; void main() { pointerToDaten= Messungen; a = *zeiger1; b = *(zeiger1+1); c = *(zeiger1+2); } Das Schreiben ins EEPROM erfolgt mit der Routine: __api_wr_eeprom_byte von ATMEL. Gruß Klaus
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.