C64 Tastatur "abfangen"

Es gibt 56 Antworten in diesem Thema, welches 6.296 mal aufgerufen wurde. Der letzte Beitrag (5. Dezember 2021 um 16:00) ist von Hucky.

  • Sind die Spalten nicht $DC00 ?!

    Wie 0xdeadbeef sagte, es ist nur ein Name. Ich habe ihn jetzt aus dem Gedächtnis heraus so benannt.

    $DC00 ist Port A, $DC01 Port B. Ob jetzt PA oder PB Zeilen sind ist eigentlich egal. Zumal ja z.B. der VC20 die Zeilen/Spalten genau vertauscht hierzu hat.

  • Das scheint tatsächlich bei fast (?) allen Keyscans so zu sein. Der Hintergrund ist unter Umständen, daß PortA einen NMOS-Transistor als (passiven) Pullup benutzt und Port B eine NMOS-Push-Pull-Stufe hat, wobei die Highside wegen der NMOS-Technologie auch relativ hochohmig ist. Danke nochmal an androSID für seine Erläuterungen.

  • Ich hab gestern noch ein wenig experimentiert und PA0 und PB5 an mein altes Zweistrahloszi angestöpselt.

    Gesehen hab ich nicht ganz so viel - allerdings dass das PB5 Signal bei gedrückte F1 Taste genau in der Mitte der einzelnen PA0 Signale liegt.

    Versteh ich nicht.

    Von der Logik her müsste das PB4 Signal bei gedrückter F1 Taste doch zeitgleich auf Masse gehen wenn PA0 "L" Signal hat, da dieses L-Signal doch über die Taste an PB4 weitergeleitet wird ?!

    Im Prinzip ist es ja auch egal - ich werde es eh anders lösen müssen, da nachwievor nicht nur F1 reagiert, sondern auch alle anderen Tasten die an PB4 hängen. Das wird daran liegen, dass der Atmel mit 8Mhz zu schnell hintereinander PA=0 UND PB4=0 abfragt, und das "L" Rotieren in PA vom Kernal einfach zu langsam ist, dass PA für den Atmel quasi immer auf "L" ist sobald eine Taste gedrückt wird.

    Ich könnte das Timing anpassen - aber da die Signale PA und PB um 180° verschoben sind wird das nichts mit einer Abfrage.

    Ich benötige wohl einen Trigger.

    Das könnte ich über RESTORE lösen.

    Also wenn RESTORE gedrückt wird, dann wird einmal PA und PB komplett eingelesen und gespeichert solange RESTORE gedrückt ist und geprüft ob und welche Taste zusätzlich gedrückt wird.

    Oder hat jemand noch ne andere Idee ? 🤔

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...

  • Du müßtest halt PB einlesen, während immer nur ein PA-Pin low ist. Im Prinzip sollte der entsprechende PB-Pin schon mehr oder weniger gleichzeitig low gehen, solange die Taste gedrückt ist, aber "gleichzeitig" gibt es im echten Leben halt selten. Wenn die Implementierung erwartet, daß die Flanken in der gleichen Nanosekunde die Schwelle für den Low-Pegel unterschreiten, dann ist das halt etwas optimistisch.

    Aber wie gesagt: angesichts der Gesamtsituation halte ich persönlich einen aktiven Scan bei gedrücktem Restore für zielführender.

  • Falls das hilft, ich hab hier (Bitte melde dich an, um diesen Link zu sehen.) eine Routine geschrieben mit der ich die Tasten abfrage. Ist zwar für den C128, aber funktioniert auch 1:1 auf dem C64. Für den C64 kann man halt den Teil mit den Extended Keys wegwerfen, aber auch wenn er da ist funktioniert es trotzdem.

    Mit dem Tool kannst du dir die Matrixzeilen auch anzeigen lassen zum rumprobieren. Läuft auch native auf dem C64 ohne Änderungen.

    Grundsätzlich funktioniert das so, dass ich Port A alle Bits auf 1 setze, ausser der Zeile die ich gerade abfragen will, die bleibt auf 0. Dann kann man aus Port B die Matrixzeile auslesen.

    Wenn man alle Bits auf 0 setzt und dann Port B abfragt, bekommt man mit ob IRGENDEINE Taste gedrückt ist (wurde IMO hier eh schon erwähnt), man weiss dann halt nicht welche Zeile das war und muss die dann einzeln abfragen wenn man wissen will welche Tasten gedrückt sind. Die Routine erkennt auch mehrere gleichzeitige Tasten die gedückt sind.

    RESTORE wird nicht abgefragt, weil das ja keine Taste im eigentlich Sinn ist sondern ein NMI IRQ.

  • svenpetersen1965 fragt bei seinem C64-Keyboard-Controlled-Kernal-Switch auch bestimmte Tasten mit einem ATmega ab. Vielleicht ist das ein Beispiel.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Hier liegen die aktuellsten Versionen: Bitte melde dich an, um diesen Link zu sehen.

  • Das wird daran liegen, dass der Atmel mit 8Mhz zu schnell hintereinander PA=0 UND PB4=0 abfragt,

    Ich kann nur wieder auf den Pinchange Interrupt hinweisen...

    PA0 und PA7 auf PinChange Interrupt, siehe mein Beispiel da verwende ich direkte Registerzugriffe,

    das sieht in ASM genauso aus.

    In der Interrupt-Routine werden PortA und PortB ausgewertet und entsprechend reagiert, der Tiny

    ist locker schnell genug dafür, beim Pollen im Loop kann das natürlich anders aussehen.

    Einfach im Interrupt PortA abfragen, wenn eine gültige Kombination erkannt wird (PA7 = 1, PA0 =0)

    den PortB einlesen.

    Nur mit PA0 wird das nicht funktionieren, am Anfang der Keyscan-Routine sind kurz alle Leitungen von

    PA auf Low, und du fängst dir alle Tasten die auf PB0 liegen.

    Hier die entscheidenden Teile...

    Mfg Jood

    Dateien

    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.

    3 Mal editiert, zuletzt von Jood (3. November 2021 um 18:03) aus folgendem Grund: Rechtschreibung

  • Und natürlich könnte man theoretisch auch PortB als Ausgang konfigurieren und PortA als Eingang. Habe ich zwar noch nicht gesehen

    Z.B. Bruce Lee macht das so.

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Ich bin einen Schritt weiter. Dank 0xdeadbeef seinen Messungen versteh ich das jetzt auch. Auf meinem alten 2-Strahl Oszi sieht es nicht so schön aus und man kann nur erahnen was Sache ist - aber alles zusammen und auch die Beiträge von Jood haben mich auf den richtigen Weg gebracht.

    So für zwischen Tür + Angel (wie ich das meist gerne aus Zeitmangel so mache) ist das halt nichts - man muss sich schon etwas näher mit der Thematik beschäftigen 🙄

    Mein Hauptproblem war, dass die eigentliche Tastaturabfrage im Kernal zu Beginn einmal PA komplett auf "L" setzt.

    Die Abfrage PA0 = 0 AND PB4 = 0 KANN so nicht finktionieren.

    Ich habe jetzt folgendes gemacht:

    Sprung wenn PA0 = 0 AND PA1 = 1 AND PA2 = 1 AND PA3 = 1 AND PA4 = 1 AND PA5 = 1 AND PA6 = 1 AND PA7 = 1 AND PB4 = 0 ist.

    Im Prinzip sollte bei Abfrage PA0 = 0 AND PB4 = 0 zusätzlich AND PA1 = 1 reichen.

    Funktioniert FAST !

    Ich kann in der Reihe von F1 immer noch "Z" drücken. Manchmal gehts gut, meist reagiert mein Programm. Die anderen 6 Tasten reagieren nicht mehr :)

    Das mit dem "Z" erkläre ich mir so, dass ja nach PA0 PA1 auf "L" gezogen wird und dadurch die Taste "Z" einen Bruchteil noch das "L" von PA0 auf PB4 durchschaltet.

    Ist egal welchen PA ich mit PB4 vergleiche - es reagiert auch fast immer zusätzlich die Taste der Spalte in PA, die direkt neben an ist, bzw. vom Kernal als nächste auf "L" geschaltet wird.

    Ich muss mal schauen ob mir da noch was sinniges zu einfällt wie ich das Problem lösen kann.

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...

  • Jood

    Ich schau mir das mit dem Pin Change bei der nächsten Gelegenheit nochmal genauer an.

    Ich muss das verstehen was ich mache - sonst kommt meist nur Mist bei raus 🙈

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...

  • Das mit dem "Z" erkläre ich mir so, dass ja nach PA0 PA1 auf "L" gezogen wird und dadurch die Taste "Z" einen Bruchteil noch das "L" von PA0 auf PB4 durchschaltet.

    Das sind Effekte durch parasitäre Kapazitäten, plus das Ganze ist ja Open Collector, soll heißen, die Transition von 5V auf 0V geht relativ fix, in die andere Richtung aber nur über Widerstand, also etwas langsamer. Speziell bei langen Leitungen (Tastaturverlängerung? Langes Kabel zum Joystick? Wirkt beides als Kondensator) kann das dauern.

    Es gibt noch zusätzlichen Spaß durch z.B. prellende Tasten, soll heißen, wenn eine Taste gedrückt wird und entsprechend 0-Bits gelesen werden, können durchaus noch für ein paar µS vereinzelne 1-Bits folgen.

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Ich hab gerade ne Idee gehabt 8o

    Leider hab ich erst wieder am WE Zeit das auszuprobieren.

    Wenn

    PA0 = 0 AND PA1 = 1 AND PA2 = 1 AND PA3 = 1 AND PA4 = 1 AND PA4 = 1 AND PA5 = 1 AND PA6 = 1 AND PA7 = 1 AND PB4 = 0

    Dann Zeitverzögerung starten, nach Ablauf erneut wie oben PA und PB abfragen - wenn immer noch gegeben dann im Programm verzweigen.

    Mit der Zeitverzögerung will ich den "L" Übergang von PA0 auf PA1 in meinem Programm "überbrücken", so dass in der PB4 Reihe, die Taste "Z", die offenbar noch kurze Zeit das "L" Signal von PB0 zu PB4 durchschaltet auf mein Programm keinen Einfluß mehr hat.

    Von der Theorie her sollte es funktionieren 😊

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...

  • Ich muss mal schauen ob mir da noch was sinniges zu einfällt wie ich das Problem lösen kann.

    Der KERNAL versucht dazu eine Entprellung, z.B. hier:

    Code
    EAA3 LDA #$FE
    EAA5 STA $DC00
    EAA8 LDX #8     ; neben dem gewünschten Effekt noch: weitere Verzögerung
    EAAA PHA        ; neben dem gewünschten Effekt noch: weitere Verzögerung
    EAAB LDA $DC01
    EAAE CMP $DC01
    EAB1 BNE $EAAB

    D.h.: Nach dem Schreiben von PA gibt es eine Verzögerung (auch beim Rücksprung, z.B. aus EADA); ausserdem wird der Wert in PB zweimal gelesen. Ist er unterschiedlich, dann wird das Lesen wiederholt.

    Du müsstest für deinen Controller natürlich andere Zeiten erzeugen, da er schneller taktet (und wahrscheinlich auch weniger Takte pro Befehl verbrät)

    Man könnte es noch zusätzlich absichern indem du auch testest, ob sich PA verändert. Da du asynchron zum C64 läufst besteht die Gefahr, dass er schon PA geändert hat während du noch auf PB reagierst. Hier wäre so eine Art "Sandwich" sinnvoll: PA einlesen, PB einlesen, PB "entprellen", PA "entprellen". Wenn du da durchkommst kannst du sicher sein, dass PA und PB eine gewisse Zeit lang stabil waren.

  • Ich hab heute endlich mal Zeit gehabt weiter zu basteln 😃

    Ursprünglich wollte ich F1, F3 und F5 in Kombi mit CTRL oder Commodore Taste abfragen.

    Leider funzt es mit PA7 nicht so wie es soll - hab ich eben die Restore-Taste dazu genommen ☺️

    Durch die doppelte Abfrage wie bereits oben erwähnt werden jetzt auch die Tasten auf PA1 nicht mehr erkannt.

    Das heißt ich kann in meinem Programm sauber verzweigen sobald F1, F3 oder F5 jeweils in Kombi mit Restore gedrückt wird ☺️

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...

  • falls es wen interessiert...

    Bitte melde dich an, um dieses Medienelement zu sehen.

    Arcade: Twinliner, Fashion Vision,
    "Cosmic Guerilla" cocktail table
    Pins: Scared Stiff + Getaway
    C64, C65, C66, Gammel+Mist...