Forum: Mikrocontroller und Digitale Elektronik 8051 Problem mit Initialisierung globaler Variablen


von Josef (Gast)


Lesenswert?

Hallo Leute!

Programmiere gerade einen AT89C51RC2 mit Keil.

Beim Debuggen ist mir aufgefallen, dass die globalen Variablen, die ich 
schon vordefiniert habe, nicht immer richtig initialisiert werden.

Liegen die Variablen am Anfang des XDATA Bereichs, dann funktioniert die 
Initialisierung. Liegen sie weiter hinten, so stehen irgendwelche 
falschen Werte drin.

Habe aus dem Programmcode alle Schleifen etc. auskommentiert, damit ich 
sichergehen kann, dass der Fehler nicht von meinem Programm kommt.

Der XDATA Bereich ist auch bei weitem nicht voll und den XBPSTACK habe 
ich auch deaktiviert, da ich keine reentrant funktionen benötige.

Woher kann dieser Fehler kommen?

Kann da was am STARTUP.A1 oder am INIT.A51 file faul sein?

Vielleicht kann mir ja jemand einen Tip geben?

mfg Josef

von Carsten W. (eagle38106)


Lesenswert?

Wie sieht denn das mit der Definition der RAM-Größe aus?
Ich meine die Datei START.A51.

von Josef (Gast)


Lesenswert?

Habe die XRAM Größe am Beginn meines C Programms auf 1024 Byte gestellt,
also mittels Befehl:

AUXR = AUXR | 0xC0;

und das scheint irgendwie den Fehler auszulösen.

mfg Josef

von R. W. (quakeman)


Lesenswert?

Hast du in der Datei START.A51 in der Sektion "Power-On Initialization 
of Memory" die Startadresse sowie die Größe des Xdata Bereichs korrekt 
eingestellt?
Denn nur diese Einstellung führt dazu, dass zu Beginn des Programms der 
Bereich vollständig mit 0x00 Initialisiert wird. Andernfalls hast du 
nach dem Einschalten zufällige Werte drin. Ohne diese Initialisierung 
musst du eben nur sichergehen, dass du deine Variablen vor der ersten 
Verwendung immer vorbelegt hast.

Ciao,
     Rainer

von Josef (Gast)


Lesenswert?

Ja, das Verändern der Konstante XDATALEN habe ich auch schon probiert, 
das hat aber keine Besserung gebracht, jetzt habe ich direkt im 
Assembler die XRAM Größe eingegeben

MOV 0x8E,#0x0C

So scheint es zu funktionieren, aber das sollte eigentlich doch auch 
irgendwie funktionieren, ohne dass man direkt in den Assembler Code 
eingreift, oder?

mfg Josef

von R. W. (quakeman)


Lesenswert?

Josef schrieb:
> Habe die XRAM Größe am Beginn meines C Programms auf 1024 Byte gestellt,
> also mittels Befehl:
>
> AUXR = AUXR | 0xC0;
>
> und das scheint irgendwie den Fehler auszulösen.

Also falls das kein Schreibfehler war, dann funktioniert es so nicht. Es 
muss 0x0C lauten, wie bei deiner Assembler Variante. Wenn du wirklich 
0xC0 reinschreibst ist das Verhalten undefiniert, da du ein reserviertes 
Bit setzen würdest.

Ciao,
     Rainer

von Ralf (Gast)


Lesenswert?

> So scheint es zu funktionieren, aber das sollte eigentlich doch auch
> irgendwie funktionieren, ohne dass man direkt in den Assembler Code
> eingreift, oder?
Öffne die Startup.a51 im Editor. Unterhalb des Fensters sollte "config 
wizard" o.ä. stehen. DA STELLT MAN DANN DIE SACHEN EIN :)

Ralf

von Josef (Gast)


Lesenswert?

sorry, du hast natürlich recht: der wert war 0x0c
hab das auf die schnelle verwechselt ...

mfg josef

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.