mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verwenden von Xdata im Nordic mit 8051 Core


Autor: Studi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich bin fast am verzweifeln. Ich verwende den nRF24E1 um einen 
asynchronen seriellen Datenstrom von 1-256 Byte zu buffern, den 
kompletten Buffer anschliessend über Funk zu übertragen und wieder 
seriell auszugeben. Dazu habe ich mir die folgenden Arrays angelegt:

xdata unsigned char inbuf[256];
xdata unsigned char outbuf[256];

Leider funktioniert dabei garnichts mehr. Da die Interrupts, Timer etc 
alle nicht mehr funktionieren vermute ich, dass die beiden Arrays im 
Speicher über die SFR (Special Function Registers) gelegt werden. Wenn 
ich die Arrays verkleinere und zu den normalen Datan nehme klappt alles 
wunderbar...

Kann mir da jemand einen Tip geben, was ich nicht richtig mache?


Hinweise:

Plattform: uVison3
MUC: Nordic nRF24E1 mit 8051 Core und 4kByte RAM von 0x0000h - 0x0FFFh.
Memory Modell: Small
Rom Code Size: Large (64k)
Meine Programmgrösse: 1528 Bytes

http://www.keil.com/dd/docs/datashts/nordic/nrf24e1.pdf  (Seite 68)

Laut Nordic:
"This memory also functions as a random access memory and can be 
adressed with the movx and movc instructions."

Deshalb hab ichs mit xdata versucht (aber auch schon mit "code unsigned 
char inbuf[256]", Pointer etc). Ich habe auch schon im File 
"Startup.A51" etwas rumgespielt mit XDATASTART und XDATALEN, hat jedoch 
nichts funktioniert.

Im Anhang findet ihr das Konfigurationsfile, das ich verwende.

Gruss  Simon

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt den XDATA hinter Dein Programm legen, z.B. ab 3kB.


Peter

Autor: Mette (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Meldungen erhälts Du, wenn Du den Keil-Compiler aufrufst?

Warnings?

Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Ratschläge, inzwischen funktioniert es!

@ Peter: Ja, das habe ich gemacht, kam nur leider ein altes File in den 
Anhang. Beim Nordic ist der Code ab 0x0800h, deshalb hab ich den 
XDATASTART eigentlich auf 0x0100 (nach dem SFR) gelegt. Das Problem war, 
dass in der Linker Map immer stand:

XDATA 0000H  0100H  ABSOLUTE   blabla

und das fiese dabei war...

@ Mette: ... nein, es hat nie einen Fehler oder auch nur eine Warning 
gegeben.


Inzwischen habe ich die Arrays so deklariert:

xdata unsigned char inbuf[256] _at_ 0x0100;
xdata unsigned char outbuf[256] _at_ 0x0200;

und bekomme im Likerfile:

XDATA 0100H  0100H  ABSOLUTE
XDATA 0200H  0100H  ABSOLUTE

So wie es sein sollte :)

Vielen Dank für eure Hilfe nochmal

Simon

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Studi wrote:
> Danke für eure Ratschläge, inzwischen funktioniert es!
>
> @ Peter: Ja, das habe ich gemacht, kam nur leider ein altes File in den
> Anhang. Beim Nordic ist der Code ab 0x0800h, deshalb hab ich den
> XDATASTART eigentlich auf 0x0100 (nach dem SFR) gelegt. Das Problem war,
> dass in der Linker Map immer stand:
>
> XDATA 0000H  0100H  ABSOLUTE   blabla

Also das ist mir jetzt nicht ganz klar. Was hat denn der XDATA 
Adressbereich mit dem SFR Adressbereich zu tun?

Diese beiden Speicherbereiche sind völlig getrennt voneinander und 
dürfen sich auch überlappen, da mit dem gleichen Befehl sowieso nicht 
auf beide Bereiche zugegriffen werden kann.
Der SFR Bereich ist im internen RAM wärend der XDATA Bereich im 
"externen" RAM liegt, selbst wenn der externe RAM Bereich on-chip ist.

> Inzwischen habe ich die Arrays so deklariert:
>
> xdata unsigned char inbuf[256] _at_ 0x0100;
> xdata unsigned char outbuf[256] _at_ 0x0200;
>
> und bekomme im Likerfile:
>
> XDATA 0100H  0100H  ABSOLUTE
> XDATA 0200H  0100H  ABSOLUTE

Hast du in den Projekteinstellungen auch das Häkchen gesetzt für "Use 
On-chip XRAM"?

Denn falls du das nicht gemacht hast und alternativ dafür auch keinen 
"Off-chip Xdata memory" Bereich angegeben hast versucht der Compiler den 
Zugriff auf xdata in erster Linie zu vermeiden.

Falls die obigen Einstellungen richtig sind müsste deine Deklaration mit 
XDATA völlig ausreichen, um das Array in den XRAM Bereich zu verlegen.
Deshalb vermute ich eher, daß die Projekteinstellungen nicht ganz 
korrekt sind.

Das Bild auf Seite 68 des Datenblatts zeigt ja eindeutig, daß XDATA und 
IDATA getrennt voneinander anzusprechen sind (mit überlappendem 
Adressbereich), wie es bei 8051ern üblich ist.
Die Verwendung des at Befehls bewirkt nur, daß du den Speicherbereich 
der Variable verlegst. Die unteren 0x100 Bytes werden jetzt einfach 
leergelassen, was aber nicht nötig sein sollte.

Ciao,
     Rainer

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.