Forum: Mikrocontroller und Digitale Elektronik 2 Ports gleichzeitig mit Bascom abfragen


von Uwe Leier (Gast)


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.

von Dussel (Gast)


Lesenswert?

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.

von Mattes (Gast)


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.

von Uwe Leier (Gast)


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.

von npn (Gast)


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

von Dussel (Gast)


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.

von Klaus (Gast)


Lesenswert?

Evtl. hilft Dir Peter Danneggers Entprellung weiter. Ein Klassiker. Such 
mal hier im Forum.

von npn (Gast)


Lesenswert?

Klaus schrieb:
> Evtl. hilft Dir Peter Danneggers Entprellung weiter.

Uwe Leier schrieb:
> beide Tasten sind entprellt

Die Zeile von Uwe hast du sicher übersehen... ;-)

von Joe (Gast)


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.

von Peter D. (peda)


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.

von m.n. (Gast)


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.

von Simpel (Gast)


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

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
Noch kein Account? Hier anmelden.