In vielen Geräten des täglichen Gebrauchs sind sogenannte Taster eingebaut. Mobilephones, Mikrowellengeräte, TV-Fernbedienungen und Computer-Tastaturen verfügen über Taster.
Schau dich um. Wo in deiner unmittelbaren häuslichen Umgebung (Küche, Wohnzimmer, Auto) gibt es Geräte mit Tastern? Notiere drei Geräte:
______________________________________________________________
______________________________________________________________
______________________________________________________________
In dieser Station lernst du am Beispiel eines einfachen Schaltkreises kennen, wie man mit Hilfe einer Tastaturabfrage den Zustand einer LED beeinflussen kann.
Denke bitte immer daran, dass die LED nur stellvertretend für eine Vielzahl von Bauteilen steht, die man mit Hilfe eines Tasters über einen Controller ein- oder ausschalten kann. Es ließen sich statt der LED zum Beispiel auch ein Stellmotor oder Servo, ein Heizelement oder Lüfter oder eine Pumpe einschalten.
Wenn du Station 2 durchgearbeitet hast, bist du in der Lage ...
... den Zustand von Tastern mit einem Controller abzufragen.
... das Datenblatt eines Tasters zu lesen und Informationen zu entnehmen.
... eine einfache elektronische Schaltung mit Tastern und LEDs aufzubauen.
... ein einfaches C-Programm mit Tasteransteuerung einzugeben und zu verstehen.
... eine Entscheidungsabfrage in C zu programmieren.
... zu erklären, was ein pull-up- bzw. ein pull-down-Widerstand ist.
... den Pinstatus aufeinanderfolgende I/O Ports abzufragen.
Neue Programmbefehle in dieser Station
Beschreibung | C-Programmierung |
Definition einer Variablen |
Variablentyp <Bezeichner> Beispiel: int abfrage; |
Entscheidungsabfrage |
if (Bedingung) wahr {Befehlsblock} else sonst {Befehlsblock}
Beispiel: if (button == 1) { high(2); } else { pause(100); } |
Abfrage eines Ports |
input(port) Beispiel: int taster = input(4); |
Pinstatus überprüfen Ist Pin Eingang, dann gilt: "1" -> U > 1,65 V "0" -> U < 1,65 V Ist Pin Ausgang, dann gilt: "1" -> U = 3,3 V "0" -> U = 0 V |
get_states(Endpin, Startpin); Beispiel: unsigned int taster = get_states(2,0); |
Pinstatus überprüfen siehe bei get_states |
get_state(pin); Beispiel: unsigned int taster = get_state(2); |
In dieser Schaltung benutzen wir die beiden LEDs an P26 und P27 auf dem Board zusammen mit zwei Drucktastenschaltungen.
Material |
|
Aufgabe |
|
Beschaltung eines Tasters
Programm B02_01.c
Ausgabe im Terminalfenster
Im Terminalfenster wird durch 0 und 1 angezeigt, ob ein Taster gedrückt wurde oder nicht. Dabei steht eine 0 für "nicht gedrückt" und eine 1 für "gedrückt".
Wie arbeitet das Programm B02_01.c?
Mit dem Programm B02_1.c wird nur der Taster 1 an P3 abgefragt. Wird er nicht gedrückt, "sieht" der I/O Pin P3 eine 0 an seinem Eingang. Wird Taster T1 hingegen gedrückt, liegen 3,3V am I/O Pin und es fließt ein kleiner Strom vom Pluspol (3,3V) über den 10 kOhm Widerstand nach Masse (GND) hin ab.
P3 ist als Eingang geschaltet; er registriert die Spannungswerte der zugeordneten Drucktasten-Schaltung T1 und weist den Wert der Variablen taster zu, die anschließend im Terminal ausgegeben wird.
Die input-Funktion aus der simpletools Bibliothek gibt eine 1 zurück, wenn der Taster gedrückt wurde und eine 0 wenn nicht.
int Taster = input(3)
weist das Ergebnis einer Variablen Taster zu. Der anschließende Befehl
print("Taster = %d\n", taster);
gibt einen Text im Terminal aus. Anschließend beginnt die Befehlsausführung wieder von vorn in Zeile 14 und der Befehlsblock wird erneut durchlaufen.
Mit einem Entscheidungsbefehl kann das Programm aus Übung 1 so erweitert werden, dass eine LED an P26 alle 100ms kurz aufleuchtet, sobald Taster T1 an P3 gedrückt wurde.
Aufgabe |
|
Das Programm B02_01a.c
Wie arbeitet das Programm B02_01a.c?
Bis Programmzeile 15 ist B02_01a.c identisch mit Programm B02_01.c. Neu ist der nachfolgende Entscheidungsbefehl ab Programmzeile 17.
if (taster == 1)
{
Befehlsblock
}
mit den nachfolgenden vier Kommandozeilen im Befehlsblock { }.
Für den Kontroller ist diese Zeile gleichbedeutend mit dem Auftrag: Wenn T1 gedrückt wurde (dann wurde über Programmzeile 14 taster über input(3) eine 1 zugewiesen), dann führe alle Befehle im nachfolgenden Befehlsblock aus.
Wenn aber T1 nicht gedrückt wurde, dann ... wird in der Sprache C durch die folgenden Zeilen dargestellt:
else
{
pause(100);
};
Anschließend beginnt die Befehlsausführung wieder von vorn in Zeile 14 und der Befehlsblock wird erneut durchlaufen.
In Station 1 wurden im Erweiterungsblock die bitorientierten Ausgabebefehle set_directions und set_outputs eingeführt. Mit ihnen lassen sich gleichzeitig mehrere Ausgänge ansprechen.
In dieser Station wurde bisher gezeigt, wie ein Eingang mit dem input(pin)-Befehl auf seinen Zustand 0 oder 1 abgefragt wird. Wie man mehrere Eingänge gleichzeitig abfragt, zeigen wir in der nachfolgenden Übung 3 am Beispiel der beiden Funktionen get_states und get_directions.
Mit einer Mehrfachentscheidung kann das Programm aus Übung 2 jetzt so erweitert werden, dass eine LED an P26 alle 100ms kurz aufleuchtet, sobald entweder Taster T1 an P3 oder Taster T2 an P4 gedrückt wurde. Benutze den Schaltungsaufbau aus Übung 1.
Aufgabe |
|
Das Programm B02_02.c
Wie arbeitet das Programm B02_02.c?
Neu in diesem Programm ist Zeile 12.
unsigned int a = get_states(4, 3);
Die Funktion erfasst die an den Eingängen 3 und 4 anliegenden Pegel als 0 oder 1, je nachdem, ob ein Taster gedrückt wurde oder nicht. Im vorliegenden Fall werden die beiden Pin 3 und 4 erfasst.
P4 P3 Dezimal
0 0 -> 0
0 1 -> 1
1 0 -> 2
1 1 -> 3
sind die möglichen Zustände. Dezimal entsprechen dieser binären Zahldarstellung Dezimalwerte von 0 bis 3. Die werden entsprechend im Debug Terminal ausgegeben. Die 3 erscheint also nur, wenn beide Taster gleichzeitig gedrückt werden.
Mit diesem Wissen und der Kenntnis über Entscheidungsbefehle können wir jetzt die oben gestellte Aufgabe lösen. Der Pseudocode dazu könnte wie folgt aussehen:
Pseudocode | Prop-C |
Erfasse den Status der beiden Eingänge und speicher ihn in der Variablen a ab.
Wenn a 1, 2 oder 3 (a<4) und a >0 ist, dann LED einschalten warten LED ausschalten warten sonst warten
|
unsigned int a = getstates(4,3); if (a < 4 && a > 0) { high(26); pause(100); low(26); pause(100); } else pause(100); |
Programm B02_02a.c
Material |
|
Aufgabe |
Zwei Taster T1 und T2 werden über P3 und P4 mit dem Propeller-Controller verbunden (Abb. 1b). Die beiden LEDs R0 und R1 sind mit P5 und P6 verbunden. Stellen wir uns vor, dass die beiden Taster Lichtschalter in einem Treppenhaus sind. Drückt man einen der beiden Schalter, dann sollen beide Lichter für ca. 5 Sekunden angehen und anschließend ausgehen.
|
Programm B02_03.c
Wie funktioniert das Programm B02_03.c?
Zeile 16 Die I/O Ports 3 - 6 werden als Ein- bzw. Ausgänge deklariert.
Zeile 18 Endlosschleife in der die folgenden Befehle ablaufen.
Zeile 20 Der Status der Eingänge P3 und P4 wird abgefragt und in der
Variablen taster
abgelegt.
Zeile 21 Die Pause von 100 ms berücksichtigt das Prellen von Tastern.
Zeile 22 Wenn eine Taste gedrückt wurde, ist taster > 0.
Zeile 24 Die Ausgangsports 5 und 6 werden auf 1 gesetzt. Die LEDs leuchten.
Zeile 25 5 s Licht an.
Zeile 26 Alle LEDs werden ausgeschaltet.
Variable definieren
Jede Variable in einem C-Programm muss definiert werden, d. h., es muss festgelegt sein, von welchem Typ sie ist. Die folgenden Variablentypen für Zahlen sind bei C hinterlegt:
signed char -127 bis +127
char 0 bis 255
int -2.147.483.647 bis +2.147.483.647
unsigned int 0 bis 4.294.967.295
long wie bei int
unsigned long wie bei unsigned int
float 3,4*10^-38 bis 3,4*10^38 auf 6 Stellen genau
if (Bedingung) {if-Befehlsblock} else {else-Befehlsblock}
Wenn die Bedingung hinter if erfüllt ist, werden alle Befehle im if-Befehlsblock ausgeführt. Ist die Bedingung nicht erfüllt, wird im else-Befehlsblock weitergemacht.
input(10);
Der I/O Pin 10 des Propeller Mikrocontrollers gibt den Spannungswert, der am Eingang P10 anliegt als Binärwert zurück. "1" bedeutet, es liegt ein high-Signal oder U > 1,65 V an P10 oder "0", es liegt ein low-Signal oder U < 1,65 V an P10.
get_states(8, 2);
Überprüft den Pinstatus jedes Pins zwischen P8 und P2. Ist ein Pin als Ausgang definiert, bedeutet eine "1", dass 3,3 Volt und "0" das 0 Volt anliegen. Ist ein Pin als Eingang definiert, steht eine "1" für U > 1,65 Volt und "0" für U ist weniger als 1,65 Volt.
get_state(8);
wie get_states nur für einen Pin.