schwierig, es gibt auch scanner die mit verschiedenen mustern abwechselnd in beide richtungen scannen, damit kann man wohl diverse "ghostkey" probleme in den griff kriegen
Quoted
Die Frage wäre, ob nicht eine automatische Erkennung der Richtung machbar ist: Die Matrix-Output-Routine lauscht so lange, bis einer der beiden Ports nicht mehr $ff ist. Je nachdem, welcher Port als Erster ungleich $ff ist, springt man in Richtungs-Routine A oder B. Problem: Richtungswechsel ist nur dann möglich, wenn die Abfrage-Routine auf C64-Seite auch brav auf $ff zurückschaltet und der Benutzer nicht gerade am Joystick rappelt.
Oder Binärkomparatoren auf beiden Ports nutzen um einen Interrupt zu erzeugen? Allerdings klappt das auch nur wenn kein perfider Coder einzelne Bits der Ports wechselseitig benutzt.
Quoted
Wenn man immer nur ein Bit als Ausgang schaltet und 15 Bits als Input auswertet, können auch bestimmte Ghostkey-Effekte als Solche erkannt werden.
Als IRQ-Quelle müsste man eigentlich die Ports eines Microcontrollers so programmieren können, dass sie einen falling-edge-IRQ auslösen, also ganz ohne Zusatzhardware. Oder können das die 8-bit AVRs nicht?
|
|
Quellcode |
1 2 3 |
10 x=rnd(-1963):fori=1to81:y=rnd(1):next 20 forj=1to5:printchr$(rnd(1)*16+70);:next 30 printint(rnd(1)*328)-217 |
Für die Tastenmatrix-Abfrage sollte das allerdings kein Problem darstellen, auch wenn die Worst-Case-Interruptlatenzzeit beim AVR IIRC 6 Takte beträgt.
Mhhh, nein. Sobald man auf lesen schaltet und im gleichen Moment die CIA auch liest, ist ja Mist.
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 |
Endlosschleife
Alle Leitungen lesen
Die Bits setzen/wegmaskieren, die ich selbst gerade auf Ausgang habe
Alle Bits auswerten, die Low sind
Wenn das andere Ende der Matrix noch auf Input steht und nicht Low ist
Anderes Ende der Matrix entsprechend auf Low ziehen (Ausgang)
Bits die auf Input stehen und nicht mehr Low sind
Anderes Ende der Matrix wieder auf Lesen schalten
PS2-Protokoll weiterfahren (Zustandsmaschine)
Bei Tastenänderung
Daten für o.g. Mechanismus vorbereiten (z.B. Tabellen)
Und von vorn
|
This post has been edited 1 times, last edit by "skoe" (Jun 23rd 2009, 9:35am)
Quoted
Nun muss ich zugeben, dass ich nur ahne, was eine Ghostkey ist und keinen Schimmer habe, wie sie normalerweise detektiert werden. Deshalb weiß ich auch nicht, ob und warum dieser Algorithmus nicht immer funktionieren würde.
- schlichtes scannen in die andere richtung. (zur unterscheidung joystick/tasten reicht das glaub ich)
Quoted
- scannen mit verschiedenen bitmustern, und eventuell auch sogar mit in verschiedene richtungen eingestellten leitungen auf dem selben cia port
Quoted
- ausnutzen von dreckeffekten, zb paar takte lang ausgang gegen ausgung treiben, dann im scanner die latches lesen. hier kann man durch messen der zeit bis ein bit kippt rückschlüsse darauf ziehen was in der matrix passiert (ähnlich wie bei der abfrage von shift-lock)
Quoted
letzteres würde ich vermuten ist schwierig bis garnicht zu simulieren mit so einer schaltung (egal welcher art).
In dem Moment, wo die CIA den zuvor von ihr benutzten Ausgang auf Eingang umschaltet, bekommen wir das mit und ändern auch die Richtung. Dazu muss die Schleife wie o.g. schnell genug durchlaufen (vor dem nächsten Lesen (4 µs?) muss alles erledigt sein), sonst klappt's nicht.
Irgendwann geht Port A dann auf $ff, weil dort nach Input gesucht wird, woraufhin Du erst reagieren kannst - möglicherweise zu spät, denn die Ghostkey-Routine hat schon gesagt "oh, da ist ff, also wurde doch nichts in dieser Spalte gedrückt".
Quoted
steht auf beiden Seiten die 0, ohne dass Du herausfinden kannst, wer welchen Pin auf 0 gezogen hat
This post has been edited 1 times, last edit by "skoe" (Jun 23rd 2009, 2:50pm)
Kann die Routine denn aus Port A lesen, ohne dort auf Eingang umgeschaltet zu haben?
Forum Software: Burning Board® 3.1.7, developed by WoltLab® GmbH