Guten Abend, habe ein Programm was 2 einzelne Taster per Debounce abfragen kann. Jeder Taster löst eine Funktion aus- klappt! Wie kann ich es machen, dass wenn ich beide Tasten gleichzeitig drücke eine 3. Funktion ausgelöst wird. So in etwa if PortB.1 and PortB.0 gleich 0 then gosub Schalten? In der Bascom Hilfe ist nichts zu finden. Viele Grüsse Uwe.
Uwe Leier schrieb: > habe ein Programm was 2 einzelne Taster per Debounce abfragen kann. Was soll das heißen? Man kann Taster in der Abfrage entprellen, aber nicht durch Entprellung abfragen. Allgemein liest du die Ports ein und löst über verschiedene Bedingungen die Funktionen aus.
Uwe Leier schrieb: > Wie kann ich es machen, dass wenn ich beide Tasten gleichzeitig > drücke eine 3. Funktion ausgelöst wird. Gleichzeitig geht nicht. Du könntest aber beide Debounce Kommandos nacheinander ausführen. In der Subroutine führst du aber keine Aktion aus, sondern setzt nur ein Flag, ob der jeweilige Taster gdrückt wurde. Nach den beiden Debounce kommt dann die If Abfrge auf die Flags. Sind beide gesetzt, hast du deine 3. Funktion. Nach der Abfrage, vor erneutem Erreichen aber nicht vergessen die Flags wieder zu löschen.
hallo, beide Tasten sind entprellt und werden jeweils einzeln abgefragt. In der "Subroutine" stehen die Funktionen. Nun soll , wenn beide Tasten die PORTs auf Masse schalten, beide praktisch low sind, zu einer neuen Subroutine gesprungen werden. Ich will mir einen 3. Taster ersparen. Grüsse.
Uwe Leier schrieb: > hallo, > beide Tasten sind entprellt und werden jeweils einzeln abgefragt. > In der "Subroutine" stehen die Funktionen. > Nun soll , wenn beide Tasten die PORTs auf Masse schalten, beide > praktisch low sind, zu einer neuen Subroutine gesprungen werden. > Ich will mir einen 3. Taster ersparen. > Grüsse. Das ist schon alles klar, was du willst. Es wurde doch schon geschrieben. Du liest erstmal beide Taster ein und triffst erst anschließend die Auswahl, welche Subroutine bzw. welche Aktion du anspringen willst. beide Taster "0": Routine 3 nur der erste Taster "0": Routine 1 nur der zweite Taster "0": Routine 2
1 | if(A==0&&B==1) |
2 | {
|
3 | Funktion1(); |
4 | }
|
5 | else if(A==1&&B==0) |
6 | {
|
7 | Funktion2(); |
8 | }
|
9 | else if(A==1&&B==1) |
10 | {
|
11 | Funktion3(); |
12 | }
|
Wobei eine '1' bedeutet, dass der Taster gedrückt ist. Alternativ
1 | switch(A&(B<<1)) |
2 | {
|
3 | case 1: |
4 | Funktion1(); |
5 | break; |
6 | case 2: |
7 | Funktion2(); |
8 | break; |
9 | case 3: |
10 | Funktion3(); |
11 | break; |
12 | }
|
Einrückung durch Tabulator geht hier nicht.
Evtl. hilft Dir Peter Danneggers Entprellung weiter. Ein Klassiker. Such mal hier im Forum.
Klaus schrieb: > Evtl. hilft Dir Peter Danneggers Entprellung weiter. Uwe Leier schrieb: > beide Tasten sind entprellt Die Zeile von Uwe hast du sicher übersehen... ;-)
Frage bei der Auswertung des ersten Tasters zuerst, ob auch der zweite Taster gedrückt ist. Dann die 3. Funktion ausführen. und frage bei der Auswertung des zweiten Tasters zuerst, ob auch der erste Taster gedrückt ist. Dann die 3. Funktion ausführen. Das wars.
Uwe Leier schrieb: > Wie kann ich es machen, dass wenn ich beide Tasten gleichzeitig > drücke eine 3. Funktion ausgelöst wird. Bei 8MHz CPU-Takt mußt Du für gleichzeitig beide Tasten innerhalb 125ns drücken und das kann niemand. Es gibt 2 Ansätze: 1. Beim Loslassen der einen Taste prüfen, ob die andere gedrückt ist. Nachteil, die Reaktion erfolgt immer erst beim Loslassen. 2. Innerhalb eines Zeitfensters (z.B. 0,5s) nach Drücken prüfen, ob noch eine Taste gedrückt wird. Die Reaktion erfolgt dann schon nach Ablauf dieser Zeit.
npn schrieb: > Es wurde doch schon geschrieben. Du liest erstmal beide Taster ein und > triffst erst anschließend die Auswahl, welche Subroutine bzw. welche > Aktion du anspringen willst. Und ergänzend mußt Du abwarten, bis die Zustände beider Taster über 2 - 3 Intervalle stabil sind. Man könnte es als eine Art 'Nachentprellung' bezeichnen. Daher wäre es garnicht nötig, die Taster schon einzeln zu entprellen.
Hi Uwe, probier mal folgenden Code. Hab ihn nicht getestet, sollte aber so funktionieren... '$regfile = "attiny85.dat" '$crystal = 8000000 '$hwstack = 40 '$swstack = 16 '$framesize = 32 'Falls deine Taster low_aktiv sind: Const Down = 0 Const Up = 1 Dim C As Byte Dim Key_state As Byte Dim Key_state_old As Byte Dim Taste as Byte 'hier musst du die von dir benutzten Ports deiner Tasten eintragen: Key1 Alias PinB.0 Key2 Alias PinB.1 On Wdt WD_ISR 'Watchdogtimer auf Int-Modus und 32ms setzen: Wdtcr = &B01000001 Enable Interrupts WD_ISR: Incr C If Key1=Down AND Key2=Down then Key_state = 3 Elseif Key2 = Down Then Key_state = 2 Elseif Key1 = Down Then Key_state = 1 else Key_State=0 end if If C = 16 And Key_state <> Key_state_old Then C = C - 1 Key_State_old= Key_State If C = 16 Then Taste = Key_State C = 0 End If Return 'In der Variable "Taste" stehen dann nach ca. 0,5s die 4 Werte: '0 - keine Taste gedrückt '1 - Taste1 gedrückt '2 - Taste2 gedrückt '3 - beide Tasten gedrückt
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.