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