Forum: Mikrocontroller und Digitale Elektronik PATA Schnittstelle an AVR mit 2 Ports


von Oliver L. (ollil)


Lesenswert?

Hi,

ich würde gerne mit meinem ATMega "IDE" "sprechen". Ich habe aber 
aktuell nur noch zwei 8-Bit Ports und ein paar einzelne Pins auf einem 
3. Port frei. Wie bekomme ich also die 24 Signalleitungen angeschlossen?

Ich hatte folgende Idee:

Auf einen Port (nennen wir ihn Port-A) schalte ich alle 8 benötigten 
Steuersignale der PATA-Schnittstelle.

An den zweiten Port (nennen wir ihn Port-B) schließe ich 2 
Bus-Transiever
(z.B. 74245) an.

An meine übrigen 3 Pins des dritten Port schließe ich einen Adreßdekoder 
an (74138 oder irgend sowas).

Der Adressdecoder wird wie folgt verbunden:

0x01: /CS des Busstreiber "1" auf Low + Direction auf "Input"
0x02: /CS des Busstreiber "1" auf Low + Direction auf "Output"
0x03: /CS des Busstreiber "2" auf Low + Direction auf "Input"
0x04: /CS des Busstreiber "2" auf Low + Direction auf "Output"

Wenn ich nun Daten schreiben will, schiebe ich auf den Adressdecoder 
0x02, schiebe auf Port-B meine 16-Low Bits. Dann schiebe ich auf den 
Adressdecoder 0x04, und dann schiebe ich auf meinen Port-B meine 16-High 
Bits.
Dann sage ich über Port-A der Festplatte "Daten abholen".

Nun habe ich ein Problem - ich bräuchte Busstreiber welche die Daten 
puffern! Weil - wenn ich meinen 2. Bustreiber aktiv schalte um die 
16-High Daten drauf zu parken, geht ja mein 1. Bustreiber  wieder in den 
Schlummermodus - die Festplatte wird die 16Bit Daten aber "an einem 
Stück" brauchen, oder?

Wie macht man das? I2C-Portexpander hatte ich auch schon überlegt - kam 
mir aber von den Datenblättern recht lahm vor.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Ich würde eher ein Schieberegister mit parallel I/O wie 74LS194 (das ist 
aber nur für 4 bit, vlt. gibt's da auch 8 oder 16 Bit pendants?) 
einsetzen, dafür benötigst du 4 Leitungen. Vielleicht bleiben damit 
genügend weitere Pins frei und du kannst dir den Adressdecoder usw. 
sparen.

Klar ist das punkto Geschwindigkeit nicht berauschend, aber 
Geschwindigkeitsrekorde wirste mit dem AVR ohnehin nicht brechen. :)

von Hermann-Josef M. (hermann-josef)


Lesenswert?

Hi Oliver,

hätte auf 74HCT573 oder 74HCT574 getippt, wenn sie nicht leistungsfähig 
genug sind, kann man ja noch ein HCT245 oder HCT645 nachschalten. Hast 
Du Dir mal den IDE-MP3-Player zu der Procyon-AVRlib mal angeschaut?

http://www.procyonengineering.com/embedded/avr/avrlib/docs/html/index.html

und hier findet man das Schaltbild

http://www.procyonengineering.com/embedded/procyonmp3/index.html

Viel Erfolg
Hermann-Josef

von Thomas (kosmos)


Lesenswert?

74hc573 wären auch meine wahl, mehrere parallel, dann gibts du legst du 
deine 8 bits auf den Bus und ein kurzer Impuls an das entsprechende 
Latch welches die Daten übernimmt , danach die nächsten 8 Bits zum 
übernehmen gibts die nächsten 8 bits und ein anderes Latch antipsten. 
Wenn du alle 4 durch hast, ein gemeinsames Signal an alle Latches das 
sie ihre gespeicherten Daten ausgeben oder direkt so beschalten das Sie 
es gleich tun bei der Datenübernahme tun.

von Oliver L. (ollil)


Lesenswert?

Jo die Schaltung dieses MP3 Players sieht ganz gut aus - für einmal 8 
Bit die Latches könnte in der Tat reichen. Aber das muss ich mir noch 
überlegen weil.... öh - ich hab da noch einmal 8-Bit Eingangs und 
Ausgangsdaten die auch noch mit auf den Port müssen. Ich mache mir mal 
Gedanken.

von Frank K. (fchk)


Lesenswert?

Einfach einen größeren Controller nehmen?
Wenn Du einen AVR mit externem Memory-Interface nimmst (z.B. einen 
Mega1281), kannst Du IDE sehr viel performanter implementieren. Dann ist 
das ganze Faktor 5 oder 10 oder so schneller.

fchk

von Oliver L. (ollil)


Lesenswert?

Mag sein, aber das System ist auf die Sende und Empfangsgeschwindigkeit 
einer Z80-PIO die an nem Z8001 hängt angewiesen. Die Schnittstelle 
bremst das ganze so sehr aus, das Geschwindigkeit.... nunja - 500KB/Sec 
reichen mir - dann bin ich so schnell wie mit der SD-Card heute ;)

So sieht meine aktuelle Lösung aus... mal sehn ob ich noch Fehler finde 
;)

http://pofo.de/tmp/P8000_WDC_Emulator.pdf

So sah der Spaß vorher aus

http://pofo.de/tmp/P8000_WDC_SDCard.pdf

Müßte dann so funktionieren:

Schreibe Daten ATA (Latch=2D4)

Setze ADDR0 auf Low, ADDR1 auf Low
 -> alles deaktiv
Setze /ATA RD auf High
Setze /ATA WR auf Low
Setze ADDR0 auf High, ADDR1 auf High
 -> Nun werdent Daten in Den Address-Latch geschrieben
Schreibe 16H Daten auf D0-7
Setze ADDR0 auf Low, ADDR1 auf Low
 -> Latch-Enable auf Low, Output Enable auf High (Latch komplett 
deaktiv)
Schreibe 16L Daten auf D0-7
 -> Daten direkt an den ATA-Port legen
Setze ADDR0 auf Low, ADDR1 auf High
 -> Output-Enable des Latch setzen, und /WR Kommando an Festplatte 
senden
Setze ADDR0 auf Low, ADDR1 auf Low
 -> alles deaktiv

Lese Daten ATA (Latch=1D4)
Setze ADDR0 auf Low, ADDR1 auf Low
 -> alles deaktiv
Setze /ATA RD auf Low
Setze /ATA WR auf High
Setze ADDR0 auf Low, ADDR1 auf High
 -> Latch-Enable auf High, senden /RD Kommando an Festplatte.
Lese 16L Daten auf D0-7
Setze ADDR0 auf High, ADDR1 auf High
 -> Latch-Enable auf Low, /RD liegt nicht mehr an
    Festplatte an, Output-Enable am Latch
Lese 16H Daten auf D0-7
Setze ADDR0 auf Low, ADDR1 auf Low
 -> alles deaktiv

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.