Hallo zusammen!
Ich hab' mir aus einem alten PC zwei Diskettenlaufwerke mit
ATA-Anschluss (Modell LKM-F934-1) ausgebaut und möchte nun versuchen,
diese über einen ATmega1284P anzusprechen. Leider klappt schon das
Abfragen des Statusregisters nicht.
Ich wollte es einfach erst mal in einer Dauerschleife abfragen und den
ausgelesenen Wert in Binärschreibweise per TWI an einen anderen µC
senden, der diese dann auf einem Display ausgibt. Die Ansteuerung des
Displays funzt problemlos, allerdings bekomme ich (bei aktivierten
Pull-ups) immer nur lauter einsen raus (also den Byte-Wert 255).
Das ATA-Kabel habe ich auf einem Steckbrett direkt mit dem µC
verdrahtet:
PORTD : Lo-Byte Datenbus
PORTA : High-Byte Datenbus
PC7 : Reset
PC6 : Chip select 1
PC5 : Chip select 3
PC2-4 : Adresse
PB0 : DIOW-
PB1 : DIOR-
Der Quellcode ist im Anhang.
Der µC wird über einen externen Quarz mit 16MHz getaktet.
Das Laufwerk ist in Ordnung, wenn ich es in einen PC einbaue, erkennt
der es problemlos.
Hat jemand eine Idee, woran es liegen könnte, dass ich keine Werte
zurückbekomme?
Uups, sorry. Hab' beim Kopieren nicht richtig aufgepasst...
clr_bit ist eine Konstante, mit der die Adress- und die Chipselectbits
ausgeschaltet werden, stat_command ist die einstellung dieser Leitungen,
mit der das Statusregister ausgewählt wird:
Hallo nochmal,
ich hab' mal ein paar delay's zwischen dem Abschalten des Resetsignals
und dem Adressieren des Statusregisters gesetzt, kriege aber nach wie
vor nur 255 raus.
Ich habe dann noch mal versucht, eine 320GB-Platte von Seagate
anzusprechen, leider mit dem gleichen Ergebnis.
Hugo83 schrieb:> #define clr_bit ~0b1111100
Damit ist clr_bit= 0b0000011 auf 8Bit erweitert also 0b00000011 !
Beim verunden mit PortC wird PC7, alias Reset, wieder Low und damit
aktiv.
Sascha
Funktionieren tut es leider immer noch nicht.
@Sascha:
Bist du sicher? Ich hätte gedacht, dass die oberen Bits ebenfalls
invertiert werden. Dafür würde sprechen, dass eine LED, die ich parallel
an PC7 angeschlossen habe, nach dem invertieren von Reset die ganze Zeit
an bleibt.
>> Funktionieren tut es leider immer noch nicht.>> @Sascha:> Bist du sicher?
habs noch nicht probiert, in C programmiere ich nichts
> Ich hätte gedacht, dass die oberen Bits ebenfalls> invertiert werden. Dafür würde sprechen, dass eine LED, die ich parallel> an PC7 angeschlossen habe, nach dem invertieren von Reset die ganze Zeit> an bleibt.
langt der Pegel dann noch wenn eine LED parallel mit dranhängt?
Läuft die Festplatte an?
Sascha
Ja, sowohl die Platte als auch das Diskettenlaufwerk laufen deutlich
hörbar an, wenn ich eins davon anschließe.
Die LED ist definitiv nicht das Problem, denn wenn ich sie abstöpsel
ändert sich nichts (außer das die LED nicht mehr angeht natürlich).
Könnte es ein Problem sein, dass die Schaltung auf einem Steckbrett
zusammengebaut ist (Stichwort hohe Kapazität der Steckfedern)?
Hugo83 schrieb:> Hat jemand eine Idee, woran es liegen könnte, dass ich keine Werte> zurückbekomme?
Hast Du Dir schonmal das Timing der ATA-Schnittstelle angeschaut?
Maik
Ich habe mir die Diagramme schon ein paar mal angesehen, aber mir ist
nicht ganz klar, worauf du hinaus willst.
Wenn ich das richtig sehe, gibt es keine Obergrenze für die Dauer der
Hostaktionen, demnach kann der µC im Grunde gar nicht zu langsam sein.
Und was zu große Kontrollergeschwindigkeiten betrifft:
Bei einer Taktfrequenz von 16MHz wäre ein Prozessortakt 62,5ns lang. Da
zwischen dem Anlegen der Adresse und dem Einschalten von DIOR mindestens
70ns vergehen müssen, sollten an der entsprechenden Stelle im Quellcode
zwei "NOP"'s reichen.
Wenn ich die einbaue, funktioniert es aber selbst dann nicht, wenn ich
folgendes beachte:
Bei 8-Bit-Übertragungen muss ein DIOR-Puls mindestens 290ns lang sein,
davon müssen die Daten mindestens 50ns lang fest auf dem Bus liegen,
demnach darf das Laufwerk doch maximal 240ns brauchen, um die
Busleitungen auf die entsprechenden Werte zu ziehen, das entspräche 4
"NOP"'s Wartezeit nach anlegen des DIOR-Signals.
Mit dem IORDY-Signal kann das Laufwerk zwar mehr Zeit zum Anlegen der
Adresse beanspruchen, laut timing Diagramm aber maximal 1,25us, und
selbst wenn ich die 4 "NOP"'s durch ein 2us-delay ersetze, funktioniert
es immer noch nicht.
Oder habe ich da was falsch verstanden?
Mmmh... Bei dem Timing-Diagramm der ATA-Spezifikation macht mich was
stutzig: nach dem "Abschalten" der Adresse ist noch mal eine steigende
Flanke des DIOR/DIOW-Signals eingezeichnet.
Aber zu Beginn der nächsten Übertragung muss das Signal doch wieder aus
sein. Wann soll das passieren? Und wieso ist da überhaupt nochmal eine
steigende Flanke? Erwartet das Laufwerk, dass die Schreib-/Leseoperation
am Ende einer Übertragung noch mal für eine ungültige Adresse initiiert
wird?
Hugo83 schrieb:> Erwartet das Laufwerk, dass die Schreib-/Leseoperation> am Ende einer Übertragung noch mal für eine ungültige Adresse initiiert> wird?
DIOW/DIOR sind active-low -Signale. Mit der steigenden Flanke werden
die deaktiviert.
Vielleicht ist das ja die Ursache dafür, daß Du nichts lesen bzw.
schreiben kannst.
Hugo83 schrieb:> Ich habe mir die Diagramme schon ein paar mal angesehen, aber mir ist> nicht ganz klar, worauf du hinaus willst.> Wenn ich das richtig sehe, gibt es keine Obergrenze für die Dauer der> Hostaktionen, demnach kann der µC im Grunde gar nicht zu langsam sein.> Und was zu große Kontrollergeschwindigkeiten betrifft:> Bei einer Taktfrequenz von 16MHz wäre ein Prozessortakt 62,5ns lang. Da> zwischen dem Anlegen der Adresse und dem Einschalten von DIOR mindestens> 70ns vergehen müssen, sollten an der entsprechenden Stelle im Quellcode> zwei "NOP"'s reichen.
Wenn das Timing sowieso so unkritisch ist, dann spricht auch nichts
dagegen, dass man es für erste Versuche in den Sekundenbereich ausdehnt,
so dass man als Mensch (der keinen Park an Messgeräten wie zb
Logikanalysator sein eigen nennt) auch mit ein paar LED noch am Bus
'mitlesen' kann, wer wann welche Leitung auf welchen Pegel zieht.
Nichts ist in der Entwicklung hinderlicher, als wenn man meint, gleich
mal alle Zeiten auf ihrem Minimum ausreizen zu müssen. Erst mal muss es
funktionieren, dann macht man es schnell.
Rufus Τ. Firefly schrieb:> DIOW/DIOR sind active-low -Signale. Mit der steigenden Flanke werden> die deaktiviert.
Sorry, da habe ich mich wohl missverständlich ausgedrückt.
In dem Diagramm bedeutet eine steigende Flanke in der Kurve, dass das
Signal angelegt, also bei active-low -Signalen die Leitung auf low
gezogen wird.
Ich lade mal einen Screenshot von dem Diagramm hoch, in dem ich die
fragliche Stelle markiert habe.
Hugo83 schrieb:> Rufus Τ. Firefly schrieb:>> DIOW/DIOR sind active-low -Signale. Mit der steigenden Flanke werden>> die deaktiviert.>> Sorry, da habe ich mich wohl missverständlich ausgedrückt.> In dem Diagramm bedeutet eine steigende Flanke in der Kurve, dass das> Signal angelegt, also bei active-low -Signalen die Leitung auf low> gezogen wird.
Ja.
Genau das ist die Definition von active-Low.
Der Wechsel auf Low (bzw. der Pegel von Low) bedeutet, dass etwas
passiert.
Klarerweise muss die Leitung aber auch irgendwann wieder mal auf High
zurück kehren, damit sie dann später irgendwann auch wieder mal auf Low
kommen kann, damit etwas passiert.
Bei derartigen die Sachen meistens so ab:
Zuerst legst du die Daten an (stellst eventuell noch ein paar
Sondersignale ein) und dann, wenn alles am Bus korrekt eingestellt ist,
dann kommt auf einer Leitung ein Puls. In deinem Fall (wegen active-Low)
bedeutet Puls dann eben: Die Leitung geht auf Low und wieder zurück auf
High.
Wann genau der andere Busteilnehmer mit der Arbeit anfängt, hängt vom
konkreten Bus ab bzw. auch von der Operation die durchzuführen ist. Es
gibt da mehrere Möglichkeiten
* entweder der andere Busteilnehmer beginnt mit seiner Arbeit bereits
bei der fallenden Flanke
* oder aber, er wartet, bis die Leitung wieder auf High zurück geht.
Aber egal wie - das Muster
1
'erst alles am Datenbus einstellen' -
2
'dann an einer bestimmten Leitung wackeln, wobei dir die Leitungsbezeichnung sagt ob du von High nach Low oder von Low nach High' wackeln musst
dieses Vorgehensmuster findet sich in fast der gesamten Programmiererei
immer wieder. Eine Leitung hat eine Sonderstellung. Sie bleibt in ihrer
Ausgangslage (in deinem Fall High) während du die Datenleitungen
einstellst und mit einem Puls an genau dieser einen Leitung löst du die
Aktion aus.
Und Active Low bedeutet nun mal, dass der inaktive Zustand dieser
Leitung ein High ist. In diesen Zustand muss die Leitung irgendwann
zurück kehren.
Wenn von einem Gerät gelesen werden soll, dann muss es da klarerweise
mehrere getrennte Phasen geben:
die eine Phase, in der ich dem Gerät mitteile von wo ich eigentlich
lesen will
die nächste Phase, in der das Gerät die angeforderte Information besorgt
die dritte Phase, in der das Gerät die Daten auf den Bus legen kann
und die letzte Phase, in der sich das Gerät wieder schlafen legt und den
Bus in Ruhe lässt (weil es ja auch noch andere Geräte auf dem Bus geben
kann, die Daten übertragen wollen)
Das ganze 'Konzert' mit Select Leitungen und Write bzw. Read Leitungen,
dient nur dazu, genau diese Phasen zu synchronisieren und zu steuern.
Einfach mal logisch überlegen, wie du (als Person) das mit einer Gruppe
von blinden Taubstummen machen würdest, die nur auf Armdrücken
reagieren können. Dann erklären sich die Diagramme fast von selbst und
das eigentlich Interessante in den Diagrammen sind nur noch die
eingetragenen Zeiten, die einzuhalten sind.
Hugo83 schrieb:> Rufus Τ. Firefly schrieb:> Ich lade mal einen Screenshot von dem Diagramm hoch, in dem ich die> fragliche Stelle markiert habe.
das da hinten ist Quatsch, hab hier noch was gefunden
http://www.tecchannel.de/storage/komponenten/401279/von_pio_bis_ultradma/index3.html
sieht so aus, als ob Read/Write aktiviert (LOW) wird (für 70ns),
nach dieser Zeit werden zu schreibende Daten mit der steigenden Flanke
übernommen. Zu lesenden Daten stehen nach den 70ns zur Abholung bereit.
Bis zum nächsten Zugriff muss Read/Write dann für mind. 25ns auf High
sein.
Sascha