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
Du mußt den XDATA hinter Dein Programm legen, z.B. ab 3kB. Peter
Welche Meldungen erhälts Du, wenn Du den Keil-Compiler aufrufst? Warnings?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.