8.3 Taster am µcontroller AVR-KOMPENDIUM Nachdem im vorigen Beispiel das Port als Ausgang verwendet wurde erweitern wir dieses Beispiel um einen Taster - um auch das Einlesen von digitalen Signalen zu lernen. 8.3.1 Theorie Schalter oder Taster sind einfache Bauelemente die nichts anderes tun als eine leitende Verbindung zwischen zwei Anschlüssen herstellen. Der Mikrocontroller kann jedoch nur Spannungspegel erkennen. Damit diese Spannungspegel von einem Schalter erzeugt werden können müssen sie mit sogenannten Pull-up Widerständen beschaltet werden. Je nach Schalterzustand (offen oder geschlossen) ergeben sich unterschiedliche Spannungszustände aus dem daraus resultierenden Spannungsteiler. Fall 1: Schalter/Taster ist offen. Daraus ergibt sich für: R1 ein Widerstand von 10kOhm und für: R2 der Widerstand der Luft zwischen den zwei offenen Schalterkontakten welcher sehr groß ist. (Luft leitet sehr sehr schlecht). Da der Spannungsabfall direkt mit der Größe des Widerstands zusammenhängt ergibt sich für die Spannung U1 ein Wert von nahezu 0 Volt und einen Spannungswert von nahezu 5 Volt für U2. Die Spannung am Pin des Mikrocontrollers entspricht der Spannung U2. Da die Eingangslogik eine Spannung von 5 Volt als den digitalen Wert 1 (eins) interpretiert. Mit folgender if Anweisung wird dieser Zustand abgefragt. if(pinb & (1<<PB0)) -117-
Abbildung 76: Schalter am IO-Port-Ersatzschaltbild und Spannungspegel (Fall1) Abbildung 76 zeigt das Ersatzschaltbild für den Fall 1, wenn der Schalter offen ist. Fall 2: Schalter/Taster ist geschlossen daraus ergibt sich für: R1 ein Widerstand von 10kOhm und für: R2 der Widerstand der geschlossenen Schalterkontakte (Kurzschluss) welcher sehr klein ist. -118-
Abbildung 77: Schalter am IO-Port-Ersatzschaltbild und Spannungspegel (Fall2) Da der Spannungsabfall direkt mit der Größe des Widerstands zusammenhängt ergibt sich für die Spannung U1 ein Wert von nahezu 5 Volt und einen Spannungswert von nahezu 0 Volt für U2. Die Spannung am Pin des Mikrocontrollers entspricht der Spannung U2. Die Eingangslogik interpretiert eine Spannung von 0 Volt als den digitalen Wert 0 (Null). Mit folgender if Anweisung wird dieser Zustand abgefragt. If(!PINB & (1<<PB0)) { //beliebige Anweisung ausführen //Bsp.: LED einschalten } Anmerkung: Alle diese Anweisungen hängen natürlich von der Art, wie der Schalter angeschlossen ist, ab. Siehe dazu auch im Kapitel Beschaltungstechnik 8.3.2 Praxis Der praktische Aufbau sollte ohne Probleme zu schaffen sein. Nicht vergessen -119-
während des Verdrahtens wird das Steckbrett spannungsfrei geschaltet. 8.3.2.1 Schaltung Die Schaltung wird nur um einen Taster und den notwendigen externen Pullup Widerstand (R29 erweitert. Abbildung 78: Taster am Mikrocontroller -120-
8.3.2.2 Bauteilliste Nr.: Bezeichnung B-Nr.:C Preis B-Nr.:RS Preis B-Nr.:Rei Preis B-Nr.:Far Preis 10 AT MEGA32 123456 10,0 123456 10,0 123456 10,0 10,0 20 S1 0,5 0,5 0,5 0,5 30 C1 0,5 0,5 0,5 0,5 40 C2 0,5 0,5 0,5 0,5 50 D1 0,5 0,5 0,5 0,5 60 R1 0,5 0,5 0,5 0,5 70 LED1 0,5 0,5 0,5 0,5 80 R2 0,5 0,5 0,5 0,5 90 S2 0,0 0,0 0,0 0,0 Summe 13,5 13,5 13,5 13,5 Tabelle 10: Bauteilliste für das Projekt-Taster am Mikrocontroller 8.3.2.3 Flussdiagramm Start Ausgang für LED initialisieren Eingang für Schalter initialisieren while(1) Nein Ausgang löschen LED-leuchtet nicht Schalter geschlossen? Ja Ausgang setzen LED-leuchtet Endlosschleife Abbildung 79: Flussdiagramm für Projekt -Taster am µcontroller -121-
8.3.2.4 Source #include <avr/io.h> int main(void) { DDRC = DDRC (1 << PC7); //(10) DDRB = DDRB & ~(1<<PB0); //(20) while(1) //(40) { if(!(pinb & (1<<PB0))) //(50) PORTC = PORTC & ~(1<<PC7); //(60) else //(70) PORTC = PORTC (1 << PC7); //(80) } } /*Beschreibung des Programmes Wenn der Taster an PB0 geschlossen wird leuchtet die LED an PC7 */ /*Kommentar nach Nummern (10)PIN als Ausgang für LED konfigurieren (20)PB1 als Eingang für Schalter aktiveren (40)While Schleife als Endlosschleife (50)Wenn Spannungslevel an PB0 gleich 0 ist, dann ist der Schalter geschlossen (60)LED einschalten (70) wenn (50) nicht zutrifft (80) dann ist Schalter nicht gedrückt und LED wird ausgeschaltet */ 8.3.3 Anmerkungen & Verbesserungen Statt PORTC = PORTC (1 << PC7); //(80) kann auch die Kurzform PORTC = (1 << PC7); //(80) geschrieben werden. Dies gilt für alle Zuweisungen. Statt des externen Pullup Widerstands kann auch der interne Pullup verwendet -122-
werden. Dieser wird mit folgendem Code aktiviert: PORTB = (1<<PB0); //Pullup aktivieren -123-