Bascom-AVR

Kleiner Bascom AVR Kurs -
Schalter an den Mikrocontroller anschliessen

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:

hallo_welt_v04.gif

So sieht es aus, wenn der Schalter gegen GND zieht:

hallo_welt_v05.gif

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.