Hallo!
Es gibt noch mehr Möglichkeiten wie man auf einen Schalter reagieren kann. Hier ist die nächste Möglichkeit: BITWAIT
BITWAIT ist ein Befehl der so lange an einer Stelle wartet, bis die übergebene Variable oder ein Pin auf 0 oder auf 1 gesetzt wird. Dieser Befehl blockiert das gesamte Programm. Dessen muss man sich bewusst sein.
Hier der zugehörige Schaltplan:
Und hier das Beispiel:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output
'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Taster1 = Input
Portd.2 = 1 'PullUp-Widerstand einschalten
Dim Status As Bit
Do
'Warten bis der Taster1 gegen GND zieht
Bitwait Taster1 , Reset
'Warten bis der Taster1 gegen VCC zieht
Bitwait Taster1 , Set
'Wenn die Variable Status...
If Status = 0 Then
'...auf 0 gesetzt ist, dann LEDs wechseln...
Led1 = 0
Led2 = 1
'...und Status-Variable auf 1 setzen.
Status = 1
Else
'...auf 1 gesetzt ist, dann LEDs wechseln...
Led1 = 1
Led2 = 0
'...und Status-Variable auf 0 setzen.
Status = 0
End If
Loop
End
Wenn man den Taster drückt, dann wechseln die LEDs hin und her. Experimentiere damit ein wenig. Lasse doch mal die Zeile Bitwait Taster1 , Set
weg und schau was dann passiert. Versuche es dir zu erklären.
Und eines dürfte bei diesem Beispiel ziemlich schnell auffallen. Wenn man den Taster drückt, dann wird normalerweise die LED gewechselt. Aber ab und zu passiert nichts oder es blinkt nur kurz auf.
Die meisten Taster oder Schalter "prellen". Das kommt daher, dass der Taster beim Schalten ein wenig nachschwingt. Das Signal eines Tasters oder Schalters ist beim Schalten nicht rein.
Das kann man auf der Hardwareseite umgehen, wenn man einen kleinen Keramikkondensator (sagen wir mal 10 nF bis 300 nF -- je nach Qualität des Schalters muss man diesen Wert evt. ein wenig verändern) parallel zum Taster schaltet. Man kann dieses Problem auch softwareseitig aus der Welt schaffen. Aber darauf möchte ich erst später eingehen.
Hier der Schaltplan mit entprelltem Taster:
Vorsicht!
Wenn die Schaltung Strom bekommt, dann läd sich der Kondensator C3 über den internen PullUp-Widerstand auf. Das bedeutet, dass in diesem Moment PD2 nach GND gezogen wird. Sobald der Kondensator aufgeladen ist, zieht der PullUp PD2 nach VCC. Da die zwei Prüfungen mit BITWAIT so ziemlich das Erste sind was ausgeführt wird, wird die Schleife einmal durchlaufen ohne einen Tastendruck abzuwarten. Möchte man das vermeiden, dann sollte man mit WAITMS ein paar Millisekunden warten bevor man die MainLoop loslegen lässt.
Den zugehörigen Original-Beitrag findest du im Loetstelle-Forum.
Ich programmiere Progressive Web Applications, Mobile Apps, Desktop-Programme und noch vieles mehr. Falls es dich interessiert, findest du mehr Informationen darüber auf meiner Business-Website.