externes RAM per ASM ansteuern

OP #7716033
Lesenswert?

Hallo, ich habe wieder mal ein Problem, bei dem ich nicht weiterkomme. Ich habe eine Schaltung mit ATmega162, 74HCT573 und einem 32k Speicher AS7C256. Mit Hardware Interface funktioniert die Schaltung. Für Testzwecke versuche ich das nun mit einer ASM Software Lösung.

1
Write:
2
sbi    PORTD, WR    ; Write auf high
3
sbi    PortE, 1    ; ALE auf high
4
clr    temp
5
out    PortC, temp    ; Ausgabe High Adressen
6
ldi    temp, 0x0F      
7
out    PortA, temp    ; Ausgabe Low Adressen  
8
cbi    PortE, 1    ; ALE auf low, Adresse wird gehalten
9
cbi    PORTD, WR    ; Write auf low
10
ldi    Data, 0b01010101        
11
out    PortA, Data    ; Daten werden bereitgestellt
12
sbi    PORTD, WR    ; Write auf high
13
nop
14
sbi    PortE, 1    ; ALE auf high
15
ret
16

17
;**************************************************************************
18
Read:
19
sbi    PortE, 1    ; ALE auf high
20
clr    temp
21
out    PortC, temp    ; Ausgabe High Adressen
22
ldi    temp, 0x0F      
23
out    PortA, temp    ; Ausgabe Low Adressen
24
cbi    PortE, 1    ; ALE auf low, Adresse wird gehalten
25
sbi    PORTD, WR    ; Write auf high
26
clr    temp              
27
out    DDRA, temp    ; Alles Eingang
28
in    Data, PinA    ; Daten abholen
29
nop
30
sbi    PortE, 1    ; ALE auf high
31

32
mov    temp, Data
33
rcall  uart_transmit
34
ret

CE hängt an PortC7 und ist damit immer low.

Das Problem ist, daß ich beim Lesen immer die Adresse von PortA bekomme und nicht die Daten. Was mache ich falsch?

Gast #7716040
Lesenswert?

Bruno M. schrieb:

in Data, PinA ; Daten abholen

Was ist denn Data? Du musst an dieser Stelle ein register angeben, zum Beispiel

in r16,pina

Ich bin unsicher, ob die Groß/Kleinschreibung von PinA hier eine Rolle spielt. Als ich meine AVR noch in Assembler programmierte, hatte ich die Registernamen jedenfalls immer klein geschrieben.

OP #7716061
Lesenswert?

S. L. schrieb:

Ich sehe nirgendwo D7 in §Read: 'PD7 RD (Read strobe to external memory)'

1
A write cycle is accomplished by asserting chip enable (CE) and write enable (WE) LOW. Data on the input pins I/O0-I/O7 is
2
written on the rising edge of WE (write cycle 1) or CE (write cycle 2). To avoid bus contention, external devices should drive
3
I/O pins only after outputs have been disabled with output enable (OE) or write enable (WE).
4
A read cycle is accomplished by asserting chip enable (CE) and output enable (OE) LOW, with write enable (WE) high. The
5
chip drives I/O pins with the data word referenced by the input address. When chip enable or output enable is high, or write
6
enable is low, output drivers stay in high-impedance mode.

Auszug aus dem Datenblatt!

OP #7716071
Lesenswert?

Ich glaube, ich habe den Fehler gefunden. Ich habe mir bei dieser Gelegenheit den Datenblattauszug nochmals durchgelesen:

1
A write cycle is accomplished by asserting chip enable (CE) and write enable (WE) LOW. Data on the input pins I/O0-I/O7 is
2
written on the rising edge of WE (write cycle 1) or CE (write cycle 2).

Wenn ich das richtig interpretiere, muß ich zuerst die Daten in den 74HCT573 schieben und dann erst die Adresse und nicht umgekehrt!

#7716108
Lesenswert?

Ich kenn den ATmega162 nicht aber die 80xx. So wie ich im Manual des 162 es verstehe kann man mit Steuerregistern das externe Interface für den XMEM aktivieren. Danach müßte das Interface die Steuersignale selbst generieren. Insbesondere werden die Datenrichtungsregister überschrieben. Würde für mich auch keinen Sinn machen wenn man bei XMEM die Steuersignale noch selbst erzeugen müßte.

OP #7716119
Lesenswert?

Peter D. schrieb:

/OE des RAM kommt an /RD von der CPU. Nur vor dem Lesen wird /RD=0 und danach /RD = 1. Beim Adresse laden und beim Schreiben muß /RD = 1 bleiben.

Ich zitiere nochmals das Datenblat: quote A read cycle is accomplished by asserting chip enable (CE) and output enable (OE) LOW, with write enable (WE) high. unquote

Ein RD kommt darin nicht vor.

#7716123
Lesenswert?

Für den Zugriff auf das RAM mit CE auf low mußt du ein Port als High Adress verwenden. /WE muss high sein . Dann die Lowadresse an den Port mit dem Latch ALE auf Low und sofort wieder auf High. Wenn du schreiben willst Daten an den Datenport und danach /WE auf low und sofort wieder auf high.

Lesen: Adressen wie zuvor an die Ports. Datenport danach auf lesen. /OE auf low. Port lesen. /OE auf high setzen.

OP #7716143
Lesenswert?

Ich habe den Code mal so abgeändert, wie ich den Vorschlag verstanden habe. Nur OE habe ich weggelassen, da es fest verdrahtet ist und im Datenblatt auch so nicht vorkommt. Leider hat das nichts geändert.

1
Write:
2
sbi    PORTD, WR    ; Write auf high
3
sbi    PortE, 1    ; ALE auf high
4
clr    temp
5
out    PortC, temp    ; Ausgabe High Adressen
6
ldi    temp, 0x0F      
7
out    PortA, temp    ; Ausgabe Low Adressen  
8
cbi    PortE, 1    ; ALE auf low, Adresse wird gehalten
9
sbi    PortE, 1    ; ALE auf high
10
ldi    Data, 0b01010101        
11
out    PortA, Data    ; Daten werden bereitgestellt
12
cbi    PORTD, WR    ; Write auf high
13
sbi    PORTD, WR    ; Write auf high
14
nop
15
ret
16

17
;**************************************************************************
18
Read:
19
sbi    PORTD, WR    ; Write auf high
20
sbi    PortE, 1    ; ALE auf high
21
clr    temp
22
out    PortC, temp    ; Ausgabe High Adressen
23
ldi    temp, 0x0F      
24
out    PortA, temp    ; Ausgabe Low Adressen  
25
cbi    PortE, 1    ; ALE auf low, Adresse wird gehalten
26
sbi    PortE, 1    ; ALE auf high
27
cbi    PORTD, WR    ; Write auf high
28
clr    temp              
29
out    DDRA, temp    ; Alles Eingang
30
in    Data, PinA    ; Daten abholen
31
sbi    PORTD, WR    ; Write auf high

Ich muß noch hinzufügen, daß ich natürlich schon alles möglich eversucht habe. So habe ich sowohl das Latch als auch das RAM unabhängig voneinander getestet und es hat funktioniert. Das Problem kann also nur an der Kombination der beiden ICs liegen.

Beitrag #7716207 wurde von einem Moderator gelöscht.
#7716213
Lesenswert?

Ich brauche die Softwarelösung aber

Hmm - was ist an der Hardwarelösung verkehrt?

Nichts für ungut - manchmal mögen meine Assoziationen vielleicht etwas schräg sein (bringt das Alter so mit sich):

" ... einen Streich spielen. Er wird sogar die Lebkuchen aufs Spiel setzen und sich vielleicht den verderblichsten Unsinn wünschen, den allerunökonomischsten Blödsinn, einzig um in diese ganze positive Vernünftigkeit sein eigenes unheilbringendes phantastisches Element beizumischen. Gerade seine phantastischen Einfälle ... "

(Firma: 1984now) #7716864
Lesenswert?

S. L. schrieb:

Zu

... OE ... Das ist hardwaremäßig fest verdrahtet!

hat Heiner B. schon alles gesagt (das Verhalten ist im besten Falle undefiniert).

Ich würde es doch vorsichtigerweise eher so ausdrücken: es ist nur nicht dokumentiert. Leider kann ich zum konkreten Delinquenten Atmega162 auch nichts sagen, aber ich habe vor Jahren andere AVRs mit XMEM-Interface beackert (konkret: 8515), bei denen das ebenfalls nicht dokumentiert war, sich aber immerhin doch ein funktionierender Workaround für den rein Software-basierten Zugriff realisieren ließ.

Allerdings war da keiner der XMEM-Pins dediziert, alle liessen sich auch über ganz normale GPIO-Zugriffe erreichen (jedenfalls, wenn das XMEM-Interface deaktiviert war). Ein /OE gab es dort allerdings meiner Erinnerung nach gar nicht.

#7716906
Lesenswert?

Wenn man ein Oszilloskop hat, schaut man sich an, wie die funktionierende Schaltung abläuft.

Hat man keins, macht man es sicherheitshalber so wie alle Anderen, also: RD und WR high, ALE Low Adresse auf die Adressausgänge (hier PA und PC) ALE hoch ALE wieder runter, Adresse ist am RAM

Dann zum Schreiben: Datenbyte auf PA ausgeben WR runter WR wieder rauf

oder zum Lesen: PA auf Input umschalten RD runter PA einlesen RD wieder rauf

schon funktionierts. Alle Abweichungen von dieser Reihenfolge geschehen auf eigene Gefahr.

Gruß Klaus (der soundsovielte)

#7716919
Lesenswert?

Klaus Seegebarth schrieb:

RD runter PA einlesen RD wieder rauf

Ah, danke für den Hinweis! Mein Programm funktioniert hier zwar (auf einem STK200), aber es muss in §ext_read natürlich korrekterweise heißen:

1
    cbi     PORTD,7                                     ; /RD
2
    in      data,PINA
3
    sbi     PORTD,7
(Firma: 1984now) #7716922
Lesenswert?

Niklas G. schrieb:

S. L. schrieb:

Hmm - was ist an der Hardwarelösung verkehrt?

Noch einfachere Lösung: Mikrocontroller mit eingebauten 32 KiB RAM nutzen, z.B. STM32G070CB.

Oder lieber gleich was wirklich brauchbares: RP2354 mit satten 520kByte. Viel billiger als die ganze kleine STM32-Gülle und viel mehr Resourcen.

Selbst mit STM32M4 muss man sich schon ordentlich strecken, um an diese Performance mit diesen Resourcen heran zu kommen. STM hat mit diesen neuen RP endgültig ausgedient. Jedenfall für fast alles unterhalb H7/G7.

Gut so. Konkurrenz belebt das Geschäft. Für die Anwender wird es zunächst mal günstiger. Man muss bloß aufpassen, dass die Raspi-Truppe kein Quasi-Monopol etabliert bekommt. Dann würde es eklig werden.

(Firma: matzetronics) #7716941
Lesenswert?

Ob S. schrieb:

RP2354 mit satten 520kByte

Nun bleibt mal auf dem Teppich. Mich ärgert viel mehr, das der TE seine Definitionen nicht mitpostet und auch keinen Schaltplan preisgibt. Da fühlste dich schon ein wenig wie beim 'Rate mal mit Dosenthal'. Und dann kommt z.B. Bruno M. schrieb im Beitrag #7716053:

Data ist R17!

mit Ausrufezeichen, als verstünde sich das von selber.

#7716951
Lesenswert?

Matthias S. schrieb:

Mich ärgert viel mehr, das der TE seine Definitionen nicht mitpostet und auch keinen Schaltplan preisgibt. Da fühlste dich schon ein wenig wie beim 'Rate mal mit Dosenthal'.

Der TO hat deutlich geschrieben, daß er das SRAM am ATmega162 in der von Atmel vorgesehenen Methode dran hat und daß es damit funktioniert. Wer das nicht versteht (und kein Datenblatt lesen kann), der sollte den Griffel stillhalten. Im Datenblatt sind gleich auf der ersten Seite die Signale AD0-7,A8-15, RD, WR und ALE angegeben, man muß nichts suchen. Jeder, der schon einmal ein SRAM im Multiplex angeschlossen hat, kennt das auch auswendig.

Just my 2 cents

#7717051
Lesenswert?

Das entscheidende ist dieser Strich über dem WE. Das heist "low aktiv". Write enable ist es also wenn der Pegel low ist.

Im Datenblatt https://www.farnell.com/datasheets/101856.pdf sieht man auf Seite 4 und 5 die Pegelwechsel.

Liegt beim ATMega162 JTAG auch auf PortC dann ggf. das JTAG disable bit setzen das da nichts dazwischen funkt hatte das mal bei einem ATMega16

Normalerweise muss du beim Lesen nur die Adresse anlegen nach dem letzen Pegelwechsel an den Adressleitungen liegen die Daten nach 12, 15 oder 20nSek (je nach deinem SRAM-Typ) automatisch an, da kannst du dir einen weiteren Takt sparen. WE legst du vorher auf high und CE und OE vorher auf low.

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren