Hallo Zusammen Kennt sich jemand mit Tastatur Puffern aus ? Zum Projekt: Mit einem PC soll ein Motor angesteuert werden. Der Motor soll drehen, solange eine bestimmte Taste auf der Tastatur gedrückt wird. Wird die Taste losgelassen, stoppt der Motor. Das Problem: Wenn man eine Taste gedrückt hält, schreibt die Tastatur ca. alle 0.2s das ascii-Zeichen der Taste in den Tastaturpuffer. Ich dachte mir, wenn ich nun alle 0.5s den Puffer auslese, und schaue ob die Taste immernoch gedrückt ist, sollte dies doch funktionieren, tut es aber nicht. Alle paar Sekunden kommt kein Zeichen, obwohl die Taste immernoch gedrückt ist, und somit ruckelt der motor kurz. Gibt es eine andere Möglichkeit die Tastatur abzufragen, ohne Puffer oder so ? Gruss Michael
Michael L. schrieb: > Gibt es eine andere Möglichkeit die Tastatur abzufragen, ohne Puffer > oder so ? Mit DOS auf dem PC geht das ohne Probleme, oder laß den PC doch einfach weg.
m.n. schrieb: > oder laß den PC doch einfach weg Geht nicht. Der macht natürlich noch andere sachen als nur den Motor ansteuern. > Mit DOS auf dem PC geht das ohne Probleme Super !! Da hab ich glück, das ganz läuft bei mir auf FreeDOS. Aber wie mach ich das ?
Womit programierst Du? Es gibt doch bestimmt die Tastenevents, die ausgelößt werden, wenn eine Taste gedrückt und wider losgelassen wird. Diese Events sind eigentlich recht zuverlässig. Allerdings hängt das alles mit der Auslastung des Betriebssystems zusammen, wie schnell die Software reagiert.
Ich Programmiere mit Powerbasic 3.5 Ja stimmt, da gibt es die Tastenevents -> ON taste GOTO oder sowas. Da zur Ansteuerung des Motors, ein PWM signal benötigt wird, habe ich einige Interrupts ausgeschaltet, sonst wird das PWM gestört, und der Motor läuft nicht sauber. Folgende Interrupts sind ausgeschaltet: OUT (&H21), &b11110100 bit 7 = 0 enable parallel printer interrupt bit 6 = 0 enable diskette interrupt bit 5 = 0 enable fixed disk interrupt bit 4 = 0 enable serial port 1 interrupt bit 3 = 0 enable serial port 2 interrupt bit 2 = 0 enable video interrupt bit 1 = 0 enable keyboard, mouse, RTC interrupt bit 0 = 0 enable timer interrupt Das Tastatur interrupt ist also nicht ausgeschaltet, sollte demnach funktionieren. Werde dies gleich mal ausprobieren.
Geh ins BIOS des PC's und schalte Tastaturwiederholung aus.
Die Tastatur sendet ein Signal, wenn die Taste gedrückt wird, und ein anderes, wenn sie wieder losgelassen wird. Die Tastenwiederholung wird von einem Stück Software generiert. Diesen Teil musst Du umgehen. Du musst die Tastatur-Events abfragen, nicht die Buchstaben aus dem Puffer. Hier ist eine Beschreibung, wie man die Events direkt beim Tastaturcontroller abfragt: http://www3.telus.net/alexander_russell/course/chapter_4.htm
Nachdem ich die Frage nochmals gelesen habe. Du kannst im BIOS die Wiederholrate auch hochsetzten.
Also das mit dem Tastenevent wie anfangs diskutiert, habe ich ausprobiert, passiert jedoch genau das gleiche. Im BIOS die Tastaturwiederholung ausschalten, geht bei meinem alten QOMPAQ nicht. @Stefan Da hast du recht, ich muss die original Tastatur ISR umgehen. Ich habe die Beschreibung angeschaut, Theoretisch hab ich's begriffen, ich kenne mich aber zuwenig mit C aus. Ich programmiere normalerweise in Basic, ab und zu auch ASM. Wie genau muss ich die Original ISR deaktivieren und meine eigene Aktivieren ?
Hast dus es unter Basic schon mal mit INKEY$ bzw, NEWINKEY$ probiert?
Wenn du eine eigene Tastatur-ISR vergeben willst, schreibst du die Adresse deiner Routine in die IVT: http://www.lowlevel.eu/wiki/IVT Wie der Controller funktioniert und was deine Routine ungefähr tun muss, ist z.B. auf http://www.lowlevel.eu/wiki/KBC beschrieben (allerdings C).
Ok, vielen dank. Die Kommunikation mit dem Controller sollte klar sein. Aber das mit der Adresse begreif ich noch nicht ganz. Ich kann ja nicht einfach irgendeine Adresse nehmen, die muss ja an einem freien Ort liegen, aber wie finde ich heraus an welcher Stelle das ist ? Und wie definiere Ich die Routine, dass die auch an der Stelle liegt an der sie sein sollte ? Um eine Routine mit Absoluter Adresse aufzurufen habe ich den Befehl im Anhang gefunden.
Michael L. schrieb: > Super !! Da hab ich glück, das ganz läuft bei mir auf FreeDOS. Aber wie > mach ich das ? Ich habe vor etlichen Jahren (mein Gott, das ist fast 20 Jahre her, wie doch die Zeit vergeht) mal die Oberfläche für einen MP3-Player unter DOS programmiert. Die hat unter anderem auch die Tasten-Queue "gehooked", um eigene Events einzuspeisen, die in Wirklichkeit Resultat einer via COM-Port arbeitenden IR-Fernbedienung waren. Reines Auslesen der Queue dürfte noch viel einfacher sein, aber die Prozeduren zum Installieren des Hooks sind sicher auch für dein Problem anwendbar. Nun muß ich bloß noch diese verdammte Altlast irgendwo auf meinen Platten wiederfinden. Das gestaltet sich zum Problem. Bisher gefunden habe ich nur den Code einer erheblich späteren Portierung des ganzen Software-Systems auf Windows98 mit WinAmp als eigentlichem Player (aber für die ursprüngliche Hardwarebasis, bloß CPU statt P90 ein P133). In diesem Code ist aber natürlich der ganze DOS-Quatsch nicht mehr drin, ich wollte ja schon damals von diesem üblen DOS endlich loskommen... Mal ernsthaft: Was um alles in der Welt treibt jemanden HEUTE dazu, dieses vorsintflutliche "Betriebssystem" noch ernsthaft zu verwenden? Oops, Suche erfolgreich, da isses. Agent Ransack ist halt ein wirkliches Suchtool, ganz im Gegensatz zu diesem völlig unbrauchbaren Scheißdreck, den Winzigweich zu seinen Drecks-OS mitliefert und der von Version zu Version immer weniger findet... Ich häng's an. Aufdröseln darfst du es selber. Ich hab' kurz reingeschaut, es ist sogar andeutungsweise kommentiert (relativ ungewöhnlich für meine privaten Projekte), also ist die Sache nicht ganz hoffnungslos. Übrigens war damals mein Werkzeug wohl ein Assembler namens "A86". Daran erinnere ich mich nicht mehr wirklich, aber die Namen der übergeordneten Verzeichnisse verraten mir das... Möglich, daß dir diese Information bei der Interpretation des Codes hilft.
Stefan us schrieb: > Die Tastenwiederholung wird von einem Stück Software generiert. Diesen > Teil musst Du umgehen. Du musst die Tastatur-Events abfragen, nicht die > Buchstaben aus dem Puffer. Falsch. Die Tastenwiederholung kommt von der Tastatur, kannst du mit dem Oszi nachprüfen. Allerdings kann man die Wiederholrate einstellen oder die Funktion ganz abschalten, indem der PC nach der Initialisierung ein entsprechendes Kommando an die Tastatur schickt.
So habe nun eine funktionierende Lösung: Die original Tastatur ISR so lassen wie sie ist, und einfach direkt das Register &H60 auslesen, ohne interrupt. Ist bit7 = 0 wurde die Taste gedrückt, ist bit7 = 1 dann wurde die Taste losgelassen. Die abfrage des Registers passiert bei mir in einer Endlosschlaufe. Mir ist natürlich klar, wenn gleichzeitig zwei Tasten gedrückt/losgelassen werden, kann es passieren, dass die belauschte Taste "verpasst" werden kann. Für mein Anwendungsfall sollte dies jedoch genügen. Vielen Dank an alle
Moin. Tastaturcontroller pollen:
1 | cli ; Software-Interrupts verhindern |
2 | mov al, 2 ; IRQ 1 sperren => Tastatur-ISR wird damit abgeschaltet |
3 | out 21h, al |
4 | sti ; Software-Interrupts erlauben |
5 | :--------------------------------- |
6 | ANFANG: ; andere Befehle |
7 | |
8 | |
9 | :--------------------------------- |
10 | GETKEY: in al, 64h ; Tastatur-Status holen |
11 | test al, 1 |
12 | jz ANFANG |
13 | test al, 20h ; wenn PS2-Mouse weiter |
14 | jnz ANFANG ; weil wir wollen hierbei keine Mousedaten bekommen |
15 | in al, 60h ; Tasten-Code holen |
16 | cmp al, 1 ; Escape Taste? |
17 | jz HOME ; ja dann beenden |
18 | :--------------------------------- |
19 | |
20 | ; weitere Tasten abfragen |
21 | |
22 | jmp ANFANG |
23 | :--------------------------------- |
24 | HOME: cli |
25 | xor al, al ; IRQ 1 freigeben |
26 | out 21h, al |
27 | sti |
28 | |
29 | mov ah, 1 ; Tastatur-Puffer löschen |
30 | int 16h |
Zum Konvertieren des Tastencodes nach ASCII:
1 | TASTTAB DB 02h,03h,04h,05h,06h,07h,08h,09h,0Ah,0Bh,0Ch,0Dh |
2 | DB 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Eh,1Fh |
3 | DB 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,2Bh,2Ch,2Dh,2Eh,2Fh |
4 | DB 30h,31h,32h,33h,34h,35h,39h |
5 | DB 56h |
6 | tablen = ($-TASTTAB) |
7 | |
8 | TEXTTAB DB "1234567890ß'" |
9 | DB "qwertzuiopü+as" |
10 | DB "dfghjklöä^#yxcv" |
11 | DB "bnm,.- " |
12 | DB "<" |
13 | Textablen = ($-TEXTTAB) |
14 | |
15 | Weitere Tasten: |
16 | ;----------------------------------------------------------------------- |
17 | ; Tab,shift li.,shift re.,HOME,UP,LEFT,RIGHT,END,DOWN |
18 | ;---------- |
19 | SONTAB DB 0Fh,2Ah,36h,47h,48h,4Bh,4Dh,4Fh,50h |
20 | Extablen = ($-SONTAB) |
Dirk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.