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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.