MCK 1.2.0 Eingabe mittels Taster

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Erste Eingabe mittels Taster und Abfrafen mit If- Then- Else
    1.2.0. Eingabe mittels Taster

    Nachdem jetzt keinerlei Leuchtdioden mehr vor uns sicher sind, kommt wahrscheinlich mehr und mehr der Wunsch auf, auch auf das einmal laufende Programm einfluß zu nehmen. Von den vielfältigen Möglichkeiten des Mikrocontrollers auf seine Umgebung zu reagieren wollen wir mit einfachenTastern beginnen.


    Wenn Ihr eigene Platinen mit LED´s verwendet
    Bevor wir uns den Tastern zuwenden, möchte ich aber noch einen Hinweis zu den Leuchtdioden geben. Solange Ihr das Experimentierboard benutzt könnt Ihr dem Mikrocontroller mit der Verwendung der vorhandnen LED´s nicht schaden. Anders sieht das aus, wenn Ihr eine eigene Platine oder eine Schaltung auf einem Steckbrett verwenden möchtet. Hier müsst Ihr unbedingt die Leistungsgrenzen der Controllerausgänge beachten:





    Die Atmelcontroller können in der Regel maximal 40 mA je Portpin liefern; am gesamten Mikrocontroller darf der Ausgangsstrom 200 mA nicht überschreiten! Hierbei ist zu beachten: weniger ist mehr. Bevor Ihr den Mikrocontroller überlastet, solltet Ihr ihm eher weniger Last zumuten. Eventuell könnt Ihr bei Bedarf auch mehrere Ausgänge verwenden und somit die Ströme durch die Leuchtdioden auf die Pins aufteilen, solange die Gesamtlast nicht überschritten wird. Die Angaben zur Schaltleistung sind nur Richtwerte. Im Zweifelsfall hilft immer ein Blick ins Datenblatt!


    Wir configurieren einen Eingabepin und das geht zu Anfang nur wieder mit etwas Theorie


    Die Configuration eines Controlleranschlusses als Eingang erfolgt ähnlich der Ausgangsportconfiguration. Dennoch gibt es einige Unterschiede deren Mißachtung uns das Leben schwer machen können.

    Die Configurationszeile selbst ist erst einmal genau so aufgebaut wie die Configuration eines Ausgangs:

    Config PORTB.1 = Input

    Das sollte eigentlich klar sein, statt Output (Ausgang) schreiben wir einfach Input (Eingang)

    Es hat sich dadurch im Hintergrund, von uns unbemerkt aber schon etwas geändert. Dies zeigt sich, wenn wir dem Eingang einen Aliasnamen zuweisen möchten, damit wir auch ihn im Programm leichter ansprechen können:

    Taster Alias PINB.1

    Seht Ihr den Unterschied? Wir sprechen den Controlleranschluß jetzt nicht mehr mit PORT an (wie beim Ausgang), sondern mit PIN. Das kann man sich leicht merken über das IN: PINb.1 (Also IN für Eingang).

    Versuchen wir die Abfrage des Eingangs weiterhin mit PORT, funktioniert das Programm nicht wie gewünscht.


    Pullup- Widerstände- wichtig für den Controller,
    aber nicht ganz leicht zu erklären

    Außerdem ist es wichtig zu beachten, wie der Taster elektrisch angeschlossen wird. Ein Kontakt des Tasters kommt natürlich an den Mikrocontroller. Je nachdem ob wir den anderen Kontakt jetzt mit dem Pluspol oder dem Minuspol der Schaltung verbinden, schalten wir beim Tastendruck logischerweise Plus oder Minus an den Mikrocontroller (oder Low oder High, bzw. 0 oder 1).

    Ist der Taster geöffnet, ist der Controllereingang natürlich weder mit Plus, noch mit Minus verbunden, er hängt sozusagen in der Luft. Das mag der Controller jedoch gar nicht. Wir müssen dafür sorgen, dass entweder Plus oder Minus am Anschluß anliegt.
    Nun können wir nicht einfach an den zweiten Tasterkontakt die "andere" Polarität anschließen. Dann hätten wir zwar rein theoretisch klare Verhältnisse, aber bei jedem Tastendruck einen satten Kurzschluß.

    Hier gibt es eine elegante Lösung: Der Strom geht bekanntlich immer den Weg des geringsten Widerstandes. Wir legen jetzt also einen Tasterkontakt auf Minus und den anderen Kontakt an den Mikrocontroller. Ist der Taster gedrückt, bekommt der Eingang des Controllers Minus auf seinen Anschluß und diese Information können wir im Programm auswerten. Ist der Taster geöffnet, so verlangt der Controller Plus am Anschluß, also High oder 1. Dies werden wir ihm jetzt "spendieren". Aber nicht direkt (Kurzschluß), sondern über einen Widerstand. Über den Widerstand bekommt der Anschluß bei geöffnetem Taster nun Pluspotential.

    Wenn wir jetzt den Taster betätigen, haben wir einmal eine Verbindung mit Widerstand nach Plus und einmal ohne Widerstand nach Minus. Der Strom wählt denWeg mit dem geringsten Widerstand und das ist der nach Minus und genau das möchten wir erreichen. Durch den Widerstand besteht jetzt aber auch kein Kurzschluß zwischen Plus und Minus, da der Widerstand als Verbraucher arbeitet, genau wie ein Glühlampe oder LED.

    Als Ergebnis haben wir klare Verhältnisse am Controllereingang:
    • Minus, Low oder 0 bei gedrücktem Taster
    • Plus, High oder 1 bei unbetätigtem Taster
    Natürlich geht das auch mit umgekehrter Polarität. Dass ich gerade diesen Fall gewählt habe hat aber einen Hintergrund. Während wir bei der umgekehrten Polarität einen Widerstand nach Minus (Pulldown) in unsere Platine einbauen müssten, verfügt der Mikrocontroler im Inneren bereits über einen Widerstand nach Plus (Pullup), welchen wir im Programm einfach zuschalten können:

    Portb.1 = 1 'Pullupwiderstand zuschalten

    Mit diesem BASCOM- Befehl aktivieren wir den internen Pullupwiderstand für den entsprechenden Portpin. Da wir in dem Fall wieder etwas schalten, also ausgeben, heißt es hier noch einmal Portb.1 und nicht Pinb.1. Anschließend verwenden wir für diesen Eingang aber ausschließlich Pinb.1



    Wo Licht ist, ist auch Schatten. Die Verwendung des internen Pullupwiderstandes müssen wir uns mit der programminternen Invertierung des Signals erkaufen. Das bedeutet, dass wir einen betätigten Taster nicht auf 1 abfragen, sondern auf 0:
    • Eingang = 1 => Taster ist nicht betätigt, positive Spannung liegt an
    • Eingang = 0 => Taster ist betätigt, negative Spannung liegt an.
    Das ist zu Anfang ungewohnt, man gewöhnt sich aber daran. Man nennt dies auch invertierte (umgekehrte) Logik. Diese wird uns beim Umgang mit Mikrocontrollern noch öfter begegnen.


    Unser erstes Programm mit Taster
    Wenden wir das gelernte an und werfen einen Blick auf unser erstes Programmmit Taster:

    BASCOM-Quellcode

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013/2014 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.0
    13. '------------------------------------------------------------
    14. 'Beschreibung: Erstes Programm mit Taster
    15. '************************************************************
    16. '==============================================================================
    17. $regfile = "attiny13.dat" 'verwendeter Controller
    18. $crystal = 1200000 'Taktfrequenz
    19. $hwstack = 32 'Grundeinstellung
    20. $swstack = 4 'Grundeinstellung
    21. $framesize = 4 'Grundeinstellung
    22. '==============================================================================
    23. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    24. '------------------------------------------------------------------------------
    25. 'Ausgang configurieren
    26. Config Portb.0 = Output
    27. Led Alias Portb.0
    28. 'Aliasvergaben machen den Code leichter lesbar, sind aber nicht zwingend erforderlich
    29. 'Eingang configurieren
    30. Config Portb.1 = Input
    31. Taster Alias Pinb.1 'Beachten, hier heißt es PINB
    32. Portb.1 = 1 'Pullupwiderstand
    33. '==============================================================================
    34. 'Hauptprogramm
    35. '------------------------------------------------------------------------------
    36. Do
    37. If taster = 0 then Led =1 else Led = 0
    38. Loop
    39. End 'end program
    Alles anzeigen

    Schon finden wir wieder eine neue Befehlszeile: If Taster =0 then Led=1 else Led=0. Was es damit auf sich hat erkläre ich im Anschluß. Zunächst bereiten wir erst mal unsere Experimentierplatine vor. Als LED verwenden wir wieder die Mittlere der roten Leuchtdiodenzeile. Dazu müssen wir nur den Jumper richtig stecken und benötigen kein Kabel. Anders beim Taster Wir wählen hier den linken Taster aus und verbinden den Anschluß T1 mit C1 auf der Platine:





    If then else - wir fragen Eingänge ab
    Wenn wir umgangssprachlich unsere Taster abfragen würden, gäbe es zum Beispiel folgende Aussage:

    Wenn der Taster gedrückt ist, dann schalte die LED ein. Wird der Taster nicht gedrückt, dann lasse die LED aus.

    So, oder so ähnlich würden wir uns ausdrücken, wenn wir mit jemand anderem sprechen würden, der mit seiner Hand für uns den Taster betätigen soll.

    Der Mikrocontroller soll stellvertretend für oben genannte Person für uns den Taster "überwachen" und den Ausgang schalten. Unser Controller kann uns bekanntlich nicht verbal verstehen, wir müssen unsere "Wünsche" unter Verwendung von gültigen Befehlen in ein Programm fassen.

    Aber genau diesen oben beschriebenen Befehl gibt es unter BASCOM:

    Wenn (If) der Taster (Taster) gedrückt ist (=0, wie erinnern uns, invertierte Logik) dann (then) schalte die LED ein (LED=1) anderenfalls (Else) lasse die LED aus (LED=0)


    If Taster = 0 then LED=1 Else LED=0

    also genau die Programmzeile, die im Programm für unseren Taster verwendet wird.


    Erweiterte Erklärungen zu IF then else
    Für unser einfaches Beispiel reicht die Formulierung in einer Zeile. Verwenden wir mehrere Zeilen für die Abfrage sieht dies etwas anders aus:

    If taster = 0 then
    Led = 1
    'Hier können noch weitere Aufgaben stehen
    else
    Led = 0
    'Auch hier können noch weitere Aufgaben stehen
    End if
    'Ganz wichtig: zum Abschluß einer mehrzeiligen If- Abfrage muss immer End if kommen
    'Es geht auch ohne else, else ist sozusagen eine Zusatzoption:


    If taster = 0 then

    Led = 1
    'Hier können noch weitere Aufgaben stehen

    End if

    Denkt daran: zum Abschluß einer mehrzeiligen If- Abfrage muss immer End if kommen Dies soll als einführende Erklärung erst einmal reichen. Der Befehl ist nätürlich noch vielfältiger. Wir werden Erweiterungen zu einem späteren Zeitpunkt behandeln, wenn wir diese benötigen.

    Ach so, wir haben die Platine zwar vorbereitet, dass Programm aber nochnicht ausprobiert. Wenn Ihr das noch nicht aus Neugier bereits gemacht habt, so speichert das Programm jetzt ab, compiliert es und übertragt es an den Attiny13. Wenn alle Jumper und Kabel richtig gesteckt sind und sich beim Übertragen keine Fehler ins Programm geschlichen haben, müßte die mittlere, rote LED jetzt solange leuchten, wie Ihr den linken Taster betätigt.

    Zappelige Taster und undefinierte Zustände
    Wir haben jetzt kennen gelernt, wie man einen Ausgang korrekt abfragt. Bei Verwendung von Tastern und anderen mechanischen Kontakten (Relais usw.) werden wir
    mit dieser Lösung aber nicht glücklich.
    Das liegt daran, dass unsere Taster (wie alle mechanischen Kontakte) prellen.Verdeutlichen können wir uns das Prellen mit dem Fallenlassen einer Stahlkugelauf einen festen Untergrund. Fällt die Kugel beispielsweise auf Sand, bleibt sie dort sofort liegen. Anders beim festen Untergrund. Hier hebt sich die Kugel noch einige male vom Untergrund ab, bevor sie ruhig liegen bleibt.

    Übertragen auf einen Schaltkontakt ist jede Bodenberührung vor dem Stillstand ein separates Ein- und Ausschalten. Wenn Ihr also den Taster betätigt, bekommt der Mikrocontroller nicht einen einzelnen Impuls, sondern eine Impulsfolge von mehreren Impulsen. Bei einem einfachen Schalten wie in unserem Beispiel oben macht das nichts, soll aber mit dem Taster beispielsweise gezählt werden, können wir nie vorausbestimmen um wieviel Schritte weitergezählt wird.
    Das reicht allenfalls für einen Zufallsgenerator, aber nicht für eine Tasterauswertung.

    Da wir nicht die Ersten sind, die damit zu kämpfen haben, gibt es hierfür eine elegante Lösung, mit der wir uns im Anschluß befassen:

    1.2.1 Entprellen von Tastern

    354 mal gelesen