In den letzten Wochen hab ich ein wenig mit dem ESP32 rumgebastelt, dies ist ein Mikrocontroller mit 2 CPUs, ne Menge RAM und integrierten WiFi. Mittlerweile läuft die ADF-Copy Firmware auf dem kleinen Ding :)
Verkompliziert wurde die Portierung durch mehrere Faktoren:
- auf dem Ding läuft RTOS, steht für Real Time Operating System, dies wird u.a. benötigt damit die 2 CPUs zusammen laufen können und das WiFi funktioniert, leider verkompliziert das die Sache ein wenig.
- die Interruptlatenz ist gigantisch, teilweise bis zu 700ns. Das ist zwar für einen Menschen eine unfaßbar kleine Zeitspanne, aber wenn man bedenkt das die Transitionen bei einer HD Diskette einen Abstand von 2µs (2000ns) haben können ist das schon gewaltig. Und die Interrupt Routinen die das Arduino Framework zur Verfügung stellt machens nur noch schlimmer.
- die Timer können kein Input Capture. Bei einem Input Capture weißt man einem Timer einen Eingang des Chips zu der bei einem Wechsel (z.B. LO->HI) des Eingangspegels einen Interrupt auslöst und gleichzeitig den Zähler des Timers in ein spezielles Register sichert während der Timer weiterlaufen kann oder von Null neu startet.
- zum Schreiben einer Diskette benutzte ich auch einen Timer der alle 2/4µs (HD/SD) einen Interrupt auslöst, mit der Latenz von bis zu 700ns natürlich auch keine Lösung.
- Erschwerend kam noch hinzu das das RTOS alle 1ms den SystemTick (Uhrzeit) aktualisiert und mir dazwischen gehackt hat.
Bisherige Lösung ist es alles von Hand zu machen ohne Interrupts zu benutzen, ist nicht schön aber bisher die einzige Lösung die ich gefunden habe.Grob gesagt mache ich folgendes:
- Das Multitasking abstellen
- Alle Interrupts abstellen
- Timer starten
- Warten bis die Leseleitung auf High wechselt (Read ist negiert und somit low aktiv)
- Warten bis die Leseleitung auf Low wechselt (Transition der Magnetisierung der Diskette)
- Auslesen des Timers, Zähler auf Null setzen und neu starten
- Auswerten des Zähler -> 4,6,8µs Transition (oder 2,3,4µs bei HD) und ablegen im Streambuffer
- Auswerten ob gerade ein Sektoranfang vorliegt (Magicbytes) und merken.
- Prüfen ob der Streambuffer voll ist, wenn nein weiter bei 4.
- Interrupt wieder anstellen
- Multitasking erlauben.
Hiernach wird der Streambuffer anhand der gemerkten Sektoranfänge decodiert.
Ähnlich läuft das schreiben ab, bloss das ich dort ständig den Timer auslese ob 4µs (2µs bei HD) vergangen sind und ich das nächste Bit schreiben kann.
Ich hab noch nicht geprüft ob die WiFi Verbindung dadurch abbricht da ich den ESP32 für 200ms „dumm“ stelle, aber erstmal mussten die Grundfunktionen laufen.
Ziel ist es ein Standalone Gerät zu haben auf das man mit einem Webbrowser zugreifen kann um ADFs zu lesen/schreiben, Disketten formatieren, vielleicht sogar einen FTP Server drauf laufen zu lassen.
Mal sehen wie weit ich komme.