Forum: Mikrocontroller und Digitale Elektronik 74LS245 zu lahm?


von Oliver L. (ollil)


Lesenswert?

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)

von Peter D. (peda)


Lesenswert?

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

von Fritz (Gast)


Lesenswert?

Die BC548 benötigen keine pullups, sind die schnell genug?
Wenn die an hochohmigen CMOS-Eingängen liegen bekommst du Probleme!

von Oliver L. (ollil)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Der Ablauf muß sein:
1
               _________
2
ARDY:     ____|         |____
3
          _____       _______
4
/EN-245:       |_____|
5
                  _
6
AVR-Read: _______| |_________
7
          ____________   ____
8
/ASTB:                |_|


Peter

von Oliver L. (ollil)


Lesenswert?

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?!

von Peter D. (peda)


Lesenswert?

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

von Oliver L. (ollil)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Oliver L. (ollil)


Lesenswert?

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!

von Oliver L. (ollil)


Lesenswert?

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.

von bko (Gast)


Lesenswert?

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 ..

von Oliver L. (ollil)


Lesenswert?

@bko aber was koennte man stattdessen nehmen?

Aktuell habe ich 04, 138 und 245 als HCT bestueckt.
Ich habe auch schon alle 3 als F bestückt. Brachte alles nix.

Ansonsten habe ich jetzt folgende Spielerein durch:

ASTB setzen
245 aktivieren
lesen
-------> Schrott

ASTB setzen + 245 aktivieren
lesen
-------> Schrott

ASTB setzen
nop()
nop()
245 aktivieren
lesen
-------> Schrott

ASTB setzen
245 aktivieren
nop()
nop()
-------> läuft

ASTB setzen + gleichzeitig 245 aktivieren
nop()
nop()
-------> läuft

von bko (Gast)


Lesenswert?

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 ----

von Oliver L. (ollil)


Lesenswert?

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 ;)

von spess53 (Gast)


Lesenswert?

Hi

Schon mal überlegt, ob nicht die PIO zu langsam ist, und nicht der 245?

MfG Spess

von Oliver L. (ollil)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

Hi

Mit welchem Takt wird den die PIO betrieben? Und hast du schon mal das 
Assemblerlisting von deinen Programmen verglichen?

MfG Spess

von spontan (Gast)


Lesenswert?

>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.

von Oliver L. (ollil)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von spontan (Gast)


Lesenswert?

>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.

von Oliver L. (ollil)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Oliver L. (ollil)


Lesenswert?

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?

von Holm T. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Oliver Lehmann schrieb:
> oder auch wie Peter schreibt erst nach zwei
> nop()'s?

Wenn Du mir nicht glaubst, schau ins AVR Datenblatt.
1
char i;
2
PORTB = 0x00;
3
PORTB = 0xFF;
4
i = PINB;
Was steht in i ?
Natürlich 0x00.


Peter

von Oliver L. (ollil)


Lesenswert?

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....

von Peter D. (peda)


Lesenswert?

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

von Oliver L. (ollil)


Lesenswert?

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....

von Holm T. (Gast)


Lesenswert?

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

von Oliver L. (ollil)


Lesenswert?

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?

von Oliver L. (ollil)


Lesenswert?

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     |     |
                                                 +-----|

von Oliver L. (ollil)


Lesenswert?

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)
7
        datacnt++;
8
    } while ( datacnt < count );

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.