Forum: Mikrocontroller und Digitale Elektronik EEPROM des 89c51cc03 ansprechen


von Klaus K. (keili)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

datenblatt seite 38

von Klaus K. (keili)


Lesenswert?

Super !!!
Klasse Antwort.
Ich habe das Datenblatt gelesen. Ich frage nach SW.

von holger (Gast)


Lesenswert?

>Ich habe das Datenblatt gelesen. Ich frage nach SW.

C, ASM, JAVA, FORTRAN, FORTH, Kisuaheli?

von Klaus K. (keili)


Lesenswert?

Hi, die Sprache "C" wäre für mich in Ordnung.

DANKE

von Ralf (Gast)


Lesenswert?

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

von Klaus K. (keili)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Robert W. (rweber)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Robert W. (rweber)


Lesenswert?

... oder die Daten im data/idata halten

von Klaus K. (keili)


Lesenswert?

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
Noch kein Account? Hier anmelden.