Hallo, die Suche ergab, dass das Thema in der Vergangenheit schon ein paar Mal angesprochen wurde. Viel Konkretes kam jedoch nicht dabei heraus (wenngleich es durchaus machbar sein sollte). Ich habe auch schon Vorarbeit geleistet und die IDE-/ATA-Spezifikationen gelesen... so weit, so einfach (FAT, ATAPI, etc. kommt noch). Ich habe auch bereits einen Versuchsaufbau mit einem Mega163 und einem LC-Display, an dem schon Festplatten liefen. Die Daten- und Adressleitungen hängen direkt am AVR, sehr viel braucht's dazu ja nicht. Hilfreich waren bis dahin auch einige Projekte aus dem Netz (u.a. in den hiesigen Links vorgestellt). Leider sind nur die wenigsten mit (ausreichend kommentiertem) Sourcecode ausgestattet. Ich würde mich gerne mit jemandem austauschen, der sich auch damit beschäftigt. Mein Ergebnis bis jetzt: Ich kann auf alle HD-Register lesend/schreibend zugreifen, das reicht erstmal für PIO. Eine aktuelle 120GB-Maxtor lässt sich sich in vollem Umfang ansteuern, alle Kommando-Opcodes werden akzeptiert, und auch das Lesen und Schreiben scheint zu funktionieren. Mich wundert jedoch, dass ich mit dem "Identify Device"-Kommando (das eigentlich Infos über die Festplatte ausspucken sollte) größtenteils Müll erhalte. Einige wenige Daten ließen sich anhand des HD-Datenblatts verifizieren. Eine alte 428MB-Seagate (am Rechner funktionsfähig) weigert sich, die meisten Kommandos auszuführen (Error: "Kommandofehler" g), obwohl diese im Datenblatt ausdrücklich unterstützt werden. Byte-weiser Lesezugriff schien aber zu funktionieren. Ich scheue mich jedoch etwas davor weiterzumachen, bevor ich diese Unklarheiten beseitigt habe. Meine Frage daher: ist schon jemand über diesen Level hinausgekommen und kann evtl. darüber berichten? Ggf. kann ich mal meinen ASM-Code kommentieren und posten, allerdings ist der überaus unspektakulär... Read-/Write-Routinen eben. Die Probleme scheinen auch weniger auf der Code-Eben zu liegen, sondern logistischer Natur zu sein. Jens
Hi besonders interessant in diesem Bereich ist die Abfolge in der du die Adress- CS- RD/WR- und Datenleitungen ansteuerst. Hälst du alle Setupzeiten korrekt ein? Stimmt das DDR in allen Fällen. Zumindest ID sollte mit allen Platten/CF-Cards gehen. Matthias
Hallo Matthias, erstmal danke für den Tipp. Ich gebe zu, ich hatte das Timing erst etwas stiefmütterlich behandelt, jedoch alle Zeiten ausrechend dimensioniert. Auf Deinen Hinweis habe ich sie nochmal mit den Spezifikationen abgestimmt und noch etwas "Luft" gelassen, da es sich um Minimalzeiten handelt. Das Ergebnis ist das selbe. Die Seagate bricht beim ID-Kommando ab, die neue Maxtor läuft soweit, rückt bloß nicht immer mit den korrekten Daten raus (IMO falsche Zylinderzahl und korrupte Model-/SN-Daten). Kopf- und Sektoren-Zahl sowie Mediumart (non-removable) schienen zu stimmen. Allein die Tatsache, dass gewisse PIO-Funktionen einwandfrei und rekonstruierbar laufen spricht nun gegen einen Timing-Fehler. Hat sonst noch jemand Hinweise? Jens P.S.: In meinem Code habe ich der Übersichtlichkeit halber die LCD-Routinen und anderes Beiwerk weggelassen, ist aber alles erprobt und "gekapselt", d.h. bis auf Rückgabeparameter werden Register gepusht/gepopt.
Hi was fehlt sind die Definitionen für IOR usw ori r20, IOR Vor allem hier wäre das interessant. Für mich sieht das so aus als würdest du IOR setzen. In R20 sollte IOR aber low sein wenn ich deinen Code richtig verstanden habe. Am besten du nutzt sbi und cbi um einzelne Portbits zu manipulieren. Das macht die Sache wesentlich übersichtlicher und klarer. Matthias
Hi Matthias, Du hast recht, die Definitionen sollte ich nachreichen. Hier ein Ausschnitt: .equ WR_COMMAND = 0b00010111 .equ NO_IO = 0b01100000 .equ IOW = 0b01000000 .equ IOR = 0b00100000 .equ NO_RESET = 0b10000000 Hier sieht man, dass ich die R/W-Leitungen tatsächlich auf Null ziehe. Ansonsten hätte ich ja Probleme, überhaupt irgend etwas zu lesen. Ich bin ein wenig ratlos... Die Realisierung der Strobes mag tatsächlich etwas umständlich sein, bei anderen Projekten tat's das bisher aber immer. Kann ich bei Gelegenheit mal abändern, ist dann eleganter. Übrigens bin ich in Vorbereitung auf das Projekt auch auf Deine Seite gestossen :-) Grüße Jens
Sorry, vielleicht sollte ich noch die Portbelegung angeben: -RES -IOR -IOW -CS1 -CS0 DA2 DA1 DA0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Hi und es passiert genau das was ich meinte. Mit ORI r20,IOR setzt du IOR auf High. IOR ist aber LOW-aktiv. mov r19, r16 ; prepare both output states ori r19, NO_IO ori r19, NO_RESET mov r20, r16 ori r20, IOR Hier setzt du das für IOR zuständige Bit auf 1 (High, +5V) ori r20, NO_RESET out ADDR, r19 ; no I/O ;Hier wählst du das Register aus. RD ist jetzt aber schon low. out ADDR, r20 ; IOR strobe ;Hier wird jetzt RD high in r17, DATAL_IN in r18, DATAH_IN ;Und hier ließt du über einen Dreckeffekt manchmal die richtigen Daten. Je nach Plattentyp funktioniert das mal besser und mal schlechter. Matthias
Hi, vielen Dank, dass Du Dich mit meinem Problem auseinandersetzt. Ich denke aber, dass meine Vorgehensweise doch richtig ist. In r19 wird RD und WR mit NO_IO auf high gesetzt. In r20 wird nur WR auf high gesetzt, RD bleibt folglich low (strobe). Bit 7 ist -Reset, Bit 6 -IOR, Bit 5 -IOW. NO_RESET NO_IO ADDR r19 == 0b111xxxxx (0b10000000 OR 0b01100000 OR 0b000xxxxx) r20 == 0b101xxxxx (0b10000000 OR 0b00100000 OR 0b000xxxxx) ^ NO_RESET IOR ADDR Ich meine also, RD ist erst high und dann low (r19 out, r20 out, lesen, r19 out). Oder habe ich in meinem Gedankengang einen Fehler? Jens
Hallo, aufgrund der Hilfe (danke, Matthias!) konnte ich den Fehler entdecken. Nachdem wir ja die meisten logischen Fehler im Code ausgeschlossen haben, machte ich mich nochmal an der Schaltung zu schaffen. Auch dort war alles in Ordnung, jedoch bemerkte ich, dass der Port A (DATAL)meines Mega163 im Ausgabe-Modus das Zeitliche gesegnet hatte, es kam nichts raus. Alles was also funktioniert basierte lediglich auf Zufällen. Zum Glück habe ich einen Ersatz-163er zur Hand, mit dem funktioniert es einwandfrei. Nochmal vielen Dank, ich werde meine Ergebnisse beizeiten posten. Jens
Hallo, Passt nicht ganz, aber fast! ich will eine CF Karte mit einem PIC ansteuern. Im Ide True modus wird das auch hinhauen und es gibt ja schon ein ganz tolles Beispile dazu im Internet! Mein Prroblem ist, das ich einen Datelogger mit einigen hundert MB aufbauen will. Deshalb sollte auf die CF Karte in FAT12 oder 16 geschrieben werden, damit ich sie einfach in den Lamptop zum auslesen stecken kann und sie nicht umständlich mit einem Hexeditor oder noch besser per RS232 auf dem PC auslesen muß! Gibt es eine gute deutsche Dokumentation, wie ich Fat 12/16/ oder auch 32 schreiben kann ??? Ich konnte nichts finden ! Danke Cu Trucki
Ok, sorry, habe die Suchfunktion benutzt und bin fündig geworden. Ich hasse Leute die nie die Suchfunktion benutzen! :-) FAlls trotzdem noch jemand eine deutsche Doku hat wäre ich sehr dankbar... Fällt dann doch immer leichter ! Cu Trucki
Hallo Trucki, ich möchte auch bald damit beginnen, (wenn möglich) FAT32 zu implementieren. Ich habe hier ein White Paper von Microsoft rumfliegen, das zwar ganz gute Hinweise gibt, aber mir noch nicht optimal erscheint. Du bekommst es z.B. hier: http://home.teleport.com/~brainy/fatgen102.pdf Hast Du etwas besseres zur Hand? Auf deutsch habe ich lediglich Teilinformationen gefunden, z.B. über den MBR usw. Aber ich bin recht zuversichtlich, es mit diesen Informationen realisieren zu können. Jens
HI, ne leider stehe ich noch ganz am Anfang. Ich würde gerne mit einem PIC 16F871 (Atmels sind ja sau teuer!) auf eine CF KArte in Fat12/16/32 schreiben! Leide habe ich auch nichts weiter und auch keinen Bock mich Stundenlang reinzulesen! Aber das wird wohl auch nicht anders gehen! Naja jetzt muß ich erst noch ein paar Prüfungen für mein Studium schreiben und dann kanns los gehen! Cu Trucki
Ich bezweifle, dass dir für FAT32 die 2kByte Flash des PIC reichen. Und die 128 Byte RAM sind auch nicht das wahre.
Das dürfte wirklich eng werden. Mein Hex-Code (nur für IDE, und noch nicht komplett) liegt schon bei 1,7 kB, allerdings inkl. Display-Routinen. Also sagen wir min. 1 kB. Dazu käme noch der Code für FAT. Problematischer dürfte aber der RAM sein. Ich habe mal als Minimum 512 Byte im AVR reserviert, damit ich einen kompletten Sektor buffern kann. Für weitere Anwendungen komme ich um externes RAM nicht herum. Und wenn Du mit FAT arbeitest, solltest Du zumindest die Tabelle im Speicher verfügbar haben, damit das vernünftig funktioniert. Überleg mal, ob Du nicht doch einen anderen Controller verwenden willst.
Ich habe mich ja mit der ganzen IDE Materie noch nicht genauer außeinander gesetzt! Wozu muß ich eigentlich Puffern? Ich hatte nur vor Daten im Abstand von 1s (vielleicht auch nur alle 10s) auf die CF zu schreiben. Das sollte die CF doch eigentlich schaffen, ohne das ich Puffern muß! Ich will ja keinen MP3 Player oder ähnliches damit betreiben! Das der Programmplatz eng werden könnte stimmt! Aber es sind halt 5 Euro gegen 25 Euro (Atmlel Mega64) Cu Trucki
Letztendlich braucht man nicht zwangsläufig einen Puffer zum Lesen oder Schreiben. Aber Du meintest ja, Du möchtest die Card gerne mit FAT haben, da sie im Laptop gelesen werden soll. Folglich musst Du auch FAT-konform auf die CF schreiben (d.h. iN Dateien, und nicht rohe Daten)... und dann wird man nicht drum herum kommen, die FAT im Speicher abzulegen. Gut, vielleicht könnte man sich auch durch die Karte parsen g Wäre einen Versuch wert. Übrigens muss ja nicht der teuerste AVR sein. Nimm doch den 8535 oder den mega163 (den benutze ich :-). Kosten beide um die 10 Euro beim Reichelt. Die Investition würde ich in jedem Fall tätigen. Jens
Jens, ich hab bei mir auf der Festplatte noch das White Paper in der vers. 1.03 gefunden. Hat immerhin ein par Seiten mehr - vielleicht bringt es dir was. Gruß Bernhard
Hallo Bernhard, das ist in der Tat ausführlicher und um einiges aktueller. Vielen Dank dafür! Jens
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.