Hallo,
folgende Ausgangslage:
- ATMega1284P
- AVR-Port-A ist verbunden mit Port-A eines 74LS245
- /Enable des '245 hängt an einem '138
- Port-B des '245 hängt an einem P8286 in einem anderen Rechner
- welcher wiederum von einer Z80-PIO gefüttert wird.
- /ASTB der Z80-Pio hängt an einem Port meines AT-Mega.
Ich steuere also mit meinem AVR /ASTB an der Z80-PIO an, und lese
die dann an der PIO anliegenden Daten ein.
Bisher war es immer so, dass der P8286 direkt an meinem AVR
angeschlossen war, und ich das /ASTB Signal auch direkt von meinem AVR
aus gesetzt habe. Es werden immer 9 Bytes übertragen. Die Übertragung
läuft so ab, das mir über ein weiteres Signal gesagt wird, das Daten
abzuholen sind. Dann setze ich /ASTB und dann lese ich vom Port die
Daten. Dann lösche ich wieder /ASTB, warte auf das nächste Signal und
setze wieder /ASTB und lese wieder. Das ganze dann für 9 Bytes. Folgende
Zeilen empfange ich z.B.:
18002eaaaa550200ff
18002eaaa1ff0200ff
08002eaaa1ff0200ff
18002e5500000200ff
18002e55a1ff0200ff
08002e55a1ff0200ff
f8c1555500000200ff
Code technisch sah es quasi so aus:
1
do{
2
while(PINC&(1<<PINC5);//warte bis ARDY an der Z80-PIO anliegt
3
PORTC|=((1<<PINC3));// setze ASTB
4
*buffer++=PINA;
5
PORTC&=~((1<<PINC3));// lösche ASTB
6
while(PINC&(1<<PINC5);//warte bis ARDY an der Z80-PIO erloschen ist
7
while(durchlauf<9)
ASTB wird über einen NPN-Transistor getrieben, so das ich bei mir High
setze, und dann an der Z80-PIO korrekterweise Low ankommt.
Ich habe nun die Schaltung wie oben beschrieben geändert. /ASTB setze
ich nun auch nicht mehr selber, sondern generiere es aus dem /ENABLE
Signal des '245. Ich aktiviere nun also den '245 über meinen
Adressdekoder '138. Durch das aktivieren des '245 wird zur selben Zeit
das /ASTB erzeugt was ich noch durch einen '04 schicke damit es am
NPN-Transistor wieder als High ankommt. Die Daten sollten somit am '245
zu lesen sein. Meine Schleife sieht nun quasi so aus:
1
do{
2
while(PINC&(1<<PINC5);//warte bis ARDY an der Z80-PIO anliegt
3
PORTD|=((1<<PIND5));// aktiviere '245
4
*buffer++=PINA;
5
PORTD&=~((1<<PIND5));// deaktiviere '245
6
while(PINC&(1<<PINC5);//warte bis ARDY an der Z80-PIO erloschen ist
7
while(durchlauf<9)
Nun lese ich aber folgende Daten:
1818002eaaaa550200
0018002eaaa1ff0200
0008002eaaa1ff0200
0018002e5500000200
0018002e55a1ff0200
0008002e55a1ff0200
00f8c1555500000200
Irgendwie verschlucke ich also am Anfang Daten.
Ich habe dann mal nach der Aktivierung des '245 im Code zwei nop()
eingebaut bevor ich auf PINA lese. Dann lese ich auf einmal die Daten
wieder richtig. Wenn ich mehr nop() einbaue überlese ich Daten - ich
lese also zu wenig. Das scheint also zeitkritisch zu sein.
Offensichtlich sendet der Rechner an der Z80-PIO und ich darf nicht zu
lange brauchen die Daten abzuholen.
Kann es sein das der '245 zu lange braucht bis er aktiv ist, und ich
deswegen 2 Takte warten muss bis ich lesen kann? 2 Takte wären aber bei
18,432 MHz ca. 109ns, oder? Das wäre etwas lange.... ein Kumpel meinte,
der '245 hat an Port-A und -B ggf. unterschiedliche Treiberleistungen -
kann es damit zusammenhängen? Ich habe auch mal einen HCT Typen versucht
- kein Unterschied. Bei einem F Typen brauche ich sogar 3 nop().
PS: wer sich die Schaltung nochmal bildlich anschauen will:
http://pofo.de/tmp/P8000_WDC_Emulator.pdf
links unten - der '245 (1D6)
Oliver Lehmann schrieb:> Ich habe dann mal nach der Aktivierung des '245 im Code zwei nop()> eingebaut bevor ich auf PINA lese.
Das ist korrekt, da der AVR Eingänge im vorherigen CPU-Takt latcht.
ein NOP für das AVR-Latch und ein NOP für den 245 zum Durchschalten.
Oliver Lehmann schrieb:> Wenn ich mehr nop() einbaue überlese ich Daten - ich> lese also zu wenig.
/ASTB sagt dem PIO, daß Du die Daten ja schon gelesen hast und er sie
wegnehmen kann.
Du must aber zuerst lesen und danach /ASTB = 0 setzen.
/ASTB darf also nicht gleichzeitig mit dem 245 aktiviert werden!
Transistoren sind als Inverter viel zu langsam.
Wo sind überhaupt die Arbeitswiderstände dazu?
Peter
Hallo Peter,
den Gegenpart findest du hier
http://pofo.de/P8000/notes/plaene/eigene/16-Bit-Rechner/Stromlaufplan.pdf
Auf Seite 7 unten (3. PIO).
Das mit dem Latchen habe ich nicht so ganz geschnallt. Warum ist es ein
Unterschied ob ich die Daten direkt an den AVR lege oder via den '245
gehe?
Ganz am Anfang bevor ich überhaupt mit meiner While-Schleife anfange
konfiguriere ich den Port am AVR auf lesen. Danach arbeite ich dann nur
noch mit ARDY (lesend) und /ASTB (schreibend).
bzgl. /ASTB:
Wie genau funktioniert die Z80-PIO? Ich hätte gedacht:
Ausgangszustand: /ASTB ist high
ARDY geht irgendwann auf high -> sagt mir "ich habe Daten für dich"
/ASTB wird auf von mir auf low gesetzt (ich setze es auf High, über den
NPN geht es aber auf Low)
Daten liegen nun an der PIO an.
Ich lese Daten
/ASTB wird auf High von mir gesetzt
Daten liegen nun nicht mehr an der PIO An.
ARDY geht auf low
Spielchen beginnt wieder von vorne.
Die Transistoren hatte ich schon in der Schaltung als ich noch ohne 138,
245, 04 gearbeitet hatte - die hatten problemlos funktioniert - nun
nicht mehr?
So sah das übrigens vor meinem '245&Co aus:
http://pofo.de/tmp/P8000_WDC_SDCard.pdf
Verstehe ich aber nicht. Im Periphial Handbuch ist auch ein Ablaufgraph
eingezeichnet:
http://www.z80.info/zip/um0081.pdf
Seite 215.
Dort meine ich zu erkennen, das bevor man die Daten lesen kann, /ASTB
auf low gehen muss, da erst mit dem setzen von low, die Daten angelegt
werden zum lesen?!
Steht auch so im Dokument oder kann ich nicht richtig englisch? :)
> /ASTB> Port A Strobe Pulse from Peripheral Device (input, active Low). The> meaning of this signal depends on the mode of operation selected for> Port A as follows:>> [...]> 3. Bidirectional mode: When this signal is active, data from the Port A> output register is gated onto Port A bidirectional data bus. The> positive edge of the strobe acknowledges the receipt of the data.> [...]
Heisst doch, er legt dieb Daten auf A wenn das signal activ wird (also
low wird). Und wenn es dann high (positive edge) wird, bbestätige ich
den Erhalt der Daten - oder nicht?!
Hast recht, ich habe Blödsinn erzählt.
Aber dann sollte der Ausgang ja stabil sein, solange /ASTB = 0 ist.
Also auch noch nach 100 NOPs.
Welchen Arbeitswiderstand die Inverter-Transistoren haben, hast Du immer
noch nicht erzählt.
Und warum die überhaupt drin sind.
Peter
Der Arbeitswiderstand sollte sich doch wenn ich das richtig verstanden
habe am Collector befinden, oder? Im Grunde ist das ganze so
angeschlossen:
+-------+
| |
| | 332Ohm 226Ohm
| Z80 | 5V|-/\/\/--+--/\/\/--|GND
| | |
| PIO |/ASTB | +-----+
| +-------------+----------+ +-----|GND
| | C| NPN |E
| | +--+--+
| | |B
+-------+ >
< 1,8KOhm
+-----+ >
| | |
| '04 |o-------+
| |
+-----+
Und bzgl. Stabilität - ich weiss leider nicht genau, wie der Hostrechner
der hinter der Z80-PIO hängt diese füttert. Da kenne ich mich zu wenig
aus - evtl. wartet der ja nicht auf die PIO sondern schreibt da einfach
drauf weil er einfach davon ausgeht, das die andere Seite die Daten
schnell genug abnimmt?
Wenn da schon ein 04'er in der Schaltung ist, warum nimmst du dann nicht
den statt der Transistorschaltung? Mit dem Spannungsteiler am Kollektor
kann ich nichts anfangen. Wozu soll der gut sein? Wenn überhaupt, dann
lass wenigstens den 226R weg.
Hallo,
Der Teil der am Z80-PIO drann haengt ist ein bestehendes System, da kann
ich nix anpassen. Also auch nicht den Widerstand. Wenn das "mein"
System waere, haette ich es gar nicht erst als Open Collector
ausgeführt. Mein System beginnt erst mit dem Transistor. Ich möchte
nochmal auf meine Schaltung unter
http://pofo.de/tmp/P8000_WDC_Emulator.pdf
hinweisen. Es geht hier um die Elemente 1T1, D5 (sehe gerade das '04 und
'138 die gleiche Bez. haben) und 1D6
Ich muss mich nochmal wiederholen ;) Vorher liefs so im AVR ab:
1. ASTB generieren durch setzen eines Pins am AVR am High welcher am
Transistor haengt (der Transistor zieht dann /ASTB an der PIO auf low).
2. direkt danach ohne irgendwelche Waits die Daten am AVR-Port lesen.
Das hat problemlos funktioniert, 0% Fehleraufkommen. Somit würde ich
eigentlich sagen, Transistor wie auch Z80-PIO sind schnell genug!
Jetzt lassen wir mal in meiner neuen Schaltung die ASTB Generierung
aussen vor. Die habe ich jetzt so wie früher direkt auf einen Port am
AVR gelegt. Also ich setze einen Port am AVR auf High und der Transistor
zieht den /ASTB an der PIO auf low - genauso wie ich es vorher hatte.
Schritt 1 ist also zu "frueher" identisch!
Was ich jetzt "neu" nach dem setzen von ASTB mache ist nicht mehr
direkt am AVR Port die Daten abholen sondern: 2.) '245 aktivieren, 3.)
vom '245 lesen. Und nun habe ich keine Daten, ausser wenn ich nach dem
aktivieren noch zwei nop()s einbaue? Ich habe doch nun eher mehr Zeit
verstreichen lassen als vorher - also die PIO hatte doch nun eher mehr
Zeit als vorher ihre Daten anzulegen, da ich vor dem Lesen noch eine
Aktion mehr mache - naemlich den '245 aktivieren. Somit kam ich halt zu
dem logischen Schluss, das mein 245 einfach zu lahm ist!
Habe jetzt den Transistor spaßeshalber mal durch einen 74LS03 ersetzt -
kein Unterschied - nach dem aktivieren des '245 brauche ich zwei nop()s
bis ich was sinnvolles lesen kann.
Wenn dein AVR mit 18 Mhz Takt läuft, sind das ~55 nanosec Periode.
Wenn ich das TI-74LS245 Datenblatt richtig lese hats vom Output-Enable
bis Output High oder Low 25 .. 40 nanosec. Delay (45 pF Load).
Das könnte schon schon mal einen NOP beim AVR erklären.
Der alte 74LS138 braucht auch noch so ca 10..20 nsec...
Der 74ls04 ..
Evtl. AHC(T) ist schneller, aber keine Ahnung wie gut beschaffbar,
siehe
http://www.ti.com/lsds/ti/logic/home_overview.page?DCMP=TIHomeTracking&HQS=Other+OT+home_p_logic
oder andere Siliziumbuden...
Oder: ASTB von 245 enable trennen, also 245 für mehrere Daten
enablen, -> laufzeit von 138 fällt weg,
und IN->OUT beim 245 ist etwas schnellar als TRISTATE -> OUT
In etwa so:
245 aktivieren
nop()
nop() ; ein alter Opa ist kein D-Zug
ASTB setzen
evtl nop()
-------> data in
ASTB rücksetzen
ASTB setzen
evtl nop()
-------> data in
ASTB rücksetzen
x mal
245 deaktivieren
--- ohne Gewähr ----
Ja, wenn ich den 245 früher aktiviere brauche ich überhaupt kein nop(),
das hatte ich auch schon getestet. Dann muss ich aber halt ASTB anders
schalten - wie du ja auch schreibst ;)
Warum sollte die PIO zu langsam sein? Im 1. Setup hing die PIO direkt am
AVR.
- ASTB setzen
- SOFORT lesen am AVR
hat problemlos geklappt. Wenn die PIO zu lahm waere, haette das nicht
geklappt, oder?
Bzgl. "LS oder HCT sind zu lahm" fällt mir auch noch ein - ich habe auch
F Schaltkreise probiert... die sollten nur so 2...3... ns Schaltzeiten
haben - ging auch nicht.
Kann es sein, das auf der Leitung vom PIO zum '245 irgendwie
"Elektroschrott" o. Aufladungen o. aehnliches sind, die erst etwas Zeit
brauchen, bis sie abgebaut sind, und der AVR das schneller schafft als
so n '245? (Weswegen es frueher direkt am AVR problemlos funzte, und
jetzt nur nach zwei nop()s?
>Somit kam ich halt zu dem logischen Schluss, das mein 245 einfach zu lahm >ist!
Timing von Bausteinen oder Bausteinketten werden nicht experimentell
bestimmt. Und schon gar nicht durch "logisches" Denken.
Der sauberste Weg ist eine worst-case-Betrachtung. D.h. einfach die
Laufzeiten aller Komponenten betrachten.
Dem Signal /ASTB würd ich einen ordentlichen Pull-Up verpassen, um es zu
beschleunigen, ebenso dem Signal /TR.
Der 74138 ist unglücklich gewählt. Er decodiert aus 3 Signalen 4 andere,
geht das nicht direkt ohne '138? Auch die read- und write-Signale
dahinter aus den vielen Gattern generiert sind Ballast.
Im Prinzip werden 6 Ausgangssignale aus 5 Eingangssignalen generiert.
Nimm 6 Portpins dafür und das Timing wird genial einfach.
Ich schrieb ja bereits, Die PIO direkt am AVR und ASTB direkt vom AVR
generiert läuft wunderbar. Ich benötige den Port-A aber für 4
verschiedene Dinge. Daher hängt die PIO die vorher direkt am Port-A hing
nun an nem 245 und da es mir generell an Pins fehlt, wird das ganze über
einen 138 selektiert.
http://pofo.de/tmp/P8000_WDC_Emulator.pdf
ich sehe nicht viel freie Ports oder Pins in dem Schaltplan mit dem ich
das anders lösen könnte als aktuell gelöst - bin aber gerne offen.
Ich weiss auch nicht, warum ASTB zu langsam sein sollte? Wenn ich es
genauso generiere wie vorher - also direkt vom AVR aus, und nicht über
den '138 und den '04, hat das keinen Unterschied erbracht gegenüber der
Generierung über den '138 und '04. Auf "der Transistor ist zu lahm" hin,
habe ich sogar noch ein 74LS03 eingebaut (hatte gerade keinen '06 da) -
auch das machte keinen Unterschied.
Also - ASTB direkt vom AVR erzeugt machte vom Verhalten her keinen
Unterschied zu ASTB vom /ENABLE des '245 abgeleitet.
Die PIO hängt in einem anderen Rechner, dort werkelt ein Z8001 mit 4
MHz.
ASM Listing habe ich auch verglichen, die "alte" ASTB Erzeugung brauchte
1 Takt da er n OUT Befehl gemacht hat, die neue ASTB Generierung
verbraucht 2 Takte, da ich halt kein direktes Assignment mache sondern
mit |= arbeite. Habe aber auch mal auf direktes Assignment hin getestet
- kein Unterschied. Aber wie gesagt, ich kann auch die alte ASTB
Erzeugung verwenden, und nur den '245 an- und ausschalten mit dem
gleichen Ergebniss - ich muss 2 Taktzyklen warten bevor ich vom 245
lesen kann.
Aber ich probiere das gerne auch nochmal mit den Pullups aus... was
nimmt man da so? 3K? Wo klemmt man die hin? Hinter den Collector des
Transistors?
Was ist mit meinen Punkten aus meinem letzten Posting.... Könnten
Widerstände gegen Masse was bringen, oder 33-100 Ohm Widerstaende in den
Leitungen vor dem '245? Wie ich gelernt habe ist der AVR ja MOS und der
'245 TTL - vielleicht verhalten die sich einfach grundsaetzlich anders
mit dem was da ankommt an Signalen.
Das hier war uebrigens meine alte Schaltung die ohne nop()s auskam zw.
ASTB setzen und Port lesen:
http://pofo.de/tmp/P8000_WDC_SDCard.pdf
Hi
>Ich schrieb ja bereits, Die PIO direkt am AVR und ASTB direkt vom AVR>generiert läuft wunderbar.
Na und. Du programmierst in C. Da können kleine Änderungen beim
Portzugriff locker ein paar Takte mehr oder weniger ausmachen. Das
Timing der PIO bezieht sich auf deren Takt und der Controller ist bei
einer 6MHz-PIO drei mal schneller.
MfG Spess
>Kann es sein, das auf der Leitung vom PIO zum '245 irgendwie>"Elektroschrott" o. Aufladungen o. aehnliches sind, die erst etwas Zeit>brauchen, bis sie abgebaut sind, und der AVR das schneller schafft als>so n '245?
Voodoo-Zauber kommt in der Elektronik selten vor.
Hab grad erst die Beschaltung des Signals /ASTB gesehen. Die Widerstände
330 Ohm und 220 Ohm gegen VCC und GND sind sinnvoll, wenn mit einer
Push-Pull-Stufe angesteuert wir. Nicht bei der Ansteuerung über
openCollector. Bei openCollector gehört der 220 Ohm Pull-Down
abgeklemmt, der 330 Ohm Widerstand dient dann als Pull-Up wie weiter
oben schon vorgeschlagen, aber anscheinend nicht beachtet. Das gleich
gilt für das Signal /TR.
Serienwiderstände sind bei hohne Frequenzen durchaus sinnvoll, aber wie
hoch sind denn die Frequenzen? Sieht eher nach lebendigem Gleichstrom
aus. Der sollte auch anders in den Griff zu kriegen sein.
Welchen PortPin Du freibekommen kannst, um den ganzen Decoderkram
einzusparen und damit das Timing übersichtlich zu machen, das mußt Du
entscheiden.
Die DIR-Umschaltung am 74245 ist auch etwas unglücklich gewählt.
Weiterhin stimms ja gar nicht, daß die PIO direkt an dem Stecker X2
aufliegt, da ist auch noch ein Treiber 8286 dazwischen.
Die gesamte Laufzeit über alle Bausteine macht Dir doch das Problem. Da
aber die einzelnen Bausteine kaum zu optimieren sind (außer dem Tausch
gegen F-Typen, was aber nicht die Lösung sein kann), mußt Du die
Ansteuerung der Enable, RD und WR-Signale verbessern. Vorschläge gab es
einige. Jetzt wäre die Umsetzung gefragt.
Also - wie schon gesagt.
http://pofo.de/P8000/notes/plaene/eigene/16-Bit-Rechner/Stromlaufplan.pdf
ist ein abgeschlossener Rechner - da kann und will ich weder
Widerstaende auslöten, noch andere Modifikationen vornehmen.
Die /ASTB und /TR Ansteuerung des Originalsystems welches ich durch
meinen AVR ersetzen will, kann man hier bestaunen:
http://pofo.de/P8000/notes/plaene/Winchester-Disk-Controller/Stromlaufplan_01.tiff
Dort wird auch mit einem '06 gearbeitet - also Open Collector.
Und bzgl. der C-Programmierung. Ich erwaehnte ja, das ich die ASM
Quellen verglichen habe.
Das Enable-Signal (Ich denke mal du meinst das Strobe auf die PIO) hatte
ich nach meinem Verstaendniss mit dem 74LS03 anstatt des Transistors
schon verbessert - ohne Erfolg. Soll ich nun noch ein Pull-Up verwenden?
Mir ist nur nicht ganz klar wo der hingehört.
Oliver Lehmann schrieb:> nach dem aktivieren des '245 brauche ich zwei nop()s> bis ich was sinnvolles lesen kann.
Wie schon oben gesagt, das muß so sein. Der 245 wird ja erst enabled und
danach liegen an dessen Ausgang die Daten an.
Vermutlich liegen an der PIO die Daten schon an, bevor man /ASTB = 0
setzt.
Nur dann geht es ohne 2 NOPs.
Um schneller zu werden, brauchst Du einen AVR mit externem Memorybus,
z.B. ATmega162.
Peter
Um mal aus dieser ganzen PIO-ASTB-Diskussion rauszukommen:
Was sollte denn passieren, wenn ich die Eingänge des '245 hart
verdrahtet (im wahrsten Sinne des Wortes) auf VCC ziehe, und dann den
'245 enable und dann von meinem Port lese - sollte ich doch 0xff lesen,
oder? Das dann direkt, oder auch wie Peter schreibt erst nach zwei
nop()'s?
Da solltest Du 0xff lesen, der 74LS245 sollte dazu schnell genug sein.
Die 220/330 Ohm Terminierung sollte auch für Open Kollektor Treiber
anstandslos funktionieren, da sich der H Pegel bei 3V und damit 600mV
über dem verbotenen Bereich für TTL einstellt.
Die Input threshold Voltages für einen Atmega16 liegen bei 5V Vcc bei H=
1,9V und L= 1,35V nach dem was ich aus dem Datenblatt lese. Das ist "H"
genug.
Die 220/330 Ohm Kombi terminiert die Leitung besser als ein einzelner
Pullup Widerstand.
Gruß,
Holm
Hallo Peter,
ich glaube dir ja (kanns auf Arbeit auch gerade nicht verifizieren ;))
Aber wie kann es dann sein, das ich mit dieser Schaltung hier:
http://pofo.de/tmp/P8000_WDC_SDCard.pdf
0x08 auf Port B schreibe mit einem OUT und direkt danach mit einem IN
die korrekten Werte von Port A lese?
Das muesste ja nach deiner Aussage her bedeuten, das schon vor dem OUT
auf Port-B die Daten an Port-A anlagen?
Ich glaube so langsam, ein LA muss her....
Oliver Lehmann schrieb:> Das muesste ja nach deiner Aussage her bedeuten, das schon vor dem OUT> auf Port-B die Daten an Port-A anlagen?
Ja.
Vermutlich arbeitet die PIO im Mode 0. Und dann liegen die Daten schon
an, bevor RDY auf 1 geht.
Du mußt also nur den 245 vorher enablen und die ganze Zeit enabled
lassen.
Peter
Hi Peter,
ich glaube du hast Recht. Ich habe mir mal die Assembler Quellen
(Z8001-ASM) des Hostrechners angeschaut. Die PIO im Hostrechner scheint
wie folgt programmiert zu werden:
Port-B der Pio ist standardmäßig im Control-Mode (D6+D7=11)
Port-A wird immer zwischen Input und Output umgeschaltet - also es wird
gar nicht der bidirektionale Modus verwendet!
Das lese ich zummindest so aus der ASM-Quelle:
http://cvs.laladev.org/index.html/P8000/firmware/MON16/p.disk.s?rev=1.1&content-type=text/x-cvsweb-markup
somit hat ASTB auch eine ganz andere Funktion als angenommen.
Bzgl ASTB steht im -PIO Handbuch Zu Mode 1:
> 1. Output mode: The positive edge of this strode is issued by the> peripheral to acknowledge the receipt of data made available by the> PlO.
Was heisst das genau? Mit dem setzen von Low auf High melde ich die
erfolgreiche Datenübertragung? D.h. vom Ablauf her:
- ARDY zeigt mir an, "es sind Daten abzuholen"
- Ich hole Daten ab
---> wie genau spielt ASTB jetzt da mit rein? Muss ich /ASTB an der PIO
auf Low setzen, und dann wieder auf high und mit dem Flankenwechsel von
Low auf High bestätige ich die Abholung? Ich habe den englischen Text
nicht 100% verstanden....
PIO Mode 1 ist Byteeingabe...Du willst aber von der PIO im konkreten
Fall etwas lesen. Byteausgabe ist Mode0.
Nach dem Einschreibevorgang (CPU ->Pio) wird mit der nächsten fallenden
Flanke des Sytemtaktes das READY Signal in den aktiven Zustand gebracht
(High). Mit der steigenden Flanke von READY wird der Peripherie klar
gemacht, dass sich neu geladene Daten im Ausgaberegister befinden und
gelesen werden können. Die positive Flanke das vom externen Gerät
seinerseits erzeugten /Strobe Impulses gilt als Quittung für die
erfolgte Übernahme der Ausgaberegisterdaten durch das externe Gerät, sie
löst falls die entsprechenden Randbedingungen gegeben sind (Int Freigabe
FF des Kanals gesetzt) die Anmeldung für einen Interrupt aus um der CPU
Bescheid zu geben das neue Daten ausgegeben werden können..
(frei nach Mikroprozessorsystem der II. Leistungsklasse, -Technische
Beschreibung - Schaltkreis für parallele Ein- und Ausgabe, PIO U855D"
RFT, Mirkomurx Marx Erfurt..
Gruß,
Holm
OK, bedeutet also faktisch - ich muss das /ASTB=Low setzen an der PIO
von er Aktivierung des '245 entkoppeln, da beides nichts miteinander zu
tun hat.
Ich aktiviere den '245 weil ich nachdem ich das RDY-Signal der PIO
bekommen habe lesen kann.
/ASTB ziehe ich aber nur auf Low, damit ich es nach dem erfolgten lesen
wieder auf high ziehen kann um der PIO zu sagen "ok, habe fertig".
> Das ist korrekt, da der AVR Eingänge im vorherigen CPU-Takt latcht.> ein NOP für das AVR-Latch und ein NOP für den 245 zum Durchschalten.
Heisst das eigentlich generell, das wenn man einen '245 aktiviert, und
danach direkt von ihm lesen will, man zwei nop()s braucht?
Ich meine - ich kann das jetzt auch entkoppeln (/ASTB generierung und
'245 aktivierung) und dann den '245 einfach schon viel früher aktivieren
- aber so vom Allgemeinen Verständniss? Also jedesmal wenn ich den '245
auf /enable = low ziehe, muss ich 2 Takte warten, bis ich davon lesen
kann?
Mir ist gerade folgendes in den Sinn gekommen, folgendes muesste ja
mglich sein:
Meine Lese Schleife lief ja früher so ab:
start:
- warte bis ARDY high wird
- setze ASTB auf low
- lese die Daten
- setze ASTB auf high
- warte bis ARDY low wird
- goto start
nun sieht die schleife ja so aus
start:
- warte bis ARDY high wird
- aktiviere den '245 und gleichzeitig setzt ASTB auf low
- nop()
- nop()
- lese die Daten vom '245
- deaktivier den '245 und gleichzeitig setze ASTB auf high
- warte bis ARDY low wird
- goto start
Nun kam mir in den Sinn, das /Enable-Signal des '245 zu nehmen, es wie
heute schon durch einen '04 zu jagen und dann daraus ein High Signal zu
bekommen. Dann nehme ich einen 74ls03, packe dieses high-/enable des
'245 an einen Eingang, und an den anderen Eingang packe ich das ARDY der
PIO. Heisst, ich aktiviere dann den '245 eher, aber /ASTB wird durch den
'03 erst ausgegeben, wenn die PIO ARDY auf high schaltet:
start:
- aktiviere den '245 und setze Pin1 des '03 auf High
- warte bis ARDY high wird -> dann ist Pin2 des '03 auf High
--> '03 gibt /ASTB aus
- lese die Daten vom '245
- deaktivier den '245 und Pin1 des '03 geht auf low -> /ASTB geht auf
high
- warte bis ARDY low wird
- goto start
Das sollte funktionieren denke ich - ich probiere es nachher gleich mal
aus.
+-----+
| |
| |
+-----+ | |
| | /En| |
+----o '04 +--+--+ '245|
/ASTB +-----+ | | | | | |
| +---+ +------ | | | +-----+>ADDR0-2
<----------o '03 | | | | | +----< AVR
| +---+ | +-----+ | +----< AVR
+-----+ | +-------------o '138+----< AVR
ARDY | | |
>--------------------+-----------------> AVR | |
+-----|
Jo - mit dem '03 und der zeitigeren Aktivierung des '245 funzt es nun
Problemlos.
http://pofo.de/tmp/P8000_WDC_Emulator.pdf
Ich aktiviere nun den '245 bevor ich anfange zu warten, das ARDY auf
high geht. Sobaldt ARDY auf high geht, generiert dann der '03 das
/ASTB=low Signal. Sobald ich mir die Daten abgeholt habe, deaktiviere
ich den '245 wieder. Dadurch wird dann auch automatisch das /ASTB = High
vom '03 generiert. Musste das ARDY Signal bei mir nur nochmal durch
einen Negator jagen, da ich es von der Pio negiert auf den
Steckverbinder gelegt bekomme.
1
do{
2
PORTD|=((1<<PIND5));//aktiviere '245
3
while(isset_info_wdardy());//warte bis /ARDY = low (active)
4
buffer[datacnt]=(uint8_t)port_data_get();// lese vom '245
5
PORTD&=~((1<<PIND5));//deaktiviere '245
6
while(!isset_info_wdardy());//warte bis /ARDY = high (deactive)