Schlagwort: transitionen

ADF-Copy auf dem ESP32

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:

  1. Das Multitasking abstellen
  2. Alle Interrupts abstellen
  3. Timer starten
  4. Warten bis die Leseleitung auf High wechselt (Read ist negiert und somit low aktiv)
  5. Warten bis die Leseleitung auf Low wechselt (Transition der Magnetisierung der Diskette)
  6. Auslesen des Timers, Zähler auf Null setzen und neu starten
  7. Auswerten des Zähler -> 4,6,8µs Transition (oder 2,3,4µs bei HD) und ablegen im Streambuffer
  8. Auswerten ob gerade ein Sektoranfang vorliegt (Magicbytes) und merken.
  9. Prüfen ob der Streambuffer voll ist, wenn nein weiter bei 4.
  10. Interrupt wieder anstellen
  11. 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.

Spielkrams

Mittlerweile hab ich in mein Programm noch ein paar Features eingebaut, unter anderem eine Analyse des Timings der Transitionen auf dem gerade gelesenen Track, so etwas sieht dann in der Ascii Ausgabe so aus:

Transitions: 47166 Real Bits: 110011
0.25:0-146+
1.83:38-1
2.33:50-1
3.58:80-3
3.63:81-11
3.67:82-75
3.71:83-1134++++++++
3.75:84-5063+++++++++++++++++++++++++++++++++++++++
3.79:85-8495++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.83:86-8020++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.88:87-5470++++++++++++++++++++++++++++++++++++++++++
3.92:88-2809+++++++++++++++++++++
3.96:89-1693+++++++++++++
4.00:90-749+++++
4.04:91-360++
4.08:92-60
4.13:93-4
5.38:123-3
5.42:124-18
5.46:125-105
5.50:126-288++
5.54:127-638++++
5.58:128-1097++++++++
5.63:129-1500+++++++++++
5.67:130-1788+++++++++++++
5.71:131-1662++++++++++++
5.75:132-1343++++++++++
5.79:133-1066++++++++
5.83:134-624++++
5.88:135-389+++
5.92:136-179+
5.96:137-52
6.00:138-7
6.04:139-2
7.38:171-3
7.42:172-20
7.46:173-65
7.50:174-102
7.54:175-211+
7.58:176-271++
7.63:177-395+++
7.67:178-413+++
7.71:179-326++
7.75:180-260++
7.79:181-202+
7.83:182-118
7.88:183-61
7.92:184-11
7.96:185-1
8.42:196-1
OK

Wo die 146 Transitionen mit einer länge von 0,25µs herkommen hab ich keine Ahnung, kommen vielleicht aus dem Trackgap weil da in der Regel nur Müll steht bzw. die Diskette dort nicht formatiert ist, soll mir aber egal sein, ich werte nur Transitionen aus die länger als 1,5µs sind ;)
Da der Controller des Amiga mit maximal 500kbit/s arbeitet besitzt er eh nur eine Auflösung von 2µs, würde sowas also überhaupt nicht mitbekommen, bzw. falls er auch Filter vorgeschaltet hat sowas als Leitungsrauschen wegfiltern.