Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Propeller 8 Kern Controller - C Programmierung

Station 2 - Taster abfragen

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.

Courtesy of Parallax Inc.

Ziele dieser Station

 

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);

2 - Zwei Drucktaster abfragen

In dieser Schaltung benutzen wir die beiden LEDs an P26 und P27 auf dem Board zusammen mit zwei Drucktastenschaltungen.

Material
  • 1x PropBoE oder PropAE
  • 2x Drucktaster
  • 2x Widerstand 100 Ohm (braun-schwarz-braun)
  • 2x Widerstand 10kOhm (braun-schwarz-orange)
Aufgabe
  • Baue die Schaltung 1 auf dem Steckbrett auf.
  • Gib das Programm B02_01.c ein und speicher es ab.
  • Starte das Programm über Run with Terminal.
  • Drücke einen der beiden Taster und beobachte die Ausgabe im Terminal.

 

 

 

 

 

 

 

 

 

 

 

 

Abbildung 1

Schaltungsaufbau zu Übung 1

Courtesy of Parallax Inc.

 

 

 

Abbildung 1b

Schaltskizze für die beiden Drucktasterschaltungen

 

Abbildung 1c

Schaltskizze für die beiden LED-Schaltungen

Beschaltung eines Tasters

Programm B02_01.c

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".

Terminalausgabe

 

<-- Taster offen

 

 

 

 

<-- Taster gedrückt

Wie arbeitet das Programm B02_01.c?

  • Betrachtung der beiden Schaltungen mit Drucktasten

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.

  • Betrachtung des Programmcodes

 

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.

3 - Entscheidungsbefehl IF ... ELSE

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
  • Gib das Programm B02_01a.c in den SimpleIDE Editor ein und speicher es unter B02_01.c ab.
  • Starte das Programm und überprüfe, ob das Programm seine Aufgabe erfüllt.

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.

4 - Mehrfachentscheidung

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
  • Gib das Programm B02_02.c in den SimpleIDE Editor ein und speicher es ab.
  • Starte das Programm und überprüfe, ob die LED an P26 anfängt zu blinken, wenn einer der beiden Taster T1 oder T2 gedrückt wird.

Das Programm B02_02.c

Programm B02_02.c - Mehrfachentscheidung

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

5 - Hausbeleuchtung

Material
  • 1x  Propeller Board of Education
  • zusätzlich zu den Bauteilen aus Abb. 1b werden benötigt:
  • 2x  Steckdraht
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.

  • Verbinde das PropBOE über die USB-Schnittstelle mit dem Laptop.
  • Baue die Schaltung nach den Schaltplänen auf dem Steckbrett auf.
  • Schließe das Steckernetzteil an und schalte die Spannungsversorgung ein. Starte das Programm SimpleIDE.
  • Gib das folgende Programm ein und speicher es unter dem Namen B02_03 auf einem Stick.
  • Starte das Programm und überprüfe, ob es die Aufgabe erfüllt.

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.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf