Forum: Mikrocontroller und Digitale Elektronik Festplatte Timing


von Christoph W. (christoph)


Lesenswert?

Hallo.

Hat schonmal jemand eine Festplatte über das XMEM-Interface bei einer
Taktfrequenz > 10 MHz angesteuert (ATMEGA 64/128) ? Ich munkele
momentan über das Timing. Die Festplatte unterstützt zwar den PIO-Modus
4, bei dem das Timingtechnisch kein Problem wäre, aber bei low-level
Real-Mode Versuchen mit einem alten Pentium konnte ich zwar super auf
die Platte zugreifen, aber die nachgemessenen Signalzeiten entsprachen
denen von PIO 0. Ein Umschalten über die SET FEATURES hat auch nichts
gebracht.

Das Internet war auch nicht sehr hilfreich und der hier im Forum oft
angebrachte Link auf www.mp3projects.com bringt auch keine näheren
Informationen dazu. Könntet ihr mir bitte einen Link zu einem
Sourcecode zur Festplattenansteuerung mit einem AVR posten, am besten
via XMEM ?

XMEM ist gewählt, da außerdem noch ein RAM, LCD und SD-Interface an den
Chip muss und für separate Busse die 53 I/Os bei weiten nicht
ausreichen.

Vielen Dank für jegliche Hilfe !

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie löst Du das Problem der 16-Bit-Zugriffe? Der AVR hat ja nur einen
8-Bit-Datenbus, die Datenregister von Festplatten aber sind 16 Bit
breit; und meines Wissens unterstützt kaum eine Festplatte eine
8-Bit-Betriebsart.

von Christoph W. (christoph)


Lesenswert?

Ja. Das hatte ich vergessen hinzuschreiben.

D0-7 von der Festplatte gehen an DA0-7 vom AVR. A0-2 von der Festplatte
geht über das Addresslatch an DA0-2 (normal).

DD8-15 geht an ein Latch, dessen Ausgänge per Software hochohmig
geschaltet werden können. Der Latch-Enable ist mit dem invertierten
Festplatten-Read-Signal verbunden und empfängt demzufolge D8-15 beim
lesen von der Festplatte. Dabei muss der OE des Latches aktiv sein und
der AVR Port als Eingang definiert.

Um auch Schreiben zu können, wird der Latch deaktiviert und der Port
auf Ausgang gesetzt. Dann treibt der AVR die Signale D8-15 der
Festplatte direkt über 220 Ohm Widerstände, die parallel zu den
Latch-Ein-und-Ausgängen laufen.

Beim Lesen demzufolge :
1. Latch OE aktivieren
2. Lesen des LOW-Bytes vom XMEM-Interface
3. Lesen des HIGH-Bytes vom Port.

Beim Schreiben analog :
1. Latch deaktivieren
2. Schreiben des HIGH-Bytes auf den Port
3. Schreiben des LOW-Bytes auf das XMEM-Interface

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, das dürfte die bei der Festplatte ankommende reale Taktfrequenz
der Zugriffe ja doch drastisch reduzieren.

Allerdings ist ein Vergleich von Taktfrequenzen hier nicht sehr
hilfreich, interessanter wäre ein Vergleich des spezifizierten
Timing-Diagrammes der Festplatte mit dem aufgrund Deines Aufbaus
resultierenden Timings.
Das Festplattentiming wird in Normdokumenten und auch
Festplattendatenblättern beschrieben, ist allerdings mit einer gewissen
 Vorsicht zu betrachten, da oft nicht die realen Pegel, sondern die
logischen Funktionen dargestellt werden. Das ist ein sehr
theoretisch-akademischer Ansatz und hat auch in diesem Forum schon viel
zu Verwirrung und Fehlinterpretationen geführt.
In diesem Thread
(http://www.mikrocontroller.net/forum/read-1-202047.html#202047) habe
ich mal mit jemandem zusammen ein Festplattentimingdiagramm zerlegt.

Vielleicht hilft ja bereits diese Betrachtung.

Viel Erfolg.

von Benedikt (Gast)


Lesenswert?

Wenn ich das jetzt richtig gelesen habe, dann liegt die Zugriffszeit im
Standart Modus bei 290ns. Mit 2 Wait States erlaubt das maximal 10MHz
Taktfrequenz des AVRs. Das erklärt einiges... Ich hätte vielleicht
vorher mal die IDE Specs lesen sollen, ehe ich meinen mp3 Player
entworfen habe. Jetzt weiß ich immerhin, wiso ich den uC so stark
runtertakten musste.

Für CF Karten gilt übrigends dasselbe Timing. Im Moment habe ich einen
mp3 Player mit 18,432MHz laufen (rund 150ns statt der zulässigen
290ns). Es geht so einigermaßen. Ab und zu hängt sich alles auf, da die
Clusterchain eine Endlosschleife bildet, die auf der Stelle stehen
bleibt, oder einen ungültigen Cluster Wert liefert, was die CF karte
mit einem Fehler beantwortet.

von Christoph W. (christoph)


Lesenswert?

Ja ... nur wie schaltet man zwischen PIO 0 und PIO 3/4 um, wenn nicht
über die SET FEATURES Befehle ?
Das wäre nämlich nicht so schön, wenn ich den AVR nicht mit 14,318 MHz
takten könnte, um das XMEM-Interface für einen 70ns RAM und die
Festplatte verwenden zu können.

von Benedikt (Gast)


Lesenswert?

Wie erkennt man, welchen PIO Mode die Festplatte kann ?

Um die Infos auszulesen, müsste man den AVR runtertakten, die Infos
lesen, den PIO Mode wechseln, und könnte den AVR dann hochtakten.

von Christoph W. (christoph)


Lesenswert?

Über den IDENTIFY DEVICE Befehl (0xEC). Der gibt eine 512 Byte
Datenstruktur zurück, und da steht der Modus auf Word 64 (+/- 3 Words,
so genau weiß ich das jetzt auch nicht mehr). Nachzulesen auf den
ATA´-Spezifikationen von www.t13.org

Ich dachte, dass ich zuerst den XMEM-Bus anschalte, um den RAM zu
testen, dann schalte ich ab, um manuell das Timing für die Festplatte
zu machen. Wenn das Umschalten und so weiter erledigt ist, schalte ich
wieder auf XMEM um und kann dann hoffentlich mit dem schnelleren Timing
auf die Festplatte zugreifen.

von Benedikt (Gast)


Lesenswert?

Ich habs gerade mal bei meinen CF Karten ausprobiert:
Diese gibt nichtmal Infos aus, welcher PIO Mode unterstützt wird.

Wie hast du eigentlich auf dem PC das Timing nachgeprüft ?

von Jens (Gast)


Lesenswert?

/*
Das wäre nämlich nicht so schön, wenn ich den AVR nicht mit 14,318 MHz
takten könnte, um das XMEM-Interface für einen 70ns RAM und die
Festplatte verwenden zu können.
*/

Wo ist das Problem, selbst 4MHz reichen für einen MP3-Player völlig
aus.

von Benedikt (Gast)


Lesenswert?

>Wo ist das Problem, selbst 4MHz reichen für einen MP3-Player völlig
aus.

Kommt darauf an:
Wenn man wenig RAM hat, die Festplatte langsam ist und man für FAT32
andauernt auch noch die FAT Daten nachladen muss, dann wirds kritisch.

Mein mp3 Player mit CF läuft im Moment mit 8MHz. Bei 4MHz habe ich ab
und zu Aussetzter.

von Christoph W. (christoph)


Lesenswert?

Ich baue aber keinen MP3-Player. Mir geht es um ein
SD-Festplatten-USB-Interface. USB geht über eine IDE->USB-Brigde raus.
Der AVR kommuniziert mit der HD, indem er die Bridge "abschaltet".
Ebenfalls soll es später noch möglich sein, eine beliebige Datei
anzuzeigen/zu editieren. Vorzugsweise Text.

@Benedetto:

Manche Informationen erscheinen nicht für manche Geräte. Um
herauszufinden welche erscheinen und welche nicht müsste man die
Spezifikationen wälzen. Beispielsweise ist am Ende eine Reihe von
Daten, die nur für CF-Karten sind und in der Mitte eine Reihe nur für
Festplatten. Bei anderen Anwendungen sind die einfach 0.

Das Timing hab ich nachgeprüft, indem ich mit einem Oszi den IDE-Bus
eines alten Pentium ® 1-Boards angezapft habe.

von Benedikt (Gast)


Lesenswert?

Hast du am PC auch was umgestellt, oder nur die Festplatte auf PIO Mode
3 geschaltet ?

Irgendwo am PC muss sich das Timing ja auch umschalten lassen.

von Jens (Gast)


Lesenswert?

@Benedikt

Mein Player läuft mit 4MHz (ATmega128), externem 32kB SRAM und einer
Platte mit FAT32 am Speicherbus. Ebenfalls ist ein Grafikdisplay mit an
diesem Bus. Bisher hatte ich noch keine Aussetzer und ich benutze nur
einen 4kB Buffer, werte noch mehere Tasten und zwei Drehgeber aus.

von Benedikt (Gast)


Lesenswert?

@Jens
Mit meiner 800MB Platte hast du mit Sicherheit Aussetzter...

von Jens (Gast)


Lesenswert?

Denke nicht, habe es bei mir auch mit einer alten 250MB Platte von
Samsung getestet, keine Probleme.

von Benedikt (Gast)


Lesenswert?

Die Platte die ich verwende, braucht rund eine halbe Sekunde bis die
Daten zur Verfügung stehen. Keine Ahnung warum die so lahm ist.

von Benedikt (Gast)


Lesenswert?

@Jens
Wenn du eine 250MB Platte verwendest, dann kann deine Software also
auch CHS adressieren ?
Wie erkennst du ob Platte LBA/CHS benötigt ? Das entsprechende Bit
stimmt bei mir nicht immer, ich habe eine 100MB Platte die mir sagt sie
könnte LBA (was natürlich nicht kann). Könntest du mir mal den Code
schicken der die CHS/LBA Adressierung macht ?

von Christoph W. (christoph)


Lesenswert?

@Benedikt:

Wo stellt man denn im PC das Timing um ? (Welche Ports ?)

von Benedikt (Gast)


Lesenswert?

Kein Ahnung wo man das Timing umstellt, deshalb habe ich ja die Frage
überhaupt gestellt.
Aber irgendwo muss sich das Timing ja umstellen lassen, wenn das
Mainboard die ganzen PIO Modes unterstützt.
Ich habe Festplatten bisher nur an selbst gebauten ISA-IDE Adaptern per
Assembler im PC angesteuert, und da war das Timing fest.

von Christoph W. (christoph)


Lesenswert?

Das könnte nämlich auch erklären, warum sich das Timing in meinen
Testprogrammen irgendwie beim Auslesen geändert hatte. Nach so ca.
50000-300000 Sektoren bestand ein Lesen nicht mehr aus einem IOR-Puls,
sondern aus zwei kürzeren mit kurzer Pause dazwischen. Keine Ahnung
warum das Mainboard (vor allem im REAL-MODE, wo ich bis auf automatisch
ausgeführte Biosinterrupts alles unter Kontrolle hab) sich plötzlich
dazu entscheidet, das Timing zu ändern.

Hat villeicht jemand eine Porttabelle für Mainboards ? Also ... Welche
Addressen für welche Geräte stehen (z.B. 0x01F0 für 1.IDE Controller,
usw.)

von Benedikt (Gast)


Lesenswert?

0x01F0-0x01F7 und 0x03F6 sind der 1. IDE Controller
Irgendwo habe ich noch ein paar Datenblätter zu einem P1 Chipsatz. Da
steht vermutlich noch mehr drin.

Leider suche ich mittlerweile die Infos lieber im Internet als auf
meiner Festplatte: Das ist einfacher und schneller...

von Benedikt (Gast)


Lesenswert?

Im Prinzip ist es aber auch egal.
Hast du schonmal versucht die Festplatte auf PIO Mode 3 umzuschalten,
und dann einfach den AVR hochgetaktet ?
Wenn alle Daten OK sind, wird es funktioniert haben, ansonsten nicht.
Außerdem sollte man dem Feature Set Command aus dem Error Register
auslesen können, ob die Platte den Befehl angenommen hat.

von Michael A. (aim)


Lesenswert?

Bei Elektor gabs mal ein Interface, das es ermöglichte, eine Festplatte
am 8Bit µC Bus anzusteuern. Im dazugehörigen Artikel war auch eine
Beschreibung, wie man die Festplatte ansteuert. Vileicht hilft das
weiter?

Gruß
AiM

von Netbandit (Gast)


Lesenswert?

mal eine dumme Frage:

Warum willst du unbedingt die Memoryschnittstelle des AVR benutzen?
Wenn die dir zu schnell ist hänge die Platte einfach an ganz normale
Pins und erledige das ganze Ansteuern und Timen selbst...

von Christoph W. (christoph)


Lesenswert?

Ich hab wie gesagt auch noch den RAM im Spiel (128KB).

Manuell gesteuert ergibt das :

17 Address + 16 Daten + 2 Steuerleitungen + 2 CS + 2 HD-CS + 1
USB-Bridge abschalten = 40
Dann noch RS232 = 42
+ SD Interface = 46
53 (verfügbar)-46 = 7

Und 7 Pins sind etwas wenig, um eine Tastaturmatrix UND ein LCD
dranzuhängen.

Das ganze ist also nur wegen akkutem Pinmangel entstanden.

Übrigens : Die Schaltung ist noch nicht aufgebaut.

von Netbandit (Gast)


Lesenswert?

Ach quatsch, das ist voll ausreichend... mit 7 Pins könnte ich noch 7
weitere µCs per 16bit Bus ansteuern g

Pinmultiplexing heißt das Zauberwort. Das Display kann bis auf den CS
Pin komplett parallel zur HDD hängen :) (Achtung in diesem Fall beim
standart x*x Zeilen Display die Datenleitungen mit 10k Pull Up
Widetsänden versehen, sonnst gibt es Fehler)

von Daniel B. (khani)


Lesenswert?

Hallo,

ich kann das Pinproblem nicht ganz verstehen. Vor allem bei Festplatten
kann man doch super auch noch andere Sachen an die Pins hängen. Wenn man
eine "ungültige" CS1:0 DA2:0-Kombination anlegt, dann sollte die
Festplatte (und das tut sie auch) ihre DD15:0-Pins auf tristate
schalten. Problemlos kann man an die selben Pins des Controllers andere
tristate-fähige Hardware hängen.
Wenn die andere Hardware aus irgendeinem Grund nicht tristate-fähig ist
und auf die Pins Ausgänge legt, dann muss man sie eben noch mit
Widerständen absichern.
Ich habe hier an einem ATmega32 in DIP folgendes hängen :
 - UART
 - LCDisplay
 - Festplatte
 - VS1003B (MP3-Decoder von vlsi)
Das übersteigt locker die Anzahl der Pins. Alle Hardwarekomponenten
liegen mit pins (also nicht über latches) am Mikrocontroller. Man muss
eben multiplexen.

MfG, Daniel.

von Christoph W. (christoph)


Lesenswert?

Und das Display Timing ? Die brauchen doch einen mindestgroßen
Read-Puls.

Hat eigentlich jemand Infos, was mit den Pollin GLCDs (128x64, 8KB RAM,
Beleuchtung) passiert ist ? Sind die etwa schon alle ?

Aber zurück zur Überschrift : Hat es schonmal jemand in den PIO-Modus 3
geschafft und die Festplatte per XMEM und 14,318 MHz angesteuert ?
Haltet ihr es überhaupt für möglich (laut Datenblatt soll es ja so
sein) ?

von A.K. (Gast)


Lesenswert?

"Sind die etwa schon alle ?"

Guck mal bei ebay rein, dann weisst Du wo die alle geblieben sind.

von Jens (Gast)


Lesenswert?

> Und das Display Timing ? Die brauchen doch einen mindestgroßen
> Read-Puls.

Kommt aufs Display an. Welche mit T6963 sind sehr schnell und können
direkt am Bus betrieben werden, bis 8MHz sollte es keine Probleme
geben.

@Benedikt:

Das mit LBA/CHS ist ne interessante Sache, darüber habe ich mit nie
Gedanken gemacht weil meine erste Platte eine 40GB-Platte war, die ja
per LBA adressiert wird. Ich habe dann testweise die 250MB Platte
drangeängt und die lief auch sofort mit LBA. Umgestellt habe ich da
nichts.

von Christoph W. (christoph)


Lesenswert?

Wo bekommt man die denn günstig her ? Unter 30 € scheint da ja nichts
drin zu sein ...

von Jens (Gast)


Lesenswert?

Hatte meins hier aus dem Forum für 25 Euro.

von Benedikt (Gast)


Lesenswert?

@Jens
Eine 250MB Platte die LBA kann ? Ich wusste garnicht, dass es sowas
gibt.
Meine größte Platte die nicht in einem PC eingebaut ist, ist eine 1GB
Notebook Platte.
Im Moment ärgere ich mich mit 240MB Platten rum...

@Christoph
Es gibt da ein Sprichwort:
Wer zu spät kommt den bestraft das Leben.

Pech gehabt, ich habe mir einige davon gesichert (bei dem Preis kann
man die GLCDs auch als TXT LCDs einsetzen, sind auf jedenfall billiger
als normale 4x40 HD44780 LCDs.

von Jens (Gast)


Lesenswert?

@Benedikt

Ja meine Samsung-Platte ist sehr merkwürdig, die hat z. B. auch kein
beschalteten Reset-Pin.

von Benedikt (Gast)


Lesenswert?

@Jens

Verwendest du eigentlich nur FAT32 oder auf FAT16 ?
Wertest du lange Dateinamen aus ?

von Jens (Gast)


Lesenswert?

Nur FAT32 mit langen Dateinamen.

von Benedikt (Gast)


Lesenswert?

Wie liest du die langen Dateinamen ?
Die werden ja im Prinzip rückwärts gespeichert:
Irgendwo steht der normale Eintrag mit dem 8+3 Namen, dem Startcluster
usw.
davor stehen dann die einzelnen Blöcke mit den langen Namen.
Soweit funktioniert das bei mir problemlos.
Wenn jetzt aber einer der Blöcke die Sektorgrenze überschreitet gibt es
bei mir Probleme.
Wie hast du das gelöst ? Im prinzip muss man die Einträge ja von hinten
nach vorne lesen, was bei FAT32 aufgrund der Clusterkette beim Root
nicht möglich ist.

von Jens (Gast)


Lesenswert?

Hallo Benedikt,

Ich habe mir einen Puffer für einen langen Dateinamen angelegt:

unsigned char Buffer[256];

In diesen schreibe ich geziehlt an die jeweilige Stelle den Teil des
langen Namens, der gerade im Fateintrag vorhanden ist. Die einzelnen
Teile haben ja einen Index und so weiß man beim ersten auftretenden
Teil  an welche Stelle im Buffer es kopiert werden muß, da dieser
Eintrag ja auch gleichzeitig der letzte ist. Ich fülle also meinen
Buffer von hinten auf und geben ihn dann logischerweise von vorne aus.

Mußte selbst nochmal nachsehen, da ich die Routinen vor zwei Jahren
geschrieben habe. Ich hoffe das war einigermaßen verständlich.

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.