Hallo zusammen,
ich möchte per Mikrocontroller eine C64 Tastatur auslesen. Pinouts und das Mapping für die Tasten (-> Matrix) findet man ja im Netz genügend, aber trotzdem scheint mein Ansatz nicht so ganz zu passen. Es geht zunächst mal lediglich darum genau eine Taste gleichzeitig abzufragen. Hier ein paar Verständnisfragen:
Ich nutze einen ATMega16, da dieser genug IO Pins in angenehmer Lage hat um die 16 Pins der Tastaturmatrix direkt anzusteuern bzw. auszulesen. Wenn ich den Tastaturmatrix-Scan richtig verstehe, dann wird auf dem einen Port per Ausgabe eines Low-Pegels (= 0) auf einem PIN (Rest high = 1) die jeweilige Spalte selektiert und anschließend am anderen Port gelesen und nachgeschaut ob dort auch irgendwo eine 0 anliegt. Falls ja, dann lässt sich über die Matrix und das Mapping bestimmen welche Taste gedrückt wurde. Soweit richtig, oder? Den oben beschriebenen Vorgang wiederholt man dann mit jeder Spalte und fragt jedes Mal wieder die Zeilen ab und ermittelt so die jeweils gedrückte Taste, auch richtig?
Bei mir ist nun das Problem, dass das für manche Spalten einwandfrei funktioniert und für andere gar nicht. Lege ich z.B. am Spalten-Port 1111 1101 an und prüfe anschließend den Zeilen-Port, so bekomme ich eine sinnvolle Antwort (z.B. 1111 0111). Mache ich exakt das gleiche mit z.B. 1101 1111, dann scheint sich der Zeilen-Port nicht zu ändern (= 1111 1111), egal welche Taste ich drücke.
Die Tastatur ist von einem VIC20, wurde aber schon in einem VIC20 und C64 getestet und funktioniert tadellos. Die elektrischen Verbindungen zwischen Tastatur-Stecker auf meiner Platine und den Mikrocontroller-Pins habe ich auch auf Durchgang geprüft, alles OK.
Mache ich da grundsätzlich etwas falsch oder hat jemand eine Idee was da los sein könnte? Der C-Code für den Controller ist sehr überschaubar und die gleichen Routinen führen je nach Ausgabe am Spalten-Port zum Erfolg oder nicht...ich vermute da erstmal keine allzu großen Bugs Ach ja und die Pull-Ups habe ich am Zeilen-Port eingeschaltet, damit ein undefinierter Pegel auf 1 gezogen wird und nur bei einem tatsächlichen Durchgang zum low-Pegel eine 0 entsteht...auch richtig, oder?
Danke euch und viele Grüße
Modulform
P.S.: Das Ganze soll übrigens nicht auf USB ausgegeben werden (dafür gibts ja Keyrah ), sondern mal an einem AVR basierten Video Terminal laufen und als Eingabegerät funktionieren.