Forum: Mikrocontroller und Digitale Elektronik (mal wieder) IDE mit AVR


von Jens Renner (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

Sorry, vielleicht sollte ich noch die Portbelegung angeben:

 -RES -IOR -IOW -CS1 -CS0  DA2  DA1  DA0
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |

von Matthias (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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

von Trucki (Gast)


Lesenswert?

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

von Trucki (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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

von Trucki (Gast)


Lesenswert?

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

von ERDI - Soft (Gast)


Lesenswert?

Ich bezweifle, dass dir für FAT32 die 2kByte Flash des PIC reichen. Und
die 128 Byte RAM sind auch nicht das wahre.

von Jens Renner (Gast)


Lesenswert?

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.

von Trucki (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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

von Bernhard T (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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