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 !
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.
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
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.
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.
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.
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.
Ü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.
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 ?
/* 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.
>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.
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.
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.
@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.
Denke nicht, habe es bei mir auch mit einer alten 250MB Platte von Samsung getestet, keine Probleme.
Die Platte die ich verwende, braucht rund eine halbe Sekunde bis die Daten zur Verfügung stehen. Keine Ahnung warum die so lahm ist.
@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 ?
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.
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.)
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...
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.
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
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...
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.
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)
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.
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) ?
"Sind die etwa schon alle ?" Guck mal bei ebay rein, dann weisst Du wo die alle geblieben sind.
> 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.
Wo bekommt man die denn günstig her ? Unter 30 scheint da ja nichts drin zu sein ...
@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.
@Benedikt Ja meine Samsung-Platte ist sehr merkwürdig, die hat z. B. auch kein beschalteten Reset-Pin.
@Jens Verwendest du eigentlich nur FAT32 oder auf FAT16 ? Wertest du lange Dateinamen aus ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.