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


von Studi (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


Lesenswert?

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


Peter

von Mette (Gast)


Lesenswert?

Welche Meldungen erhälts Du, wenn Du den Keil-Compiler aufrufst?

Warnings?

von Studi (Gast)


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

von R. W. (quakeman)


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

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.