Forum: Mikrocontroller und Digitale Elektronik ATA Floppy mit ATmega1284P ansteuern


von Hugo83 (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Sascha W. (sascha-w)


Lesenswert?

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

von Hugo83 (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Hugo83 (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Hugo83 (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Hugo83 (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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

von Hugo83 (Gast)


Lesenswert?

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?

von Thomas (kosmos)


Lesenswert?

http://userpages.uni-koblenz.de/~physik/informatik/ECC/ide.pdf

Vielleicht hilft dir das etwas speziell zum Timing gibts ein paar 
Angaben.

von Hugo83 (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hugo83 (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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
Noch kein Account? Hier anmelden.