www.mikrocontroller.net

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


Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst,

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

Gruß
Ingo

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:-)=

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.