Hallo Besucher, der Thread wurde 2,2k mal aufgerufen und enthält 11 Antworten

letzter Beitrag von Modulform am

C64 Tastatur auslesen (ATMega16)

  • 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.

  • Zitat

    >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.

    Pardon, wenn das folgende vielleicht etwas trivial klingt:
    Es ist eben nicht egal welche Taste du drückst.


    Hast du eine bestimmte Spalte selektiert, kannst du - grundsätzlich - nur Tasten erkennen, welche innerhalb dieser bestimmten Spalte liegen. Wurde das beachtet?


    Die Illusion dass alle Tasten quasi simultan in Echtzeit immer verzögerungsfrei im Zugriff sind, entsteht durch die dynamische aber im Detail immer noch sequentielle Abfrage aller Spalten und Zeilen.

  • Das muss nicht unbedingt am auslessen liegen. Manche Ports vom Atmega haben doppelte-Belegungen und die müssen explizit deaktiviert sein sonst funktionieren die Ports an der Stelle nicht. Am besten wäre wenn Du mal ein Schaltplan hochlädst und sagst welche Kombination nicht funktioniert.


    Ausserdem sollte man beim auslesen die Spalten nicht mit High Pegel betreiben, sondern die Spallten dann auf Eingang (=hochohmig) schalten. Warum? Beim drücken von 2 Tasten wirst Du sonst so einen Kurzschluss provozieren da eine Spalte (welche auf einen Low Pegel liegt) mit einer Zeile per Tasten Druck verbunden wird und hier über eine zweite Taste auf der Zeile dies nun gegen eine Spalte mit High Pegel verbindet. Um dies zu vermeiden sollten die Spalten auf Eingang geschalten werden und sie somit hochohmig zu machen.

  • Manche Ports vom Atmega haben doppelte-Belegungen und die müssen explizit deaktiviert sein sonst funktionieren die Ports an der Stelle nicht.

    This.
    Zum Debuggen könntest Du die acht Ausgangsleitungen direkt mit den acht Eingangsleitungen verbinden, also ganz ohne (Tastatur-)Matrix, und dann die acht Bits durchtesten.

  • Ich hab was ähnliche vor paar Jahren mit den Raspberry gemacht.
    Worüber ich damals auch gestolpert bin ist, dass die Tastatur des Raspberrys recht hohe Wiederstände hat, das ganze für manche Tasten dann recht träge reagiert. Dem Cevi ist das wohl egal - Mit dem Pi gings aber erst als ich die Cevitastatur getauscht hatte ( beide Tastaturen funktionieren am Cevi ohne Probleme)
    Hier der Link zu meinem Cevi-Pi-Experiment.

  • Stephan: Ja, das wurde beachtet. Als ich die andere Spalte selektiert habe, habe ich solche Tasten versucht, die zu der Spalte passen würden. Als dann nichts passierte habe ich auch andere Tasten versucht (evtl. falsche Spalte selektiert), aber auch hier kein Erfolg.


    zschunky: Danke für den Tip, ich werde mal nachsehen ob ich die Funktionen extra deaktivieren muss. Bisher habe ich bloß die Datenrichtungsregister entsprechend nach Eingang und Ausgang eingestellt und für den Eingang die internen Pull-Ups aktiviert. Schaltplan werde ich noch nachreichen, bin nur gerade nicht zuhause. Zu der zweiten Sache: Meinst du damit, dass ich garnicht mit einer bestimmten Pegel-Ausgabe arbeiten soll sondern bloß im Datenrichtungsregister den jeweiligen Pin als Eingang (hochohmig) und den Rest als Ausgang definieren soll? Ad hoc steige ich noch nicht ganz dahinter wie mir das weiterhilft, aber ich werde es heute Nachmittag mal detailliert ansehen. Danke!


    Mac Bacon: Guter Plan, so wird's gemacht...damit kann ich erstmal checken ob überhaupt das ankommt was ich erwarten würde.


    Zaadii: Danke für den Tip, sollte ich nicht weiterkommen versuche ich mal eine andere Tastatur. Die, die ich jetzt nutze ist ja auch original vom VIC20. Die ist z.B. insofern anders als die mir bekannten C64er Tastaturen, da sie bloß unter der Leertaste eine Feder hat.


    DANKE in jedem Fall für eure Antworten und Tipps - ich melde mich mit Ergebnissen ;-)


    Modulform

  • zschunky's Tip mit den alternativen Funktionen war genau richtig, danke! Zumindest hat sich durch einen Test mit 8 LED, einem Steckbrett und Port C herausgestellt, dass ich zuerst das JTAG Interface deaktivieren muss, damit dort rauskommt was ich erwarte.


    Da ich jetzt weiß, dass am Port C passiert was ich erwarte, ist Port A (8bit Eingang) das Sorgenkind. Momentan habe ich die Pins von Port C (Ausgang) mit den entsprechenden Pins von Port A (Eingang) verbunden. Das Programm gibt zunächst auf Port C ein Bitmuster aus (0b00000001), an Port A wird eingelesen und eine LED an Port D soll so oft blinken wie das was an Port A eingelesen wurde. Die LED blinkt allerdings extrem oft, dafür dass ich bloß 0b00000001 erwarte. Wenn ich allerdings nichts einlese sondern einfach direkt etwas als "Blinken" ausgeben lasse, dann funktionierts...an der LED-Steuerung wirds nicht liegen.


    Den ADC auf Port A deaktiviere ich per "ADCSRA = 0x00"...ist das korrekt bzw. sollte das überhaupt nötig sein? Beim ATMega8 hatte ich damit zumindest nie Probleme...


    Besten Gruß
    Modulform

  • kenne mich mit AtMega nicht aus, kenne nur ältere Chips und Beschreibungen von PIC-Controllerproblemen ...
    kann es sein, dass die Polarität der Ports bei AtMega ebenfalls konfiguriert werden kann?
    Und dass die LED sozusagen das Zweierkomplement zu 1 (=255) "beblinkt"?


    kann es sein, dass diese Chips CMOS-Pegel (Push & Pull) ausgeben und erwarten und dies Probleme stiftet? (Resultat könnte ähnlich sein wie nichtabgeschaltete A/D-Wandlerfunktionalität)

  • Eine gedrückte Taste ist ziemlich hochohmig, vor allem im fortgeschrittenen Alter. Die Teile haben immerhin 25 bis 35 Jahre auf dem Buckel! Möglicherweise sidn die Pull-Ups im AVR zu niederohmig und man bekommt den Port-Pin nicht weit genug runter gezogen für ein sicheres Low. Die CIA und VIA mit ihren NMOS-Pegeln und relativ schwachen Pull-Ups könnten da im Vorteil sein.


    Wenn das direkte EInlesen läuft, aber die Tastaturabfrage streikt, würde ich mal versuchen die Pull-Ups ganz abzuschalten oder durch externe Widerstände (hochohmig) zu ersetzen. Und irgendwo schwirrt mir im Hinterkopf herum, daß ein AVR besser mit umgekehrter Polung klarkäme- also 00000001 ausgeben, Pull-Down am Port und nach 1-Bits suchen.

  • Wenn man die ADCs nicht vorher aktiviert hat, muss man sie nicht zurücksetzen, da die reset-Werte der Register auf deaktiviert stehen. Das was ich meinte war schon JTAG/Clockout und solche Geschichten die per Fuse geschalten werden.


    Hast Du die Spannungsversorgung auch an AVCC angeschlossen? Diese wird für Port A benötigt.


    Ich hätte das am Ende so programmiert (wird mit LEDs nicht funktionieren):


  • Eine gedrückte Taste ist ziemlich hochohmig, vor allem im fortgeschrittenen Alter. Die Teile haben immerhin 25 bis 35 Jahre auf dem Buckel! Möglicherweise sidn die Pull-Ups im AVR zu niederohmig und man bekommt den Port-Pin nicht weit genug runter gezogen für ein sicheres Low. Die CIA und VIA mit ihren NMOS-Pegeln und relativ schwachen Pull-Ups könnten da im Vorteil sein.

    Die Pullupps bei dem Atmega sind im Datenblatt als 20k ... 50k ohm spezifiziert. Das sollte normalerweise reichen. Da diese Pullup sehr hoch sind kann allerdings die Anstiegsflanke etwas langsam/träge werden, daher könnte eine kleine Wartezeit vor dem auslesen nicht schaden (zb 50us).

  • Dank euch bin ich mittlerweile einen großen Schritt weiter :-D Ich habe mich an zschunky's Lösungsvorschlag gehalten und auch Port C als Eingang definiert und so die Spalten durchgeschaltet. Mittlerweile werden die gedrückten Tasten richtig erkannt und ausgewertet! Der Video-Terminal gibt auch schon die richtigen Zeichen aus, bloß halt in mehrfacher Ausführung, was am Timing bzw. einer bisher fehlenden Wiederholungskontrolle liegt. Da jetzt aber die Tasten richtig erkannt werden kann ich mich in Ruhe um den Rest kümmern :-)


    Danke noch mal und besten Gruß
    Modulform