Forum: Mikrocontroller und Digitale Elektronik Variablen in XDATA -> Programm funktioniert nicht mehr


von Ingo (Gast)


Lesenswert?

Hallo alle,

ich benutze Keil um ein 8051 Derivat mit 16k on chip Flash-Memory zu
programmieren. Mein Programm lief wunderbar bis zu dem Zeitpunkt als
ich versucht habe einige Variablen in den XDATA Bereich zu schreiben.
Ich hab noch nicht so viel Erfahrung mit µC's und wollte jetzt mal
wissen, was ich falsch mache. Deklarieren tu ich sie z.B so:

xdata unsigned char cLength[16];

Der Compiler zeigt auch an, dass in xdata nun Platz verwendet wird,
allerdings läuft das Programm nicht mehr richtig.
Weitere Einstellungen:

Memory Model: small
Code Rom Size: large

Ich frage mich allerdings, wie und wo der xdata-Bereich überhaupt
festgelegt wird.

Danke schonmal für eure Hilfe.

Gruß
Ingo

von Mathias (Gast)


Lesenswert?

hallo ingo. ich benutze auch keil und hatte einmal ein ähnliches
problem. ich hatte damals auf daten im xdata mit einem pointer gezeigt,
welcher nicht im xdata lag! als ich das ganze an eine funktion übergeben
habe, zeigte der pointer auf die falschen daten!

vielleicht hilft dir dass ja!? mfg, Mathias

von Ingo (Gast)


Lesenswert?

Muss ich die Daten in xdata mit einem pointer auslesen? Wenn ja würde
mir ein Codebeispiel für

a) schreiben nach xdata
b) lesen aus xdata

viel helfen. ich steh grad irgendwie aufm schlauch

von Mathias (Gast)


Lesenswert?

Hallo Ingo:

Hier ein Beispiel zur Deklaration:

Daten ins RAM:       data unsigned char cLength[16];
Daten ins XDATA:     xdata unsigned char cLength[16];
DATEN in  den Code:  code unsigned char cLength[16];

beim small memory model werden alle Daten standartmäßig ins Ram
gespeichert, also erübrigt sich das data! daten im xdata kannst du
komplett gleich behandeln wie daten im data! (ist ja c nicht assembler
:-) ) nur wenn du daten im xdata hast und mit einem pointer drauf
zeigen willst, dann schau dass der pointer auch im xdata liegt!

welchen controller verwendest du denn? hast du die xdata startadresse
und länge richtig gewählt? im datenblatt müsste der speicheraufbau
beschrieben sein!

du sagst dein programm lief wunderbar!? bringt es jetzt fehlermeldungen
oder läuft es nur nicht mehr richtig? was hast du genau gemacht (eine
variable im xdata erstellt, bestehende variable vom data ins xdata
gelegt...) ??

mfg, Mathias

von Ingo (Gast)


Lesenswert?

Also,

mein µC ist ein t89c51cc02. Ich habe mein Programm um einige
Diagnosefunktionen via UART erweitert. Dabei benötige ich einen Puffer
für die eingegangenen Daten. Dieser Puffer umfasst 14 Byte. Zusammen
mit den Variablen, die ich für das restliche Programm benötige sprengt
das den Rahmen des RAM. Deshalb wollte ich nur die Variablen für die
Diagnose ins xdata verschieben. Sobald ich jedoch die Variable während
meiner globalen Variablendeklaration wie oben beschrieben erstelle,
funktioniert mein Programm nicht mehr richtig.

Wenn ich es richtig verstanden habe muss ich folgendes tun:

- im StartUp-Code den xdata-Bereich festlegen:
  ->StartUp.a51 editieren
  ->für XDATASTART irgendeine Adresse im User Bereich wo kein Code
steht (habe 0x1000 eingetragen)
  ->for XDATALENGTH Länge = 0xFF (reicht ja völlig)

- Variable global deklarieren xdata ....

Ich habe im Programm die xdata Variable wie jede andere behandelt, aber
schon kurz nach dem Reset fängt das Programm an zu spinnen.

In den Einstellungen des Linkers wird der XDATA-Bereich korrekt
angezeigt.

Ich versuch nochmal mit ner anderen Variable und dem "code" typ.

Danke schonmal für den Hinweis mit dem Pointer. Das ist auch schon Gold
wert:))

Gruß

Ingo

von Ingo (Gast)


Lesenswert?

Problem gelöst,

war nicht die Deklaration sondern ein kleiner Fehler im Programm. Danke
trotzdem für die Tips.

Gruß
Ingo

von Mathias (Gast)


Lesenswert?

:-)=

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.