Armins AVR-Buch - Taster_Schalter_auswerten

Zuletzt geändert am 09.12.2023, 17:23:38

Taster b.z.w. Schalter_auswerten


(armin77, 24.01.2013, 12:15:28)

Möchte man einen Schalter oder Taster auswerten gibt es mehrere Möglichkeiten.
Entweder man benutzt den intern Pull-Up Widerstand des AVR.

Bild schalter_auswerten.JPG

In diesem Fall liegt der Eingang über einen internen Widerstand auf +5V.
Wird der Schalter gedrückt liegt der Eingang auf Masse.
Das heißt der Eingang wird auf "0" abgefragt

Man kann den Schalter/Taster auch mit einem externen Widerstand anschließen:

Bild schalter_auswerten2.JPG

Hier ein Programmbeispiel bei dem der interne Pull-Up Widerstand des AVR benutzt
wird und der Taster mit IF Then abgefragt wird.
Ist er aus leuchtet die eine Led.
Ist er an leuchtet die andere Led.

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack=40
$swstack=16
$framesize = 32

Config Portb.2 = Output 'LED1
Config Portb.3 = Output 'LED2
Config Portb.1 = Input 'Schalter
Portb.1 = 1 'interner Pull-Up Widerstand aktiviert

Do
If Pinb.1 = 1 Then 'Wenn Schalter aus dann LED1 an
Portb.2 = 1
Else
Portb.2 = 0
End If

If Pinb.1 = 0 Then 'Wenn Schalter ein dann LED2 an
Portb.3 = 1
Else
Portb.3 = 0
End If


Loop
End



Wird ein externer Pull-Up Widerstand benutzt läßt man die Zeile "Portb.1=1" weg.

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack=40
$swstack=16
$framesize = 32

Config Portb.2 = Output 'LED1
Config Portb.3 = Output 'LED2
Config Portb.1 = Input 'Schalter


Do
If Pinb.1 = 1 Then 'Wenn Schalter aus dann LED1 an
Portb.2 = 1
Else
Portb.2 = 0
End If

If Pinb.1 = 0 Then 'Wenn Schalter ein dann LED2 an
Portb.3 = 1
Else
Portb.3 = 0
End If


Loop
End


Zu beachten ist, daß am Port des AVR bei geöffnetem Schalter eine "1" ansteht.
Wird er geschlossen wird der Eingang "0".
Also umgekehrte Logik.
Ebenfalls ist zu beachten, daß Eingänge mit Pin und nicht Port abgefragt werden.

Man kann auch mit einem Pull-Down Widerstand arbeiten.
Dabei liegt der Eingang des AVR bei nicht gedrücktem Schalter/Taster auf GND also "0"
Wird der Taster gedrückt liegen die 5V Versorgungsspannung am Eingang an.
Der Eingang wird also auf "1" abgefragt
Bild Taster1.JPG


Es gibt selbstverständlich auch die Möglichkeit als Schalter/Taster einen Öffner zu nehmen.

Bild Taster2.JPG

Am Eingang liegt über den Öffner des Tasters die 5V Versorgungsspannung an.
Wird der Taster/Schalter gedrückt, liegt der Eingang über den Widerstand auf GND.
Der Eingang wird also auf "0" abgefragt.

Und hier die letzte Möglichkeit.
Ein Taster/Schalter als Öffner mit Pull-Up Widerstand.
Man kann den internen Pull-Up Widerstand des AVR nehmen oder wie im Bild einen externen anschließen.

Bild Taster3.JPG

Der Eingang liegt über den Schalter/Taster auf GND.
Wird der Schalter/Taster betätigt liegt der Eingang über den Widerstand auf +5V also "1".
Das heißt das der Eingang auf "1" abgefragt wird.


Taster entprellen mit DEBOUNCE



Will man einen Schalter/Taster auswerten die starkes Kontaktprellen aufweisen
kann man den Befehl DEBOUNCE verwenden.

Der Befehl wird so verwendet:

Debounce Portb.0 , 0 , Taster_ein , Sub

Zuerst gibt man an, an welchem Pin sich der Taster/Schalter befindet.
Dann gibt man an, ob bei einer 1->0 Flanke (0) oder bei einer 0->1 Flanke (1) der Taster als betätigt angesehen wird.
Danach gibt man das Unterprogramm an, wohin gesprungen werden soll wenn der Taster/Schalter gedrückt wird.
Wird der zusätzliche Parameter Sub angegeben, arbeitet der Befehl wie gosub und springt wieder zum Ausgangspunkt zurück.
Ansonsten arbeitet der Befehl wie Goto und springt nur in das angegebene Unterprogramm.

Debounce wird aktiv wenn sich der Status des Pin ändert.
Dann wartet Debounce 25ms, ob der Status des Pin gleich bleibt.
Ist das der Fall wird in das Unterprogramm gesprungen.

Da Debounce immer 25mS das Programm unterbricht sollte man diesen Befehl sparsam verwenden.

Hier ein Beispielprogramm:

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100


Config Portb.1 = Output

Config Portb.2 = Input
Portb.2 = 1

Do
Debounce Pinb.2 , 0 , taster_ein , Sub
Loop

End

Taster_ein:

Toggle Portb.1

Return


An Portb.1 wird eine Led mit Vorwiderstand angeschlossen. An Portb.2 der Taster/Schalter.
Zieht der Taster/Schalter den Pin gegen Masse wird die Led umgeschaltet.


Bild debounce.JPG