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?
Hallo, was soll das ...
1 | PORTC= (PORTC & clr_bit) | stat_command; |
machen - keine Definition zu finden. Musst du evl. eine bestimmete Länge für den Resetzyklus einhalten?! Sascha
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:
1 | #define clr_bit ~0b1111100
|
2 | #define stat_command 0b0111100
|
Die korrigierte Datei ist im Anhang.
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
Ich hab' die Def. mal geändert:
1 | #define clr_bit 0b10000011
|
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.
Hugo83 schrieb: > Ich hab' die Def. mal geändert: > >
1 | > #define clr_bit 0b10000011 |
2 | >
|
> > 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?
http://userpages.uni-koblenz.de/~physik/informatik/ECC/ide.pdf Vielleicht hilft dir das etwas speziell zum Timing gibts ein paar Angaben.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.