Autor Beitrag
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Do 20.11.03 14:27 
Hi

ich habe ein seltsammes Verhalten von GetKeyboardState festgestellt. Ich wollte eindeutig feststellen, welche Tasten dedrückt gehalten werden. Dazu habe ich GetKeyboardState verwendet.

Einfaches Testproggie
ein Timer -> kleines Intervall
ein Label

Timerevent:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TFormMain.Timer1Timer(Sender: TObject);
var i:integer;
    S:String;
    Keys:TKeyboardState;
begin
  GetKeyboardState(Keys);
  S:='';
  for i:=0 to 255 do
    if (Keys[i] shr 7 =1then //HiOrderBit -> gedrückt
      S:=S+'/'+IntToStr(i);
  Label1.Caption:=s;
end;


So jetzt einfach mal testen. Die ersten 3, 4 Tasten werden korrekt erkannt! Drückt man aber mehr, treten immer mehr Fehler auf. Manche werden erkannt, manche nicht! Ab 6,7 Tasten sind Fehler nicht mehr zuvermeiden.
Die Kombinationen, der erkannten Tasten scheint abhängig von der Tastatur zusein. Das bringt mich auf den Verdacht, daß es ein physikalisches Problem beim Messen der Tastendrücke ist. Aber ich kann mich irren, deshalb die Frage.
Kennt jemand eine Methode, mit der man beliebig viele Tasten erkennen kann?
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Sa 29.11.03 14:26 
Hallo,

schon mal 'ne Tastatur aufgeschraubt? Ich habe mal apfelsaft drübergleert, also bliebt mir nix anderes übrig... zur Sache: Da ist ein IC drin, mit 40-50 Pins, einige davon für das Kabel, dann für die LEDs... da bleiben nicht allzuviele für dei tasten übrig. Eingie Tasten, die logischerweise nicht gleichzeitig gedrückt werden (z.B. die Cursortasten) sind so verdrahtet, dass sie nicht gleichzeitig abgefragt werden kann - da heißt es, wer zuerst kommt, mahlt zuerst, ab eine gewissen anzahl Tasten (~5) wird jede weitere ignoriert. Und ich schätze mal, dass Windows auch ab 5 Tasten dicht macht, aber das ist nir eine Vermutung.

Auf jeden Fall kannst du da nix machen. Wozu auch? Wo braucht man so viele Tasten? Dei meisten brauch man in Ego-Shootern (denke ich mal). Aber mehr als laufen, strafen, springen und schießen kann man gleichzeitig eh' nicht. Und man kann auch maximal in 2 Richtungen gleichzeitig laufen.

Sorry, aber ich denke, da ist nix zu machen. Wozu brauchst du denn so viele Tasten?

_________________
Life is a bad adventure, but the graphic is really good!
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mo 01.12.03 10:31 
eindeutig ein tastatur problem.
der controller-ic für die tastatur macht dicht und\oder kommt nicht mehr hinterher und schickt irgendwelche daten die unter umständen zu fehlern führen.
kann mann nichts machen (außer weniger tasten zu benutzen)

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Simon Joker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.12.03 12:37 
Hi Andreas & Patrick

ich habe mich jetzt etwas durch die Datenblätter und Spezifikationen gelesen. Das Problem liegt grundsätzlich in der Meßmethode über eine Spannungsmatrix und in der Beschränkung des Keybuffers der IC-Controllers.

Zum Verständnis die Theorie. ;-)

Meßmethode:
Die einzelnen Tasten werden nicht einzeln abgefragt! Das wäre zu teuer und aufwendig.
Es wird eine Spannungsmatrix verwendet. Die sieht ungefär so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
     X1  X2  X3  X4  X5
     |   |   |   |   |
Y1---A---B---C---D---E---............
     |   |   |   |   |
Y2---F---G---H---I---J---............
     |   |   |   |   |
Y3---K---L---M---N---O---............
     |   |   |   |   |

(X & Y sind die Messkontakte.)
Jede Dimension ist auf eine Folie gedruckt und ein Tastendruck löst einen Kontakt zwischen den Dimensionen aus. Über den fliesenden Strom wird dann ermittelt welche Tasten gedrückt sind.
Wenn jetzt viele Tasten gedrückt sind, bricht die Spannung zusammen. Messung im Ar***! Das erklärt auch die unterschiedliche Anzahl der maximalen Tastenzahlt in Abhängigkeit der Kombination. Je nach Position in der Matrix werden einzelne Stränge mehr belastet. Im Beispiel wäre B-F-G kritischer als A-G-M.
In Anbetracht dieser Tatsache hat der Controler nur einen sehr kleinen Tastenbuffer von 8 oder 16 Byte. Jeder weitere Tastendruck geht immer verloren!

Tja damit ist die Idee einer billigen und einfachen Altarnative für einen I²C- oder CAN-Bus gestorben.

Noch einen Link zur Technik-Theorie von PS/2-Interfaces:
panda.cs.ndsu.nodak..../PICmicro/Links.html