EEPROM des 89c51cc03 ansprechen

Gast #1145420
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
OP #1145439
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
Gast #1145553
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
Gast #1145721
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
OP #1147660
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren