Tastaturabfrage

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smileys
:-) ;-) 8-) :-( :arrow: :idea: :like: :keen:
Mehr Smileys anzeigen

BBCode ist ausgeschaltet
Smileys sind eingeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Tastaturabfrage

von elianda » Do 22. Feb 2007, 15:30

Ich bezweifle auch, dass die Routine zum generieren des Rechtecks ueber den LPT irgendwie zeitstabil ist. Ich denke wenn man sich das auf den Oszi anschaut und auf die steigende Flanke triggert, dann springt die fallende Flanke wild.
Unter Win bekommt man das schon garnicht hin.
Mit CLI / STI vielleicht halbwegs. Trotzdem ist noch das Problem des Tastverhaeltnisses und der Pipeline-Architektur eines Pentiums und aufwaerts.

Wenn du Elektroniker?!? bist, dann nimm doch nen einfachen 1 MHz Quarz und ein 9V Block und ein Tick Zusatzelektronik, das hat man doch in 5 mins zusammengeloetet. Das gibt auch saubere Taktflanken.

von bttr » Do 22. Feb 2007, 10:11

Ich werde das Gefühl nicht los, daß du wohl von Elektronik Ahnung hast, aber von Programmierung kaum die Bohne verstehst. 8-) Aber wenn du's so machen willst, dann bitte sehr.

von Gast » Mi 21. Feb 2007, 21:31

Hi liebe Gemeinde,

daß es funktioniert, und daß das Programm anhält, sehe ich an der Meldung : "DAS PRORAMM WURDE ORNUNGSGEMÄSS BEENDET" .
MOV AH,4C
INT 21
ist schon ok, aber ich will ja vielleicht das Ganze noch ändern, im Einzelschrittmodus anschauen, editiern ..... oder was Neues entwerfen, und da will ich nicht unbedingt zur DOS Ebene zurück und jedesmal Debug neu aufrufen.
Außerdem möchte ich, da die Sequenz ja in die Schleife integriert ist, sie so kurz wie möglich halten. Bei symmetrischem Rechteck brauch ich den Part ja zweimal in der Schleife.

Einen erquicklichen Abend noch

Berndt

von bttr » Mi 21. Feb 2007, 18:03

Richtig, das wäre eine nette Zugabe, schien mir hier aber überflüssig, weil der OP ja nicht von Stapelbetrieb redete. Soll er halt doch ein "dec al" dazupacken.

von Dosenware » Mi 21. Feb 2007, 16:42

hmm, errorlevel 00 (AL) waere auch recht nett oder?

von bttr » Mi 21. Feb 2007, 11:00

Vielleicht werde ich ja jetzt wieder "gesteinigt", aber wo hast du das Programmieren erlernt?

"INT 21" ruft grundsätzlich mal eine DOS-Funktion auf. Um welche es sich dabei handelt, wird i.d.R. im AH-Register festgelegt, welches bei dir aber keinen definierten Inhalt hat. Daher ist das Beenden wohl eher eine Lotterie. Es soll ja Leute geben, die installieren deswegen ein anderes Betriebssystem. :roll: Ich schlage aber vor einfach die 21 durch eine 20 zu ersetzen oder noch die zusätzliche Zeile "mov ah, 4c" einzufügen.

von Gast » Di 20. Feb 2007, 20:21

Guten Abend und einen fröhlichen Faschingsdienstag,

endlich hat's geklappt.

der 4-Zeiler

IN AL, 60 (Abfrage Tastatur)
CMP AL, 01 (vergleiche Scancode ESC = "01")
JNZ xxx (ungleich 0, dann wiederhole Schleife)
INT 21 (sonst beende Programm)

ist schon richtig !!

Das Ganze lief nur nicht mit der DOS Version, die auf meinem Windows ME
vorhanden ist. Weiß nicht warum.
Habe nun DOS 6.22 aufgespielt, und nun läuft es auf Anhieb einwandfrei.

Dank nochmals für Eure Anteilnahme und einen Super Abend wünscht Euch

Berndt

von bttr » Mo 19. Feb 2007, 14:28

Es wäre auch schön, wenn du dir entsprechend Gedanken machen hättest, bevor du deine Frage erneut stellst. Im Prinzip ist sie nämlich schon beantwortet worden. Ein wenig mußt du deinen Grips schon allein anstrengen.

von Gast » Mo 19. Feb 2007, 14:01

Hallo liebe Leute,
da hab ich ja eine ganze Lawine losgetreten. Schön, das es so viele Menschen gibt, die sich noch Gedanken machen !
Danke für Eure Antworten.

Es ist einfach so, daß ich für Demonstrationszwecke (privat) eine kleine Routine bräuchte, mit der ich auf x-beliebigen Tastendruck oder auch eine bestimmte Taste hin eine laufende Schleife (z. B. Rechteckgenerator, Ausgabe an Bit 1) unterbrechen kann. Die Abfrage ist ein Bestandteil der Schleife.
z.B. diese Schleife

MOV DX,378 (Parallelschnittstelle initialisieren)
MMOV,AL,01 (Bit 1=1)
OUT DX,AL (Ausgabe an Parallelschnittstelle = 1)
MOV,AL,00 (Bit 1=0)
OUT DX,AL (Ausgabe an Parallelschnittstelle = 0)

Hier sollte jetzt die Tastaturabfrage geschehen, und die Schleife sollte zu
MOV AL,01
zurückspringen, oder das Programm bei Tastendruck abbrechen(z.B. INT 21)
Ich hatte früher mit dem verflixten "IN AL, 60"
und einem Vergleich das ganze schon am Laufen, habe jedoch die Unterlagen nicht mehr.
Was mich interessieren würde, was genau kommt rein beim IN-Befehl
und steht dann in AL oder auch AX ?!
Was, und wie kann ich dann vergleichen ?!

Nochmals vielen Dank für Eure Bemühungen und einen wunderschönen Tag


Berndt







I

von Dosenware » Mi 14. Feb 2007, 15:48

@Odin

ich sags mal so: wenn es nur darum geht einen Tastendruck mitzukriegen, reicht es im Interrupt einen wert im Speicher zu setzen.
(mov x,y - mehr muss da nicht gemacht werden)

diesen Wert im Speicher zu ueberpruefen geht dann verdammt schnell - zumal dieser dann sehr wahrscheinlich sowieso im Cache ist...

und bremsen wird er wahrscheinlich nicht, denn solange du nicht im Interruptregister die Interrupts sperrst, werden sie sowieso ausgefuehrt...(es sei denn der IRQ wird erst per SetIntVec freigeschalten; mit IRQs habe ich mich bisher noch nicht auf Assemblerebene herumgeschlagen - zumindest nicht auf PCs)

von elianda » Mi 14. Feb 2007, 10:56

Der Befehl in al, 64h dauert vermutlich wesentlich laenger als der Rest des Codes. So dass eine direkte Abfrage oder eine Abfrage ueber Soft Int nahezu dieselbe Zeit dauern duerfte. (Unter der Annahme, dass der Soft Int auch nur einmal in al,64h ausfuehrt)

Um das herauszufinden, kann man mit Debug auch mal schnell in den Bios Code schauen oder zB in den Source von 'keypressed' unter TP.

von Odin » Mi 14. Feb 2007, 06:49

Ob nun Hardware- oder Softwareinterrupt, das macht letztenendes ja kaum einen Unterschied... der Softwareinterrupt ist zwar langsamer, aber bremsen können beide...

Ich glaube, es wäre sinnvoll wenn sich der Autor dieses Threads zu dem Ziel dieser Sache äußern würde - dann könnte man vielleicht eher eine passende Lösung finden...

von elianda » Mi 14. Feb 2007, 01:56

Harte Echtzeitbedingungen? :P

Bei einem PC ist das doch absolute Augenwischerei. Wenn du hier etwas halbwegs Echtzeit machen willst, musst du das durch extra Hardware erledigen. Ansonsten musst du durch nicht ganz triviale Routinen die Zyklen vorher ausmessen, beim Pentium durch den integrieten MSR Counterm beim 486er wirds noch viel schwerer.
Aber das geht auch nicht immer.

Selbst Latenzen wie beim C64 fuer Interrupts (6 us) gehoeren beim PC in den Bereich der Maerchen und MYthen.
[/quote]

von Dosenware » Di 13. Feb 2007, 20:00

Bei ihm gehts um einen Softwareinterrupt...bei mir um einen Hardwareinterrupt (sprich: ich will nicht die Tastatur abfragen, die soll schon selbst sagen wenn was ist...)

diese realisierung hat den Vorteil, das das Programm irgendwas anderes machen kann, bei Tastendruck gehts dann automatisch an der richtigen stelle weiter (sonst braucht man eine Abfrageschleife - was durchaus eine verzoegerte Reaktion bedeuten kann), hat aber den Nachteil das dies fuer harte Echtzeitbedingungen ungeeignet ist (durch den Interrupt treten unvorhersehbare verzoegerungen im Programmablauf auf) und ist fuer reine Warteschleifen ziemlich sinnlos...

Edit: oder mal schnell in Pascal ausgedrueckt:

Code: Alles auswählen

uses dos;
var count:longint;
var OldInterrupt: procedure;
procedure NewInterrupt; interrupt;
 begin
  inc(count);
  OldInterrupt;
  writeln(count);
 end;
{int09=Tasta}
 begin
  count:=0;
  GetIntVec ($09, @OldInterrupt);{ Uebergebe den Interruptvector $09 an OldInterrupt}
  SetIntVec ($09, @NewInterrupt);{ Setze den Interruptvector $09 auf NewInterrupt}
  repeat;
  {Hier ist wirklich nix}
  until count>9;
  SetIntVec ($09, @OldInterrupt);
end.

von Odin » Di 13. Feb 2007, 19:20

Er hat ja geschrieben, dass er keinen Interrupt will...

Nach oben