Forum: Mikrocontroller und Digitale Elektronik Kennt sich jemand mit Tastatur Puffern aus ?


von Michael L. (nightflyer88)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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.

von Michael L. (nightflyer88)


Lesenswert?

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 ?

von Roland .. (rowland)


Lesenswert?

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.

von Roland .. (rowland)


Lesenswert?

Michael L. schrieb:
> FreeDOS

Okay, da weiß ich nicht, ob es Events gibt ;-).

von Michael L. (nightflyer88)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Geh ins BIOS des PC's und schalte Tastaturwiederholung aus.

von Stefan F. (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

Nachdem ich die Frage nochmals gelesen habe.

Du kannst im BIOS die Wiederholrate auch hochsetzten.

von Michael L. (nightflyer88)


Lesenswert?

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 ?

von Klaus (Gast)


Lesenswert?

Hast dus es unter Basic schon mal mit INKEY$ bzw, NEWINKEY$ probiert?

von Svenska (Gast)


Lesenswert?

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

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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.

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan N. (stefan_n)


Lesenswert?

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.

von Michael L. (nightflyer88)


Lesenswert?

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

von Dirk Wolfgang Glomp (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.