Forum: Mikrocontroller und Digitale Elektronik Atmel AT89C51CC03, Keil und externer Ram


von Karsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo...
ich betreibe ein TFH-System One Board mit einem AT89C51CC03. Auf dem 
Board ist ein Rambaustein vom Typ CX62256NLL 70PXC. Da es (vom 
CAN-Trainceiver abgesehen) die einzige Komponente auf dem Board ist, die 
ich noch nicht benutzt habe, wollte ich das Teil mal mit nutzen. Als 
Entwicklungsumgebung setze ich Keil µVision 4 ein.
Ich habe ein kleines Testprogramm geschrieben, um erst einmal eine 
Grundfunktion herzustellen...funktionierte auch prima, dachte ich 
zumindest...
Die Entwicklungsumgebung scheint meine Werte nicht im externen 
Raumbaustein, sondern im externen Ram des µControllers abzulegen. Wenn 
ich das Programm starte bekomme ich eine saubere Ausgabe, dass alles ok 
ist - aber komischer Weise erhalte ich die auch, wenn der Rambaustein 
NICHT auf dem Board ist -> entweder habe ich einen ota-Baustein, der 
nicht mal eine Spannungsversorgung benötigt (Patentverdächtig aber eher 
unwahrscheinlich ;-)oder ich habe an einer anderen Stelle klassisch 
versagt (sehr wahrscheinlich!!!).
Da sicherlich nach der *.map gefragt wird (aus der ich nicht so richtig 
schlau werde) habe ich (den vermutlich interessanten Teil) auch mal 
gleich hier:

ACTIVE MEMORY CLASSES OF MODULE:  test_ram2 (?C_STARTUP)

BASE        START       END         USED      MEMORY CLASS
==========================================================
X:000000H   X:000000H   X:001FFEH             XDATA
X:000000H   X:000000H   X:001FFEH   000FA0H   HDATA
C:000000H   C:000000H   C:00FFFFH   000609H   CODE
I:000000H   I:000000H   I:0000FFH   000001H   IDATA
I:000000H   I:000000H   I:00007FH   00000DH   DATA
I:000020H.0 I:000020H.0 I:00002FH.7 000001H.1 BIT
X:000000H   X:000000H   X:0000FFH   00000FH   PDATA


MEMORY MAP OF MODULE:  test_ram2 (?C_STARTUP)


START     STOP      LENGTH    ALIGN  RELOC    MEMORY CLASS   SEGMENT 
NAME
======================================================================== 
=

  *   *   *     D A T A   M E M O R Y     *   *   *   * 
*
000000H   000007H   000008H   ---    AT..     DATA           "REG BANK 
0"
000008H   00000CH   000005H   BYTE   UNIT     DATA 
DATA_GROUP
00000DH.0 00001FH.7 000013H.0 ---    ---      **GAP**
000020H.0 000021H.0 000001H.1 BIT    UNIT     BIT            BIT_GROUP
000021H.1 000021H   000000H.7 ---    ---      **GAP**
000022H   000022H   000001H   BYTE   UNIT     IDATA          ?STACK


  *   *   *    X D A T A   M E M O R Y    *   *   *   * 
*
000000H   00000EH   00000FH   BYTE   INPAGE   PDATA 
PDATA_GROUP
00000FH   000FAEH   000FA0H   BYTE   INSEG    HDATA          ?FD?RAM

Die getätigten Einstellungen in "Options for Target" sind zusammen mit 
dem Quellcode im Bild zu sehen.

Nach 8 Stunden rumprobieren (und googlen) bin ich am Ende und hoffe, 
dass es hier einen wissenden gibt, der mal das Brett vor meinem Kopf 
entfernen kann.

Gruss Karsten

von TomA (Gast)


Lesenswert?

Hallo Karsten,

weise doch deinem Array den Speichertyp XDATA zu. Und far brauchst du 
hier nicht, der Speicherchip hat nur 32KByte.

schreibe statt: far int Vari[2000];

die Anweisung: int xdata Vari[2000];

Gruß. Tom

von Thomas (Gast)


Lesenswert?

nun da stellt sich natürlich erst mal die Frage an welchen Addressen 
dein Ram zu finden ist. Zusätzlich wird vermutlich das onChip SRAM noch 
eingeschaltet sein Wenn also Internes und ext. XRAM an den gleichen 
Adressen liegen wird immer ins interne Ram geschrieben, da der 
Controller beim internen Ram keinen Zugriff mit RD oder WR erzeugt.
Die Größe des internen XRams kann auch noch programmiert werden.

Thomas

von Peter D. (peda)


Lesenswert?

Ohgottohgottohgottohgottohgottohgottohgottohgottchen, also ne.

Quelltext postet man nicht als png, sondern als c !!!

Die ersten 2k werden intern sein, Du mußt darüber zugreifen.

von TomA (Gast)


Lesenswert?

Hallo Thomas,

am Bild kann man sehen, daß Karsten einen Teil des externe Ram im 
Bereich 0x0000 bis 0x1FFF gewählt hat. Wie der Chip tatsächlich 
decodiert ist, weiß nur das Handbuch der Platine und (hoffentlich) 
Karsten.

Wenn man das interne Ram des µC nicht abschalten kann, muß darauf, wie 
du sagst, auch noch geachtet werden. Da der Speicherchip 32K groß ist 
und der µC internes Ram besitzt, drängt sich der Verdacht auf, das 
externe RAM ist auf den Adressbereich 0x8000 bis 0xFFFF codiert?

Gruß. Tom

von TomA (Gast)


Lesenswert?

Ich sehe grad im Bild, daß Karsten das interne RAM abgeschaltet hat!

Kein Häckchen bei "Use On-chip XRAM"

Bleibt nur zu klären, in welchem Adressbereich das externe RAM liegt. 
Bei 32k sollte es ja nur zwei Möglichkeiten geben - 0x0000 bis 0x7FFF 
oder 0x8000 bis 0xFFFF.

von Jim M. (turboj)


Lesenswert?

TomA schrieb:
> Ich sehe grad im Bild, daß Karsten das interne RAM abgeschaltet hat!
>
> Kein Häckchen bei "Use On-chip XRAM"

Da würde ich erstmal in den entsprechenden Registern nachschauen, ob das 
tatsächlich ausreicht, um auf externen XRAM zu schalten. IIRC ist das 
nur ein Hinweis für den Compiler/Linker. Näheres steht im Handbuch.

von Karsten (Gast)


Lesenswert?

Hallo...
So viele Antworten - und noch mehr Fragen...OK, dann fange ich mal an:
@TomA das mit XData war mein erster Versuch...das Ergebnis war das 
gleiche wie jetzt. Der Baustein liegt auf dem Tisch und die Daten werden 
trotzdem gespeichert. Daher der Versuch mit far.
@ Thomas der RAM liegt im Adressbereich von 0x0000 bis 0x7fff und 
On-Chip RAM ist deaktiviert-dachte ich zumindest, weil ja der Haken -wie 
Tom richtig gesehen hat - nicht drin ist.
@ Peter ja, Du hast natürlich recht. Es hatte sich bei dem Screenshot 
nur so angeboten und wird nicht wieder vorkommen. Danke für den Rüffel..
@ Jim in welchen Registern muss ich denn da schauen? Und welches 
Handbuch meinst Du (Platine, Prozessor, IDE)
Wobei das eigentlich das logischste wäre, wenn die Umschaltung nicht 
klappen würde. Stellt sich dann nur die Frage, wie man das "richtig" 
macht.
So...dann erstmal noch ein schönes Restwochenende...

Es grüsst Karsten

von Karsten (Gast)


Lesenswert?

So...
Lösung gefunden. Der Watchdog ist schuld - bzw. die leere Batterie. Der 
Watchdog überwacht die Batteriespannung, und scheint, wenn die 
Batteriespannung zu niedrig ist, das vom Chip-Selectdecoder kommende 
MEM\ Signal am CE\IN nicht an CE\OUT weiter zu geben. Daher kommt am 
Speicherbaustein kein RAM\-Signal am CS1\ des Rambausteins an bzw. das 
VOUT-Signal am CS2 des Ram-Bausteins fehlt.

Dass die Daten trotdem gespeichert wurden liegt daran, dass der 
controllerinterne ERAM den gleichen Adressbereich nutzt, wie der extern 
erweiterte Rambaustein (siehe auch Datenblatt des Controllers: Internal 
and External Memory Organisation ERAM-XRAM). Hierfür wird der 
Chip-Selectdecoder nicht gebraucht, daher klappt auch die Speicherung 
der Daten.
Die Adressierung des Speicherbereichs ist NUR mit dem Schlüsselwort far 
möglich, mit xdata kann nur der interne ERAM genutzt werden.
Für die Verwendung des externen Speichers werden Libarys benütigt, die 
in das Projekt eingebunden werden müssen:
- C51C.LIB
- XBANKING.A51
Im Bezug auf den externen Ram sind folgende Einstellungen in Keil 
notwendig:
Options for Target: Use Extended Linker (LX51) instead of BL51 (anhaken)
Target: Memory Model: Large
        Off-chip Xdata memory: Startadresse und Größe eintragen
        'far' Memory type support (anhaken)
LX51 Locate: Use Memory Layout from Target Dialog (anhaken)

Bei größeren Speichern ist natürlich noch das Bankswitching zu 
konfigurieren, hierzu kann ich aber nichts sagen, da ich biher nur einen 
32K Speicherbaustein habe/nutze.

Es grüßt Karsten

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.