Forum: Mikrocontroller und Digitale Elektronik ATMEGA mit externem RAM


von Bruno M. (brumay)


Lesenswert?

Hallo,

ich habe einen funktionierenden Schaltungsaufbau mit einem ATMEGA162, 
einem 74HCT573 und einem 32k RAM. Zur Fehlersuche auf einer größeren 
Platine versuche ich nun schon mehrere Tage diese Schaltung nicht mit 
der im ATMEGA eingebauten RAM Steuerung, sondern nur mit ASM Befehlen zu 
realisieren. Dann wäre ich in der Lage den Ablauf schrittweise 
durchzugehen.

Leider hatte ich bisher nicht den gewünschten Erfolg!

Hat jemand eventuell schon einen fertigen Code, oder kann mir dabei 
helfen?

Gruß
Bruno

von Sam .. (sam1994)


Lesenswert?

Ich arbeite gerade auch an einer Platine mit externem Ram. Sobald ich 
sie fertig gelötet habe, werde ich auch bald den Ram testen. Ich kann 
(wenn es bei mir funktioniert) meinen Code posten. Ich verwende einen 
ATmega8515 mit 128kB Ram.

BTW: Was hast du alles schon probiert?

von Bruno M. (brumay)


Lesenswert?

Hallo Samuel,

ich nehme aber an, du wirst auch das Control Register MCUCR nutzen. Dann 
hat man mit der RAM Steuerung ja relativ wenig zu tun, da alles die 
Hardware macht. Wie schon gesagt habe ich dafür schon einen 
funktionierenden Code.

Ich versuche aber das ganze mit direkter Steuerung der einzelnen Ports 
zu realisieren, d.h. ohne MCUCR.

Oder was machst du?

von Sam .. (sam1994)


Lesenswert?

Ich werde MCUCR nutzen, da ich den Ram sonst nicht schnell genug 
ansprechen kann. Warum nutzt du es nicht? Die Ports brauchst du so oder 
so.

von Bruno M. (brumay)


Lesenswert?

Wie gesagt, hoffe ich damit einen Fehler auf einer größeren Platine zu 
finden.

von Jobst M. (jobstens-de)


Lesenswert?

WAS denn für einen Fehler?


Gruß

Jobst

von Bruno M. (brumay)


Lesenswert?

>Jobst
Wenn ich das so genau wüßte!
Jedenfalls kann ich das RAM nicht richtig ansprechen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Jedenfalls kann ich das RAM nicht richtig ansprechen.

Wie äußert sich das?

von Bruno M. (brumay)


Lesenswert?

>Knut

Ich habe ein kleines Programm, mit dem ich die Funktion teste (in jede 
Adresse einen Wert schreiben und wieder lesen).

Dabei bekomme ich schon bei der ersten Adresse eine Fehlermeldung.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Mit welcher Frequenz arbeitest du? Bei >8MHz sind die 74HCTs zu langsam 
und man bekommt schnell mal undefinierbare Fehler. Hab auch im Kopf, 
dass die Leiterbahnen max 17cm lang sein sollten um Reflexionen zu 
vermeiden.

Um das XMEM-Interface zu umgehen, musst du nur die einzelnen 
Arbeitsschritte 'von Hand' durchgehen (nur Prinzip):
PORTA, PORTC, ALE, RD, WR als Ausgang; ALE, RD, WR high
1
READ:
2
out PORTA, AddLow
3
out PORTC, AddHigh
4
cbi PORTE, ALE
5
out DDRA, 0b00000000
6
cbi PORTD, RD
7
nop
8
in data, PINA
9
sbi PORTD, RD
10
sbi PORTE, ALE
11
12
WRITE:
13
out PORTA, AddLow
14
out PORTC, AddHigh
15
cbi PORTE, ALE
16
out PORTA, data
17
cbi PORTD, WR
18
sbi PORTD, WR
19
sbi PORTE, ALE

Mark

von Bruno M. (brumay)


Lesenswert?

Hallo Mark,

herzlichen Dank für die Info. Werde ich mir genauer ansehen.

Den 74HCT habe ich übrigends mit 16MHz ohne Probleme laufen.

Ergebnis kommt!

Bruno

von Uwe (Gast)


Lesenswert?

Datenblatt vom RAM lesen und timings alle genau betrachten

von Bruno M. (brumay)


Lesenswert?

Hier bin ich wieder. Leider immer noch ohne Erfolg!

Ich habe zwar in meinem Code einen gravierenden Fehler festgestellt 
(statt beim Lesen das DDRA umzustellen, hatte ich den PORT umgestellt), 
aber genützt hat das auch nichts.

Da ich ja langsam blind werde, stelle ich meinen Code mal hier rein:

Check:
ldi  XL,LOW(RAMEND)     ; Register XL ist R26, LSB RAM-Adresse
ldi  XH,HIGH(RAMEND)   ; Register XH ist R27, MSB RAM-Adresse
ldi  soll,0b10101010   ; Bitmuster fuer Test

Checkloop:
inc  XL       ; Erhoehe Adresszaehler um 1
brne  RAMcheck     ; Nicht Null, MSB ok
inc  XH       ; Erhoehe MSB der Adresse
breq  Ende       ; Null, MSB uebergelaufen, raus
rcall  Ausgabe      ; Anzeige von XH mit LCDs

RAMcheck:
rcall  Schreiben
rcall  Lesen
cp  Daten,soll     ; Vergleiche gelesen mit geschrieben
brne  Ende       ; Nicht gleich, raus
com  soll       ; Drehe alle Bits im Bitmuster um (XOR FF)
rcall  Schreiben
rcall  Lesen
cp  Daten,soll     ; Vergleichen
brne  Ende       ; Nicht gleich, raus
com  soll       ; wieder umdrehen
rjmp  Checkloop     ; Weitermachen

Schreiben:
out  PORTA, XL
out  PORTC, XH
cbi  PORTE, 1    ; XL mit ALE in Zwischenspeicher
out  PORTA, soll    ; Daten an PortA
cbi  PORTD, 6
sbi  PORTD, 6    ; Daten schreiben in RAM mit steigender Flanke (nur RAM 
AS7C..!!!)
sbi  PORTE, 1
ret

Lesen:
out  PORTA, XL
out  PORTC, XH
cbi  PORTE, 1    ; XL mit ALE in Zwischenspeicher
ldi  temp, 0
out  DDRA, temp
cbi  PORTD, 7
nop
in  Daten, PORTA    ; Daten in Register übernehmen
ldi  temp, 0xFF
out  DDRA, temp
sbi  PORTD, 7
sbi  PORTE, 1
ret

Ende:
ldi  temp, 0
out  PORTB, temp    ; auf die LEDs
rcall  warten
ldi  temp, 0xFF
out  PORTB, temp    ; auf die LEDs
rcall  warten
rjmp  ende       ; Loop fuer immer

Ausgabe:
com  XH       ; XOR FF der obersten RAM-Adresse
out  PORTB, XH     ; auf die LEDs
rcall  warten
com  XH
ret


Vielleicht fällt dir ja etwas auf.
Ich habe es übrigends auch mit 4MHz versucht.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

direkt auffällig ist 'in Daten, PORTA' das sollte PINA heißen, sonst 
gibt's nur XL zurück.
Der Rest sind nur Vermutungen, was noch sein könnte:
Ich unterstelle mal, dass die Initialisierungen nur nicht mitkopiert 
wurden, sonst würden nur Pull-ups aktiviert die vermutlich nicht 
ausreichen.

Wenn du den RAM ohne XMEM ansprichst, hast du die Adressen von 0x0000 
bis zur Größe des RAMs zur Verfügung, das mapping mit dem internen SRAM 
entfällt (das mit 'RAMEND' ist unnütz). Fehlerfrei würde das nur 
funktionieren, wenn du einen 64kByte-RAM verwendest.
Du könntest auch mal verschiedene 'Ende'-Routinen verwenden um die 
Fehlerquellen (Überlauf, Lesefehler) zu unterscheiden.
Sind !CE und !OE richtig angeschlossen?
Versuch vielleicht erstmal nur ein festes Byte zu schreiben und zu 
lesen, wenn das auch nicht klappt, nur zwei Adressen abwechselnd in's 
Latch schreiben, lang genug lassen um's mit LED/Multimeter oder so zu 
überprüfen.

von Bruno M. (brumay)


Lesenswert?

Das mit PORTA und PINA war schon mal ein sehr guter Tip. Ich muß 
gestehen, ich hatte das absichtlich abgeändert weil ich dachte es wäre 
ein Versehen.
Ich verstehe es auch nach wie vor nicht ganz, da ich aus den diversen 
Informationen etwas anderes herauslese. Auch in google bin ich nicht 
fündig geworden.
Jedenfalls schreibt und liest jetzt das Programm schon mal richtig aus. 
Allerdings kommt dann nach einer unterschiedlichen Anzahl von Adressen 
(XL max ca. 40) wieder ein Lesefehler. Irgendwo scheint das timing nicht 
ganz zu funktionieren, oder?
Auch der Hinweis betr. RAMEND ist nützlich, auch wenn es bei diesem 
Problem keinen Einfluß hat.
Hinweis: Das Programm selbst basiert auf ein einem Testprogramm mit XMEM 
und auch die beim Testen benutzte Schaltung habe ich mehrfach mit XMEM 
getestet.

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.