Hallo, auch wenn das Thema schon schon sehr oft behandelt wurde habe ich trotzdem noch eine Verständnisfrage zur Tastenentprellroutine mit timer interrupt von Peter Dannegger: Ich verstehe diesen (entscheidenden Teil) nicht so wirklich: get8key: ;/old state iwr1 iwr0 mov iwr0, key_old ;00110011 10101010 00110011 in key_old, key_pin ;11110000 eor iwr0, key_old ; 11000011 com key_old ;00001111 mov iwr1, key_state ; 10101010 or key_state, iwr0 ; 11101011 and iwr0, key_old ; 00000011 eor key_state, iwr0 ; 11101000 and iwr1, iwr0 ; 00000010 or key_press, iwr1 ; gedrückte Taste merken Zum Ablauf: Ich habe irgendwo im Programm meinen Timer0-Interrupt aktiviert, so dass ca. alle 10ms ein Interrupt ausgelöst wird! dann wird die ISR aufgerufen, die die Subroutine "get8key" enthält. (Registersicherungen etc. habe ich weggelassen, die sind obligatorisch) get8key speichert dann in "key_press" an welcher Stelle/ an welchen Bits Änderungen aufgetreten sind! also einem anderen Thread konnte ich entnehmen, dass iwr0 und iwr1 zusammen für jedes Bit des Eingangsbytes einen 2Bit-Zähler darstellen. Wie funktioniert das mit diesem Zähler? - Das heißt ich zähle irgendwo schon mal bis 4 ehe etwas passiert bzw. in das key_press register übernommen wird? kann man die Funktion nicht mal an einem Beispiel durchgehen? z.B. Taster 1 wurde gedrückt - beim ersten Durchlauf haben folgende Variable diesen Zustand etc.
Olli R. schrieb: > - Das heißt ich zähle irgendwo schon mal bis 4 ehe etwas passiert bzw. Nein, diese Routine vergleicht nur 2 Abtastungen auf Gleichheit. Es gibt ja nur eine Variable "key_old". "iwr0", "iwr1" sind nur temporäre Register (Interrupt_Working_Register_0/1). Benutzt man für Main und Interrupts unterschiedliche temporäre Register, spart man sich das Push/Pop ein. Die Variante mit 4 Abtastungen ist in C geschrieben. Um bis 4 zu zählen, braucht man 2 Bits, die sind in den Variablen "key_ct0" und "key_ct1". Peter
Peter Dannegger schrieb: > Nein, diese Routine vergleicht nur 2 Abtastungen auf Gleichheit. > Es gibt ja nur eine Variable "key_old". Ok nur ganz kurz! was macht das register "key_state"?
Ich hab das noch nicht ganz verstanden. Dazu habe ich den Programmcode nochmal angefügt. Ich habe meine Kommentare eingefügt! sind diese prinzipiell oder zumindest teilweise korrekt? Also was mir besonders Kopfzerbrechen bereit ist der Befehl: com key_old ; wieso wird das invertiert?
Ok mir ist jetzt nochmal was Grundsätzliches hängen geblieben. Der eingelesene Wert ist im Beispiel ja 11110000 der vorhergehende liegt bei 00110011 und der vorvorgehende liegt bei 10101010 So die Routine wertet aus, dass Bit1 in key_press gesetzt wird. Also kann ich mir das so denken: Bit 0 --> Taster gedrückt (wird auf GND gezogen) also wurden die Taster 0,1,2,3 gedrückt. Die Logik setzt aber nur Bit 1 auf "1", weil dieses Bit (bzw. der Taster) die beiden Male zuvor nicht gedrückt war? also t = -2 101010"1"0 t = -1 001100"1"1 t = 0 111100"0"0 Bit1 stellt den Taster dar, der gerade gedrückt ist und als einziger mindestens zweimal nicht gedrückt war? Da die ISR ca. alle 10ms aufgerufen wird, darf eine Taste also ca. 20ms nicht gedrückt sein ehe sie gedrückt wird? Hmmh ich glaube ich hab da nen Logikfehler gemacht? Ich hoffe ich habe hier jetzt nicht totalen Schwachsinn geschrieben!
Olli R. schrieb: > Da die ISR ca. alle 10ms aufgerufen wird, darf eine Taste also ca. 20ms > nicht gedrückt sein ehe sie gedrückt wird? Stimmt, es wird beides entprellt, das Drücken und das Loslassen. Damit können auch zittrige Leute das Gerät bedienen. Peter
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.