Hallo!
Letztens habe ich erklärt, wie man über ein digitales Signal des µC eine LED oder ein Relais ansteuern kann. Heute ist es so weit, dass ich in die andere Richtung gehen möchte. Wie schließt man einen Schalter an?
Es gibt zwei grundsätzliche Möglichkeiten. Entweder der Schalter zieht gegen VCC oder er zieht gegen GND. Beides lässt sich detektieren. Und was passiert wenn der Schalter nicht gedrückt wird? Das wird oft nicht bedacht. Und erst heute (wie peinlich) ist es mir selber passiert, dass ich mich nicht darum gekümmert habe. Und statt 10 Hz hatte ich schwankende 2600 Hz an einem Eingang und wusste nicht warum. :-)
Wenn der Schalter gegen VCC zieht, dann sollte man den Eingang über einen PullDown-Widerstand gegen GND ziehen. So ist sicher gestellt, dass am Eingang LOW anliegt und erst wenn der Schalter gedrückt wird zu HIGH wird. Zieht der Schalter gegen GND, dann sollte ein PullUp-Widerstand gegen VCC ziehen.
Und wenn man Bauteile sparen möchte, dann kann man den in den µC eingebauten PullUp-Widerstand softwaremäßig aktivieren. Es gibt also für jeden möglichen Eingangspin auch die Möglichkeit, einen PullUp-Widerstand zu aktivieren. Dieser ist bei den AVRs zwischen 20 und 50 kOhm groß.
So sieht es aus, wenn der Schalter gegen VCC zieht:
So sieht es aus, wenn der Schalter gegen GND zieht:
Zwar hat der Reset-Eingang auch einen PullUp-Widerstand eingebaut, aber beim Reset machen wir eine Ausnahme und beschalten ihn trotzdem zusätzlich noch mit einem externen PullUp-Widerstand.
Es gibt mehrere Möglichkeiten, um festzustellen, ob der Taster gedrückt wird oder nicht. Die einfachste ist die, den Status des Eingangspins abzufragen. Dieses kleine Beispielprogramm steuert zwei LEDs an. Im Ausgangszustand leuchtet die LED1. Drückt man den Taster dann leuchtet die LED2.
Dieses Beispiel geht davon aus, dass der Taster den Eingangspin gegen VCC zieht.
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
'LED1 an PB1
Led1 Alias Portb.1
Config Led1 = Output
'LED2 an PB2
Led2 Alias Portb.2
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Taster1 = Input
Do
If Taster1 = 1 Then
Led1 = 0
Led2 = 1
Else
Led1 = 1
Led2 = 0
End If
Loop
End
Und so sieht es aus, wenn man mit dem Taster den Eingangspin gegen GND zieht. Es wird der interne PullUp-Widerstand aktiviert um den Eingang in einem definierten Zustand zu halten. Das Einschalten des internen PullUp-Widerstand: Zuerst wird der Pin als Eingang definiert und dann setzt man den Pin auf HIGH. So als wäre dieser ein Ausgang. Aber statt dass am Pin ein HIGH angelegt wird, wird damit der PullUp-Widerstand aktiviert.
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
'LED1 an PB1
Led1 Alias Portb.1
Config Led1 = Output
'LED2 an PB2
Led2 Alias Portb.2
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Taster1 = Input
Portd.2 = 1 'PullUp-Widerstand einschalten
Do
If Taster1 = 0 Then
Led1 = 0
Led2 = 1
Else
Led1 = 1
Led2 = 0
End If
Loop
End
Du hast sicher schon bemerkt, dass noch etwas hinzugekommen ist. Mit ALIAS kann man einer Variable einen zusätzlichen Namen geben. Schlüssige Namen erleichtern das Programmieren und sollten oft eingesetzt werden.
Versuche doch mal zum Test diese Zeile aus dem Code raus zu nehmen:
Portd.2 = 1 'PullUp-Widerstand einschalten
Drücke nach dem Übertragen des Programms mehrmals den Taster. Dann weißt du was es bedeutet, den PullUp-Widerstand zu vergessen. ;-)
mfg Gerold :-)
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.