Tastenprogrammierbare Steuerung Mikrocontroller findet man überall: in Haushaltsgeräten, in Geräten der Unterhaltungselektronik, in Fahrzeugen, in Messgeräten und sogar in unbemannten Raumfahrzeugen. Überall tun sie Dinge, die ihnen ein Programm befiehlt. Es ist spannend, auch selbst einmal einfache Steuerprogramme zu erzeugen. Der erste Schritt ist immer, einen Mikrocontroller oder Prozessor auszusuchen, der möglichst genau zu der gewünschten Aufgabe passt.
Inhaltsverzeichnis 1 Einführung 5 2 Wechselblinker 8 3 Binärzähler und PWM-Ausgabe 9 4 Analog-Digital-Wandler 13 5 Zufallsgenerator 15 6 Impulslängenmessung 17 7 Programme auslesen 19 8 Programme eingeben 21 9 Wiederherstellung der Beispielprogramme 23 10 TPS-Grundbefehle 23 11 Rechnen mit Variablen 26 12 Sprünge und Verzweigungen 28 13 Befehlsübersicht 30 14 Zählschleifen 31 15 Vergleiche 32 16 AND, OR und XOR 33 17 Unterprogramme 34 18 Dämmerungsschalter
1 Einführung Das Prinzip des TPS-Controllers ist einfach. Man hat vier digitale Eingänge E1 bis E4 und vier digitale Ausgänge A1 bis A4. Außerdem gibt es zwei analoge Eingänge AD1 und AD2 sowie einen quasi-analogen PWM-Ausgang. Ein Reset-Eingang mit einer angeschlossenen Reset-Taste setzt ein Programm an den Anfang zurück. Der Controller wird mit drei AA-Zellen mit ca. 4,5 V versorgt und kann in einem Bereich von 2,2 V bis 5,5 V arbeiten.
Abb. 1: Grundschaltung des Systems Abb.
Einige Grundprogramme sind bereits im Auslieferungszustand (Default) im TPS-Controller vorhanden und können direkt gestartet werden. Deshalb ist es möglich, den Controller Schritt für Schritt in Betrieb zu nehmen. Machen Sie sich zunächst mit den Hardware-Funktionen vertraut und beginnen Sie dann erst mit eigenen Programmen. Bei den ersten Tests werden kleine Programme gestartet, die bereits fertig im Controller vorliegen.
Verwenden Sie die obere und die untere Versorgungsschiene auf der Steckplatine als Masseanschluss GND. Hier wird das schwarze Kabel des Batteriefachs, also der Minuspol, angeschlossen. Die Plus-Leitung VCC wird mit dem roten Anschlusskabel des Batteriefachs verbunden. Eine Falschpolung muss unbedingt vermieden werden, da sie den Controller zerstören kann. Bauen Sie ein kurzes Drahtstück als Zugentlastung ein. Die einmal angeschlossene Spannungsversorgung sollte möglichst immer verbunden bleiben.
Das Beispiel belegt den Adressbereich ab 20h (dezimal 32). Mehrere Programme im oberen Adressbereich können später auch aus eigenen Anwendungen heraus gestartet werden. Die Adressen können alternativ auch mit eigenem Programmcode überschrieben werden. Bei Bedarf kann der Controller aber auch wieder in den Grundzustand zurückgesetzt werden, wobei die ursprünglichen Beispielprogramme wiederhergestellt werden.
Abb. 5: Einsatz der PWM-LED Abb.
Legen Sie E1 an GND. Damit startet nach einem Reset das zweite Beispielprogramm. Es zählt die Ausgangszustände binär hoch. Es werden laufend die Zustände 0000 (dezimal 0) bis 1111 (dezimal 15) durchlaufen. Das Programm verwendet die Variable A für eine einfache Addition und zur Ausgabe an die digitalen Ausgänge sowie an den PWM-Ausgang. Die Befehle 7 und 5 besitzen Unterfunktionen, die als Daten geschrieben werden.
Der nächsthöhere Ausgang hat jeweils die halbe Frequenz oder die doppelte Periodendauer: A1: 200 ms A2: 400 ms A3: 800 ms A4: 1.600 ms Zusätzlich werden die aufsteigenden Zahlenwerte auch an den PWM-Ausgang (Pulsweitenmodulation) ausgegeben. Das PWM-Signal ist ein Rechtecksignal mit einer Frequenz von ca. 16 kHz. Die Pulslänge wird dabei gesteuert, sodass das Puls-Pausen-Verhältnis die durchschnittliche Einschaltdauer und damit die Helligkeit der LED bestimmt.
Abb. 8: Geglättete PWM-Ausgangsspannung 4 Analog-Digital-Wandler Mit einer Verbindung E2 gegen GND und einem Druck auf die Reset-Taste starten Sie ein kleines Beispielprogramm zum Analog-Digital-Wandler (AD-Wandler). Die analoge Spannung am analogen Eingang AD1 wird gemessen und in einen digitalen Zahlenwert umgesetzt. Weil der TPS-Controller durchgehend mit 4-BitWerten arbeitet, ist das Ergebnis der Analog-Digital-Wandlung eine Zahl im Bereich 0 bis 15.
Abb. 9: Anschluss des Lichtsensors Abb.
Das Beispielprogramm hat wegen der Ausgabe an die digitalen Ausgänge und den PWM-Ausgang große Ähnlichkeit mit dem Programm aus dem letzten Abschnitt. In der ersten Zeile steht jedoch das Kommando zum Wandeln eines Analogwerts. Adresse Befehl Daten Kommentar 2A 6 9 A = AD1 2B 5 4 Port = A 2C 5 9 PWM = A 2D 2 6 Warte 100 ms 2E 3 4 Springe –4 Listing 3: AD-Wandler und PWM-Ausgang Testen Sie das Programm mit unterschiedlicher Beleuchtung des Sensors.
Abb. 11: Start des Zufallsschalters Abb.
Das Programm verwendet einen bedingten Sprungbefehl. Wenn der S1-Eingangszustand Eins ist, wird der folgende Befehl übersprungen. Drückt man auf die Taste, ist der Zustand Null, und damit wird die Erhöhung der Variablen A ausgeführt. Das führt zu einem schnellen Hochzählen des Ausgangszustands. Beim Loslassen bleibt der letzte Zählerstand stehen. Wegen der hohen Zählgeschwindigkeit hat man keinen Einfluss auf das Ergebnis, das also zufällig ist.
Abb. 13: E4 an GND Abb.
Eine Zeitmessung läuft im Zustand S1 = 0, also bei gedrückter Taste. Zur Wartezeit von 5 ms kommen noch einmal ca. 5 ms für die Ausführung von insgesamt fünf Befehlen in der Zählschleife. Die Zeiteinheit der Messung ist daher 10 ms.
Abb. 15: S1 und S2 für den Programmiermodus Abb.
• • • • • • • • • Erster Tastendruck S2 Adresse (untere vier Bit) anzeigen, 300 ms Anzeige aus, 300 ms Befehl anzeigen Zweiter Tastendruck S2 Daten anzeigen Dritter Tastendruck S2 Nächste Adresse anzeigen, 300 ms usw. Will man z. B. ein bestehendes Programm mit fünf Schritten nur ansehen, aber nicht verändern, gelangt man mit insgesamt zehn Betätigungen von S2 bis ans Ende. Weil jeweils die aktuelle Adresse kurz eingeblendet wird, fällt die Orientierung leicht.
Hinterkopf die Vorstellung aufbauen, dass das System die Energie für die Anzeige einspart und für die Programmierung des EEPROM verwendet. So etwas kennt man auch vom Auto: Wenn der Anlasser betätigt wird, gehen für einen kurzen Moment Licht und Radio aus. Man kann ein bereits bestehendes Programm auch nur an einer Stelle verändern. Mit S2 scrollt man dann bis zur gewünschten Stelle und verändert mit S1 den Befehl oder die Daten, um sie dann mit S2 zu speichern.
9 Wiederherstellung der Beispielprogramme Falls Sie nach einiger Zeit den Urzustand des Controllers wiederherstellen möchten, kann dies mit der Eingabe von zwei Bytes FF geschehen. Tatsächlich entspricht dies dem Zustand des unbeschriebenen EEPROM. Die Firmware des TPS-Controllers enthält eine Startfunktion, die zunächst die ersten beiden Adressen überprüft, um einen leeren Speicher zu erkennen. Werden hier zwei FF-Bytes gelesen, geht der Controller davon aus, dass noch kein Programm eingegeben wurde.
Der Wartebefehl 2 verwendet einen Parameter, der die Zeit in Millisekunden und in einer 1-2-5-Stufung enthält. Trotz des geringen Zahlenumfangs von 0 bis 15 lassen sich auf diese Weise Verzögerungszeiten zwischen einer Millisekunde und einer Minute ausführen. Noch längere Zeiten müsste man durch mehrmaliges Ausführen eines Wartebefehls, z. B. in einer Zählschleife, programmieren.
Adresse Befehl Daten Kommentar 08 3 8 Springe –8 11 28 12 28 14 28 18 28 38 Listing 10: Lauflicht 1 Erweitern Sie das Programm um zwei weitere Ausgabemuster, sodass der Leuchtpunkt immer hin- und zurückläuft. Experimentieren Sie auch mit anderen Ausgabemustern und Verzögerungszeiten.
11 Rechnen mit Variablen Bisher wurden in den Parametern der einzelnen Befehle nur konstante Zahlenwerte verwendet. Das ist sinnvoll, wenn ein Programm immer gleich ablaufen soll. Komplexere Programme arbeiten dagegen mit variablen Daten. Es kann z. B. eine Rechnung wie A = A + B ausgeführt werden. Abhängig vom Inhalt der Variablen A und B wird dabei jedes Mal etwas anderes herauskommen. Das Ergebnis könnte z. B. die LEDs an den Ausgängen steuern. Die Steuerung besitzt die vier Variablen A, B, C und D.
65: A = Din.0 66: A = Din.1 67: A = Din.2 68: A = Din.3 69: A = AD1 6A: A = AD2 71 –7A: A = Ausdruck 1–10 71: A = A + 1 72: A = A – 1 73: A = A + B 74: A = A – B 75: A = A * B 76: A = A / B 77: A = A And B 78: A = A Or B 79: A = A Xor B 7A: A = Not A Ein Beispiel für die Verwendung der Variablen A findet man unter den Programmbeispielen in Kapitel 3. Das Programm wurde hier an die Adresse Null gesetzt und leicht erweitert. Hinzugekommen ist ein definierter Anfang mit dem Wert 0 in der Variablen A.
Adresse Befehl Daten Kommentar 00 6 9 A = AD1 01 5 4 Port = A 02 7 A A = Not A 03 5 9 PWM = A 04 2 6 Warte 100 ms 05 3 5 Springe –5 69 54 7A 59 26 35 Listing 14: Invertieren 12 Sprünge und Verzweigungen Bisher gab es nur einen einfachen Rücksprung (Befehl 3), der maximal 15 Adressen zurückreichte. Nun kommt ein absoluter Sprung (Jump) hinzu. Da das Sprungziel nur mit 4 Bit angegeben werden kann, gibt es einen zusätzlichen Befehl, der das High-Nibble der Adresse festlegt.
C5: if Din.1 = 1 then Adr = Adr + 1 C6: if Din.2 = 1 then Adr = Adr + 1 C7: if Din.3 = 1 then Adr = Adr + 1 C8: if Din.0 = 0 then Adr = Adr + 1 C9: if Din.1 = 0 then Adr = Adr + 1 CA: if Din.2 = 0 then Adr = Adr + 1 CB: if Din.
Geben Sie das Programm ein und testen Sie es. Die Reaktionszeit ist jetzt wesentlich schneller. Die Zeiteinheit liegt bei ca. 5 ms. Das ursprüngliche Beispielprogramm befindet sich noch im Speicher ab Adresse 34h, da nur die unteren Adressen überschrieben wurden. Schreiben Sie ein kleines Programm, das nur einen Sprung auf diese Adresse enthält. Hier muss zuerst die Seite 3 angegeben werden. Der dann folgende absolute Sprung mit der angegebenen Adresse 4 zielt dann auf die tatsächliche Adresse 34.
A 1 2 3 4 10 2s 10 10 5 6 7 A = AD2 A = Not A 8 9 A B C D A A A Din.2 = 0 A B 11 5s 11 11 B B B Din.3 = 0 B C 12 10 s 12 12 C C C S1 = 0 C D 13 20 s 13 13 D D D S2 = 0 D E 14 30 s 14 14 E E E S1 = 1 E F 15 60 s 15 15 F F F S2 = 1 F E 14 Zählschleifen Ein Vorgang soll z. B. genau fünfmal ausgeführt werden. Dazu bildet man eine Zählschleife. Ein Sprungbefehl wird in diesem Fall fünfmal ausgeführt, danach nicht mehr.
Man kann die Zählschleife auch so verwenden, dass nicht zurück, sondern vorwärts gesprungen wird. Diesmal wird der Vorgang tatsächlich fünfmal ausgeführt, wenn C am Anfang mit dem Wert 5 geladen wurde. Die jeweils übersprungene Adresse 04 enthält einen relativen Sprung auf sich selbst, und damit eine Endlosschleife, die als Programmende dient.
Adresse Befehl Daten Kommentar 03 6 9 A = AD1 04 C 1 Skip if A>B 05 9 8 Adr 08 06 1 F LEDs 1111 07 3 4 Adr 03 08 1 0 LEDs 0000 09 3 6 Adr 03 45 51 80 69 C1 98 1F 34 10 36 Listing 19: Einfacher Dämmerungsschalter Testen Sie das Programm, indem Sie den Lichtsensor mit der Hand mehr oder weniger abschatten. Sie werden feststellen, dass die Grundfunktion erfüllt ist. Allerdings kommt es meist zu einem unschönen Nebeneffekt.
Adresse Befehl Daten Kommentar 03 7 7 A = A And B 04 5 4 Port = A 05 3 5 Springe –5 64 51 43 77 54 35 Listing 20: Anwendung der AND-Funktion Ändern Sie das Programm, und testen Sie auch andere logische Funktionen.
Unterprogramm: Adresse Befehl Daten Kommentar 08 7 2 A = A-1 09 E 0 Ret 80 D8 54 29 D8 54 28 37 72 E0 Listing 21: Unterprogrammaufrufe Das Ergebnis des Programms ist ein absteigender Binärzähler mit ungleichen Zeitverzögerungen. Testen Sie auch einmal andere Befehle im Unterprogramm. Unter den im Auslieferungszustand vorhandenen Beispielprogrammen gibt es mehrere nützliche Unterprogramme für die allgemeine Verwendung. Sie sind im Anhang komplett aufgelistet.
18 Dämmerungsschalter Ein Dämmerungsschalter soll das Licht einschalten, wenn die Umgebungshelligkeit unter einen bestimmten Grenzwert fällt. Wenn es heller wird, soll umgekehrt das Licht wieder ausschalten. Es sollte sichergestellt werden, dass das Licht auf der Grenze zwischen hell und dunkel nicht flackert. Das gelingt mit einer Hysterese, also einem gewissen Abstand der Einschalt- und Ausschalthelligkeit.
Im Kern des Programms kommen die schon bekannten Skip-Befehle zum Einsatz. Wenn die jeweilige Taste nicht gedrückt ist, wird der zugehörige Befehl zum Erhöhen oder Verkleinern des Akkuinhalts übersprungen. Die Schwierigkeit besteht aber darin, dass normalerweise dabei auch ein Überlauf von 15 auf 0 oder von 0 auf 15 auftreten kann. Es erfordert etwas mehr Aufwand, dieses Überlaufen zu verhindern.
20 Zahlenschloss Das hier vorgestellte Zahlenschloss schaltet den PWM-Ausgang ein, wenn der Benutzer die korrekte Zahlenfolge eingegeben hat. Die Zahleneingabe soll exakt nach dem Muster des Programmierens über die Tasten S1 und S2 ablaufen. Das folgende Programm demonstriert die Eingabe einer einzelnen Zahl über die Taste S1. Wie beim Programmiervorgang führt der erste Tastendruck zum Ergebnis 0000. Jeder folgende Druck auf S1 erhöht die Ausgabe um 1. Durch einen Druck auf S2 wird die Eingabe beendet.
Der PWM-Ausgang wird in diesem Beispiel wie ein normaler Digital-Port behandelt. Das ist erforderlich, weil alle vier Ausgänge A1 bis A4 für die Zahleneingabe benötigt werden. Nach jeder vollständigen Eingabe werden die vier LEDs gelöscht, um einem eventuellen Beobachter möglichst wenig Hinweise auf die geheime Zahlenkombination zu geben.
21 Anhang Listing der Beispielprogramme Adresse Befehl Daten Kommentar 00 6 4 A = Din 01 5 1 B=A 02 4 E A = 1110 03 8 0 Seite 0 04 C 3 A = B? 05 9 8 Springe 08 06 8 2 Seite 2 07 9 5 Springe 25, »Hochzählen« 08 4 D A = 1101 09 8 0 Seite 0 0A C 3 A =B ? 0B 9 E Springe 0E 0C 8 2 Seite 2 0D 9 A Springe 2A, »AD/PWM« 0E 4 B A = 1011 0F 8 1 Seite 1 64 51 4E 80 C3 98 82 95 4D 80 C3 9E 82 9A 4B 81 Seite 0: Auswahl und Start der Beispielprogramme Ad
Adresse Befehl Daten Kommentar 19 9 4 Springe 34, »Stoppuhr S1« 1A 4 3 A = 0011 1B 8 2 Seite 2 1C C 3 A = B? 1D 9 0 Springe 20 »Wechselblinker« 1E 8 4 Seite 4 1F 9 0 Springe 40 »Stoppuhr S1/S2« C3 94 83 90 47 81 C3 9A 83 94 43 82 C3 90 84 90 Seite 1: Auswahl und Start der Beispielprogramme Adresse Befehl Daten Kommentar 20 1 1 0001 »Wechselblinker« 21 2 8 Warte 500 ms 22 1 8 1000 23 2 8 Warte 500 ms 24 3 4 Springe –4 25 7 1 A = A + 1 »Hochzählen«
Adresse Befehl Daten Kommentar 30 5 4 Port = A »Zufall« 31 C E S1 = 1? 32 7 1 A=A+1 33 3 3 Springe –3 34 2 2 Warte 5 ms »Stoppuhr S1« 35 C C S1 = 0? 36 3 2 Springe – 2 37 4 0 A=0 38 2 2 Warte 5 ms 39 7 1 A=A+1 3A 5 4 Port = A 2B C E S1 = 1? 3C 3 4 Springe –4 3D 3 9 Springe –9 3E F F - 3F F F - 54 CE 71 33 22 CC 32 40 22 71 54 CE 34 39 FF FF Seite 3: Beispielprogramme: Zufall, Stoppuhr S1 Adresse Befehl Daten Kommentar 40 8 6 Seite 6
Adresse Befehl Daten Kommentar 4C F F - 4D F F - 4E F F - 4F F F - 86 D0 40 71 54 23 CD 34 D8 40 54 3B FF FF FF FF Seite 4: Beispielprogramm Stoppuhr Start/Stopp Adresse Befehl Daten Kommentar 50 4 F A = 15 »Ton lang« 51 9 3 Adr 03 52 4 5 A = 5 »Ton kurz« 53 5 3 D = A »Ton variabel« 54 1 9 A4 = 1 55 1 1 A4 = 0 56 2 1 2 ms 57 1 9 A4 = 1 58 1 1 A4 = 0 59 2 1 2 ms 5A 1 9 A4 = 1 5B 1 1 A4 = 0 5C 2 0 1 ms 5D B 4 Dmal 04 5E 1 0 Do
Adresse Befehl Daten Kommentar 60 2 3 Warte 10 ms »Warte S1« 61 C E S1 = 1? 62 3 2 Springe –2 63 2 3 Warte 10 ms 64 C C S1 = 0? 65 3 1 Springe –1 66 E 0 Return 67 F F - 68 2 3 Warte 10 ms »Warte S2« 69 C F S2 = 1? 6A 3 2 Springe –2 6B 2 3 Warte 10 ms 6C C D S2 = 0? 6D 3 1 Springe –1 6E E 0 Return 6F F F - 23 CE 32 23 CC 31 E0 FF 23 CF 32 23 CD 31 E0 FF Seite 6: Unterprogramme Warte S1 und Warte S2 Adresse Befehl Daten Kommentar 70 C
Adresse Befehl Daten Kommentar 7C 2 3 Warte 10 ms 7D C C S1 = 1? 7E 3 1 Springe – 1 7F 3 C Springe –12 CC 31 40 54 23 CE 32 CF E0 CC 33 71 23 CC 31 3C Seite 7: Unterprogramm Tasteneingabe Befehlstabelle 1 2 Port = Wait 3 4 Jump – A = 5 6 7 ... = A A = ... A = ... B=A A=B A = A+1 8 9 A B C D Page Jump C* D* Skip if ...
Impressum © 2012 Franzis Verlag GmbH, 85540 Haar www.elo-web.de Autor: Burkhard Kainka ISBN 978-3-645-10104-2 Produziert im Auftrag der Firma Conrad Electronic SE, Klaus-Conrad-Str. 1, 92240 Hirschau Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien.