2 Ports gleichzeitig mit Bascom abfragen

Gast #4094420
Lesenswert?

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.
Gast #4094453
Lesenswert?

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.
Gast #4094462
Lesenswert?

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.
Gast #4094470
Lesenswert?

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
Gast #4094475
Lesenswert?

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.
Gast #4094505
Lesenswert?

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.
#4094615
Lesenswert?

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.
Gast #4094784
Lesenswert?

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.
Gast #4095714
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren