Wie in meinen Bitte melde dich an, um diesen Link zu sehen. angekündigt werde ich hier ein paar Messungen verschiedener Keyscans veröffentlichen. Ich habe damit angefangen, um die Möglichkeiten eines passiven und aktiven Keyscans für eine Erweiterungsplatine zu untersuchen.
Im oben genannten Thread haben wir von Bitte melde dich an, um diesen Link zu sehen. gelernt, daß sich die Ausgangsschaltungen von PortA und PortB des CIA sich physikalisch unterscheiden. PortA ist ein Open-Drain-Ausgang mit internem Pullup. PortB ist ein Push-Pull-Ausgang mit Pullup. Während es also ungefährlich ist, PortA als Ausgang zu konfigurieren und Pins auf high zu schalten, weil sie nicht aktiv auf 5V gezogen werden, sondern lediglich von einem Pull-Up, schaltet an Port B ein Transistor gegen 5V. Wenn also Pins an PortB auf Ausgang konfiguriert und eingeschaltet werden, würde ein externer Kurzschluß gegen Masse (durch einen Joystick o.ä.) einen Kurzschlußstrom durch den Transistor fließen lassen. Vermutlich ist das der Grund, daß nicht nur der Kernal, sondern mehr oder weniger alle Programme/Spiele PortA auf Ausgang konfigurieren und PortB auf Eingang, um die Tastaturmatrix abzutasten.
Als erstes eine Messung des Kernal-Keyscans.
Ohne gedrückte Taste
Bitte melde dich an, um diesen Anhang zu sehen.
Space gedrückt:
Bitte melde dich an, um diesen Anhang zu sehen.
Der Keyscan geschieht also immer am Ende der IRQ-Routine. Am Anfang werden alle PA-Pins für ~39µs auf Masse gezogen, falls dabei keine Änderung an PortB erkannt wurde, wird nicht weiter gescannt.
Falls eine Taste gedrückt war, werden die PA0 bis PA7 nacheinander einzeln kurz auf Masse gezogen. Das verlängert die Laufzeit der IRQ-Routine deutlich von etwas über 200µs auf fast 2ms.
Am Ende der Keyscans, vor dem Verlassen der IRQ-Routine, wird PA7 als einziger Pin von PortA wieder explizit auf Masse gezogen. Das dient dazu, den Zustand der Run/Stop-Taste in Laderoutinen usw. ohne Keyscan abpollen zu können.
Weitere Messungen werde ich der Übersicht halber als neue Beiträge in diesem Thread einstellen.