Neue Hardware Revision

So, meine Platine v2 ist jetzt fertig und funktioniert auch diesmal wie gewollt
adf_v5.1print2print1bohren

In der Firma darf ich netterweise einen UV-Drucker benutzen, damit lässt sich direkt aufs Kupfer drucken, die Tinte wird mit UV Licht ausgehärtet und ist säurebeständig. Nach dem Ätzen lässt sich die Farbe einfach mit einer Topfbürste abschrubben. Anschließend wurde gebohrt, da meine Augen nicht mehr so gut sind hab ich das mit meiner CNC gemacht, leider nicht 100% mittig die Löcher, aber das tut der Funktion keinen Abbruch, mit Hand wärs auch kaum hübscher geworden.

Anschliessend bestückt und das Endprodukt sieht dann so aus:

platine oben platine unten
Das Layout entspricht meiner neuen Pinbelegung. Durch die neue Pinbelegung konnte ich das Layout so vereinfachen das man mit nur eine Drahtbrücke auskommt, und die kann man optional setzten wenn man den Anschluss für die SD Karte (noch nicht implementiert in der Firmware) nutzen will. Ebenso habe ich im Layout noch einige freie Pins auf Pinheader geführt um sie für spätere Entwicklungen wie Knöpfe, Display oder Leds zu nutzen. Stromversorgung der Floppy geht über eine extra USB Buchse, gepuffert über einen Kondensator.

Das Problem das es nun unterschiedliche Hardware Versionen gibt und eigentlich unterschiedliche Firmware erfordert hab ich gestern in langer Fummelarbeit gelöst sodaß eine Firmware mit beiden Pinbelegungen klar kommt und automatisch erkennt. Da die Ausgänge der Floppy komplett in OpenCollector ausgelegt sind war das nicht so einfach ein Signal zu finden was ich abfragen kann und bei den unterschiedlichen Hardwares unterscheidbar ist. Meine Firmware versucht nun einfach den Kopf auf Track0 zu fahren und schaut ob das Track0 Signal nach 85 Steps oder früher auf Low geht, falls nicht wird die andere Ansteuerung probiert und dort das selbe gemacht. Funktioniert soweit ganz gut und hat den Nebeneffekt das der Kopf beim Einschalten auf Track0 gefahren wird. Das funktioniert auch wenn keine Diskette eingelegt ist.
D.h. künftige Firmwares werden beide Hardwares bis auf weiteres unterstützen, kann sein das es sich ändert wenn ich SD Karten Funktionen einbaue.

Hier noch das Pinout der neuen Hardware Revision:

Pinout_v2

Adf-Copy Pinout Update

Kleines Update auf der Projektseite wie man die Floppy an den Teensy anschließt. Die Signal Bezeichnungen mit Pin x waren mehr als verwirrend und auch irreführend, das kommt davon wenn man nur noch Signal Pins im Kopf hat und nicht die Physikalischen Pins. 😉

Pinout_small

ADF-Copy 0.91

Neue Version im Downloadbereich: 0.91

Bugfixes:

  • Division by Zero Error wenn der erste Track gleich einen Schreibfehler produziert /fixed
  • Schreibschutz wird abgefragt, es bestand nie eine Gefahr für die Diskette da der Schreibschutz auch per Hardware im Laufwerk implementiert ist
  • Ein Fehler trat nach Neustart des Teensy mit Schreibzugriffen auf wenn nie zuvor ein Lesezugriff geschah. /fixed

Erster Release

So nun ist es soweit, ich entlasse die erste einigermaßen brauchbare Version meines Amiga Disketten Lese und Schreib Programms „ADF-Copy“ in die Wildnis unter der GNU Public License v3. D.h. jeder darfs benutzen, weiter entwickeln und kopieren solange die Copyright Informationen erhalten bleiben und darauf hingewiesen wird das eine Weiterentwicklung auf meinem Werk beruht. Ebenso müssen Weiterentwicklungen daraus auch unter der GPLv3 lizensiert werden.

Hier der Download:

ADF-Copy_v0.8

Ist alles noch recht Beta und hat kaum Fehlerabfragen, wenn ihr also eurer Superseltenes Retro Game überschreibt weil ihr den Writeprotect Nupsi vergessen habt und das falsche klickt, nicht mein Fehler McFly! 😉

Zur Hardware

Das ganze lässt sich auf einem Steckbrett mit ein paar Strippen aufbauen. Ansonsten kann man auch anhand der Pin Definitionen im Sourcecode des Arduino Sketches arbeiten.

 

Pinout_small

Als Bauteile werden benötigt:

  • Teensy 3.2 – ganz wichtig das es die 3.2 Version ist, denn nur diese ist 5V tolerant!
  • ein Micro USB Kabel, denn beim Teensy wird keines mitgeliefert.
  • ein Steckbrett, das kleine aus dem Conrad Weihnachtskalender reicht vollkommen aus.
  • 14 Steckbrettkabel mittlerer Länge mit Male/Female, es reicht wenn ein Masse Pin der Floppy mit dem Teensy verbunden ist. Im Layout sind alle verbunden weil man das eben so macht. 🙂
  • von einem alten Netzteil ein Kabel mit Floppy Stromstecker, man muss nur Masse an Schwarz und 5V an Rot anlegen, die gelbe 12V Strippe wird nicht benötigt.
  • ein 5V Netzteil für die Stromversorgung der Floppy was mindestens 1A liefert, wenn der Steppermotor loslegt zieht der kurz 0,7A und wenn die Spannung zusammenbricht kommt die Floppy durcheinander und Steppt in die falsche Richtung (Schon erlebt und Stunden nach dem Fehler gesucht)

Über USB reicht der Strom leider nicht für die Floppy, naja, man kann nicht alles haben.

Über Feedback würde ich mich freuen und ansonsten: Have fun and keep the Amiga alive!

kleines Update

Da der Schreibmodus nun funktioniert habe ich nun auch Verify eingebaut, nach dem Schreiben eines Track wird dieser gelesen und mit den zu schreibenden Daten verglichen, bei Unterschieden oder schlimmeren wird der Track nochmal geschrieben und geprüft, maximal 10 Mal, falls es dann immer noch nicht geklappt hat bricht der Schreibvorgang ab. So eine Diskette sollte man besser entsorgen.

Das Frontend hab ich grafisch auch überholt und etwas hübscher und kompakter gestaltet, aber seht selbst.

frontend02

Funzt :)

Da der Schreibmodus mittlerweile funktioniert und auf dem trockenen schwimmen keinen Spass macht hab ich mal meinen Amiga 4000 aufgebaut, einige Disketten geschrieben und am lebenden Objekt getestet. Da ich ja auch ein Diagnoseprogramm brauchte hab ich mit dem Amiga Emulator (WinUAE) ein ADF erstellt und dort das Programm DiskSalv4 von Dave Haynie aufgespielt, dann mit meinem ADF Writer auf eine Disk geschrieben und in den Amiga geworfen.

Die Diskette hat der Amiga mit seinem 20 Jahre alten Laufwerk ohne murren gelesen 🙂

Mit Hilfe von Disksalv hab ich dann einige andere Disketten die ich geschrieben hatte überprüft, lies sich alles ohne Probleme lesen, kein einziger Retry bei einem Track, ich bin zufrieden.

Einzig HD Disketten die ich als DD beschrieben hatte waren teilweise unlesbar, ich hatte natürlich das HD Loch abgeklebt. Ich hab dann mal so eine Diskette mit zugeklebten Loch mit meinem ADF Writer beschrieben, und siehe da, einwandfrei lesbar. Scheinbar verhält sich das Floppy Laufwerk unterschiedlich wenn das HD Loch zu oder offen ist, aber wenn man das weiß kann man darauf achten.

Jetzt gehts daran das Frontend auf dem PC etwas aufzuhübschen und Nutzerfreundlicher zu machen, und vielleicht Verify einzubauen 🙂

Spannung ist spannend…

Gestern lief alles und heute geht nichts mehr. Beim Lesen und Schreiben fing der Schreib/Lese Kopf einfach mittendrin an in die falsche Richtung zu wandern, d.h. wenn er einen Track richtung Innen fahren sollte fuhr er einen Schritt richtung Außen, oder bewegte sich mehrere Schritte anstatt einem, wtf?

Nach stundenlanger Suche nach Timing Problemen bei der Ansteuerung des Schrittmotors, oder ob mir irgendwas in die Serielle Kommunikation spuckt fiel mir ein das ich das Netzteil für die Floppy über Nacht angelassen hatte und kontrollierte mal die Spannung. Ich hatte es auf 5V eingestellt, nun zeigte es 4,96V an, sollte eigentlich kein Problem sein… oder? Die Spannung wird über ein Poti eingestellt, ist halt ein billiges Labornetzteil, wird wohl das Poti über Nacht etwas gedriftet sein wegen Wärme, Wetter oder einer Fischschwarmwanderung im Pazifik. Hab es dann auf 5,01V gestellt und hossa, keine Probleme mehr!

Das Laufwerk scheint eine echte Diva zu sein das 0,05V soviel ausmachen. Meine Vermutung mittlerweile ist das das billige Labornetzteil kurz in der Spannung einknickt wenn der Schrittmotor einen Step macht, laut Datasheet eines Samsung Laufwerks zieht sowas 0,7A, und das es mit den 0,05V Unterschied dann genau unterhalb der zulässigen Grenze sinkt. Nun steht es auf 5,2V, das sollte genug Luft sein.

 

Nur eine handvoll Bits

Ich hab mich in den letzten Tagen damit beschäftigt den Schreibmodus zum laufen zu bringen… mit einigen Hürden.

Da auf der Magnetscheibe einer Floppy die Daten ja im MFM Format gespeichert sind muss man die Daten die da rauf sollen vorher in MFM codieren.
Zur Decodierung hab ich einige Beispiele im Netz gefunden, das war nicht so schwierig, aber für die Encodierung findet sich sehr wenig. Irgendwann bin ich dann auf eine MFM Codierungroutine des Win Fellows Amiga Emulators gestoßen, hab diese dann auch ausprobiert und es kam nur Grütze bei raus 🙁

Nachdem ich mich dann doch durch mehrere Kapitel im Buch „Amiga Disk Drives: inside & Out“ von Grote Gelfland Abraham erschienen bei Abacus/Data Becker 1988 gekämpft habe (wer schon mal ein Hardware Buch von Data Becker in der Hand hatte weiß das die schwierig zu lesen waren, und dazu kam noch das hier in Englisch war) hab ich festgestellt das die Routine nicht vollständig MFM codierung implementiert hatte, sondern nur soweit das der Amiga Emulator das als MFM gefressen hat, es waren also die Clock Bits nicht korrekt berechnet. Auch bei der Checksummenberechnung stimmte auch irgendwas nicht.
Hab also das meiste über Bord geworfen und selbst geschrieben. Nach vielen Versuchen lief dann die Codierung eines Sektors.

Ein Sektor mit 512 Datenbytes wird zu 1024 MFM codierten Bytes, dazu kommen noch Informationen über die Nummer des Sektors, Track, Abstand zum Gap, zwei Checksummen und ein ungenutzter 16 Byte Bereich, am Ende sind es dann 1088 MFM Bytes. 11 Sektoren passen auch einen Track und dann kommt die Track Gap, ein Bereich einer Spur in den kein kompletter Sektor mehr passen würde, der aber gefüllt sein muss um alte Daten auf der Spur zu überschreiben.

In der Routine des Emulators wird die GAP nach den Sektoren geschrieben, das kam mit aber unlogisch vor da man ja nicht genau wissen kann wie lang die Spur wirklich ist, da ein Laufwerk ja auch gewissen Schwankungen unterliegt. Also schreibe ich zuerst eine etwas längere Gap und dann die Sektoren sodaß der letzte Sektor etwas von der Gap überschreibt und ich sicher gehen kann das keine alten Daten überleben und kein Sektor einer vorherigen beschreibung auch nur teilweise überlebt. Weil ein Sektor wird zu beginn durch eine reihe von MFM Bytes (4x 0xAA gefolgt von 2x 0x4489) gekennzeichnet die durch die Kodierung von Datenbytes niemals zustanden kommen können, somit eindeutig sind. Und wenn sowas von einer vorherigen beschreibung der Spur überlebt würde man plötzlich 12 Sektoren finden und wüsste nicht welches die richtigen 11 sind, oder müsste mehr Aufwand beim Lesen betreiben.

Bei einer späteren Analyse eines Logikanalysatormitschnitts eines Schreibzugriffes an einem echten Amiga stellte ich fest das die es genauso machen, darüber haben sich natürlich die Bücher ausgeschwiegen, aber egal, ging ja auch mit nachdenken 🙂

Irgendwann lief dann auch die Schreibroutine und ich konnte ADF Images auf Disketten schreiben, Eureka! Nur gab es eine Menge unslesbare Tracks, aber je nach Image mal mehr mal weniger, und wie ich feststellte immer an den selben Stellen. Komisch gelle? Ich zweifelte erstmal meine MFM codier routine an. Hab da aber nichts finden können. Später stellte ich dann fest das immer beim letzten Sektor das letzte Byte fehlerhaft war… Lange rede kurzer Sinn: Denkfehler in der Schreibroutine.

void diskWrite()
{
 if (writeActive == false) return;
 digitalWriteFast(_writedata, !(dataByte >> 7));
 dataByte = dataByte << 1;
 writeBitCnt++;
 if (writeBitCnt == 8) {
 writePtr++;
 dataByte = stream[writePtr];
 writeBitCnt = 0;
 }
 if (writePtr >= writeSize) {
 writeActive = false;
 digitalWriteFast(_writedata, HIGH);
 }
}

Hier meine Schreibroutine, wird im 2µs Takt aufgerufen und shiftet die Bits aus dem MFM Puffer an die Schreibleitung der Floppy. Ich habe den Fehler mal rot markiert… Ich hab den Schreibvorgang beendet bevor das letzte Byte rausgeshifted wurde… Narf! Es fehlten also von letzten Byte die 4 ungeraden Bits, das erklärte auch warum manche Tracks in Ordnung waren und viele nicht.

richtig lautet die Zeile:
if (writePtr > writeSize) { … usw}

Anfängerfehler 😛