mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Festplatte Timing


Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...) habe
ich mal mit jemandem zusammen ein Festplattentimingdiagramm zerlegt.

Vielleicht hilft ja bereits diese Betrachtung.

Viel Erfolg.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens
Mit meiner 800MB Platte hast du mit Sicherheit Aussetzter...

Autor: Jens (Gast)
Datum:

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt:

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael A. (aim)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Netbandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Netbandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Daniel Braun (khani)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht 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) ?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Sind die etwa schon alle ?"

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Wagner (christoph)
Datum:

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte meins hier aus dem Forum für 25 Euro.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur FAT32 mit langen Dateinamen.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.