Franzis-Lernpaket Mikrocontroller programmieren              

- Das Experimentierhandbuch, Teil 1: Grundlagen -                    
Mit freundlicher Genehmigung des Franzis-Verlags                  
             

Elektronik-Labor  Literatur  Projekte  Lernpakete  TPS  


www.elo-web.de/elektronik-lernpakete/mikrocontroller/das-franzis-lernpaket-mikrocontroller-programmieren
For some English information see:  Learning Programming with MyCo


Mit der kompakten Platine dieses Lernpakets bauen Sie einem kompletten Steuercomputer für den universellen Einsatz. 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 meist, dass man einen Mikrocontroller oder Prozessor aussucht, der möglichst genau zu der gewünschten Aufgabe passt. Man hat die Auswahl zwischen unzähligen Typen verschiedener Firmen. Und auch die Programmiersprache kann gewählt werden. Meist wird Assembler und C angeboten, in vielen Fällen auch Basic oder eine andere Hochsprache. Normalerweise braucht man zur Programmierung aufwendige Software und ein Programmiergerät. Neben dem finanziellen Aufwand ist auch die Einarbeitungszeit nicht zu vernachlässigen.

 

Der hier verwendete Mikrocontroller ist ganz anders. Zum Programmieren brauchen Sie nicht mehr als zwei Tastschalter auf der Platine. Die „Tastenprogrammierbare Steuerung“ (TPS) kennt nur relativ wenige Befehle, die sich leicht erlernen lassen und die mithilfe der Tasten in den Controller programmiert werden. Eine Änderung des Programms ist jederzeit und ohne besondere Hilfsmittel möglich.

 

Das System eignet sich besonders für kompakte Anwendungen im Bereich Messen, Steuern und Regeln. Viele Aufgaben sind mit diesem System bereits vollwertig lösbar. Dazu kommt, dass Sie den Mikrocontroller nach erfolgreicher Programmierung in eigene Schaltungen einbauen können. Grundwissen im Bereich Elektronik wird dabei vorausgesetzt.

 

Zugleich eignet sich die Platine auch als Grundlage für die Ausbildung und für die ersten Schritte in die Mikrocontroller-Programmierung. Erfolge stellen sich schneller ein als bei anderen Systemen. Die Strukturen sind aber ähnlich wie in anderen Programmiersprachen, sodass der spätere Übergang erleichtert wird.

 

Ich wünsche viel Spaß und Erfolg beim Programmieren! Tipps und Tricks, zusätzliche Programmbeispiele sowie künftige Entwicklungen und Erweiterungen rund um die Tastenprogrammierbare Steuerung finden Sie im Internet: www.elektronik-labor.de

 

Ihr Burkhard Kainka


Inhalt

 

1 Einleitung. 3

2 Hardwaretests. 10

2.1 Grundaufbau. 10

2.2 Wechselblinker 12

2.3 Binärzähler und PWM-Ausgabe. 12

2.4 Der Analog-Digital-Wandler 16

2.5 Zufallsgenerator 18

2.6 Impulslängenmessung. 20

3 Der Programmiermodus. 22

3.1 Programme auslesen. 22

3.2 Programme eingeben. 24

3.3 Wiederherstellung der Beispielprogramme. 25

4 TPS-Befehle. 27

4.1 Die Basisbefehle. 27

4.2 Rechnen mit Variablen. 29

4.3 Sprünge und Verzweigungen. 31

4.4 Die Befehlstafel 34

. 53
Teil 2 des Handbuchs

 

1 Einleitung

 

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.

 

Technische Daten:

Mikrocontroller: HT46F47

Taktfrequenz: 2 MHz

Internes EEPROM: 128 Bytes

Spannungsversorgung: 2,2 V bis 5,5 V

Stromaufnahme: 1 mA bei 4,5 V

4 Ausgangsports: belastbar bis 10 mA

1 PWM-Ausgang: belastbar bis 10 mA

4 Eingangsports: Ruhezustand 1

2 analoge Eingänge: 0 V ... Vcc

2 Tasteneingänge: Ruhezustand 1

 

Bauteile im Lernpaket:

Platine

Batteriefach 3 * AA
Draht

HT46F47 mit TPS-Firmware

IC-Fassung

3 Tastschalter

4 LEDs 3 mm, rot

1 LED 3 mm, grün

1 LDR

1 Piezo-Schallwandler

3 Scheibenkondensatoren 100 nF 

1 Elko 47 µF

5 Widerstände 2,2 kΩ

1 Widerstand 10 kΩ

1 Widerstand 27 kΩ

2 Widerstände 100 kΩ

 

Zur Programmierung braucht man die beiden Tasten S1 und S2 und eine einfache LED-Anzeige aus vier LEDs an den Ausgängen A1 bis A4. Es gibt insgesamt 14 einfache Befehle mit zugehörigen Daten oder Unterbefehlen. Befehle und Daten sind jeweils als 4-Bit-Binärzahlen im Bereich 0000 bis 1111 (dezimal 0 bis 15) kodiert und werden an den Anzeige-LEDs direkt sichtbar. Die jeweilige Zahl wird beim Programmieren durch Tastendrücke auf S1 programmiert. Mit S2 wird jeweils zwischen Befehl und Daten gewechselt und die Adresse der Befehlszeile erhöht. Die gesamte Programmstruktur ist so einfach, dass man sie nach einiger Übung aus dem Kopf beherrschen kann.

 

 

Abb. 1.1: Grundschaltung des Systems 

 

Abb. 1.1 zeigt den vereinfachte Schaltung des Systems mit allen Bauteilen, die immer benötigt werden. Auf der Platine sind zusätzliche Steckverbinder vorgesehen. Außerdem bekommt auch der PWM-Ausgang eine LED mit Vorwiderstand. Bild 1.2 zeigt den vollständigen Schaltplan.

 

 

 

 

 

Abb. 1.2 Schaltplan mit allen Steckverbindern 

 

Die meisten Anschlüsse sind mehrfach zugänglich. Die großen Lötanschlüsse eignen sich für einfache Experimente mit direkt angelöteten Bauteilen oder zum Anlöten von Kabeln. Alternativ können auch Schraubklemmen eingesetzt werden. Zusätzlich ist die Bestückung zehnpoliger Pfostenstecker vorgesehen, sodass die Platine auch mit Flachbandkabeln verbunden werden kann. Schraubklemmen und Pfostenstecker gehören nicht zum Lieferumfang des Lernpaktes und können bei Bedarf zusätzlich besorgt werden.

 

 

 


Abb. 1.3 Das Platinenlayout 

 

 

Abb. 1.4 Die unbestückte Platine 

 

Die Platine ist mit allen Bauteilewerten beschriftet, sodass die Bestückung keine Probleme bereitet. Der Mikrocontroller erhält einen IC-Sockel, damit er später auch in andere Schaltungen eingebaut werden kann. Achten Sie auf die korrekte Einbaurichtung der vier roten LEDs, deren Kathoden (kurzer Draht) zum Platinenrand weisen. Lassen Sie alle äußeren Anschlüsse und Steckverbinder zunächst frei. Die PWM-LED und ihr Vorwiderstand können jetzt schon bestückt werden, auch wenn sie bei den ersten Versuchen noch nicht benötigt werden. Beachten Sie die Einbaurichtung der PWM-LED, deren Kathode anders als bei den übrigen vier LEDs zur Mitte der Platine weist.

 

 

Abb. 1.5: Standardaufbau mit Tastschaltern 

 

Bild 1.6 zeigt die mögliche Bestückung mit Schraubklemmen vom Typ AK500. Falls Sie diese Anschlüsse in Betracht ziehen, sollten Sie die entsprechenden Anschüsse möglicht nicht vorher anlöten. Man kann zwar auch später noch das überflüssige Zinn aus den Lötlöchern entfernen, aber das bedeutet mehr Arbeit.

 

Abb. 1.6: Verwendung von Schraubklemmen (z.B. Reichelt AKL 101 / RM5,08 mm)

 

Zur Verbindung mit externen Baugruppen wie Leistungstreibern, Relaistreibern oder Optokopplern können auch die Pfostenstecker verwendet werden, wobei wahlweise gerade oder gewinkelte Typen eingesetzt werden können.

 

 

Abb. 1.7: Verwendung der Pfostenstecker (z.B. Reichelt SL 2X10W 1,27)

 

Alle Lötanschlüsse sind auch über die Pfostenstecker erreichbar. Die Ausgänge stehen an SV1 bereit, die Eingänge an SV2. An beiden Steckern liegt auch die Betriebsspannung,  sodass man wahlweise die Platine über das Flachbandkabel oder aber externe Peripherie über die am System angeschlossene Spannungsquelle versorgen kann. Ab SV1 stehen überdies mit Reset, S1 und S2 alle Anschlüsse bereit, die man für die Programmierung des Systems braucht.

 

 

1

S2

S1

2

3

Reset

PWM

4

5

A1

A2

6

7

A3

A4

8

9

GND

VCC

10

 

Pfostenstecker SV1

 

1

S2

S1

2

3

AD1

AD2

4

5

E1

E2

6

7

E3

E4

8

9

GND

VCC

10

 

Pfostenstecker SV2

 


2 Hardwaretests

 

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. Die zugehörigen Programmlisten vermitteln einen ersten Eindruck von den Möglichkeiten. Sie werden jeweils nur kurz erläutert. Die genaue Erklärung der einzelnen Befehle soll im nächsten Kapitel folgen.

 

2.1 Grundaufbau

 

Schließen Sie nun eine Stromversorgung an. Beachten Sie unbedingt die korrekte Polung des Batteriefache mit dem Minuspol (schwarz) an GND und dem Pluspol (rot) an VCC. Hier werden noch nicht alle Komponenten der Platine verwendet. Insbesondere die Taster S1 und S2 sowie die grüne PWM-LED sind noch ohne Funktion, sie stören jedoch auch nicht. Unbedingt erforderlich sind:

 

Anschluss der Spannungsversorgung an GND (Minus) und VCC (Plus)

Ein Abblockkondensator 100 nF zwischen VCC und GND

Reset-Widerstand nach VCC und Reset-Kondensator nach GND

Oszillatorwiderstand 100 kΩ nach VCC und Kondensator nach GND

 

Der Mikrocontroller HT46F47 wird mit seinem internen RC-Oszillator betrieben. Der Widerstand am Osc1-Eingang legt die Taktfrequenz fest. Mit 100 kΩ wird eine Frequenz von ca. 2 MHz eingestellt. Bei Bedarf kann mit kleinerer oder größerer Geschwindigkeit gearbeitet werden. Der angeschlossene Kondensator dient nur zur Abblockung und hat keinen Einfluss auf die Taktfrequenz. Der Anschluss Osc2 (Anschluss P3) bleibt frei. Bei Bedarf kann man aber hier einen zusätzlichen Widerstand gegen VCC anschließen und Impulse mit einem Viertel der Taktfrequenz auskoppeln.

 

 

Abb. 2.1: Vier LEDs an den Ausgängen 

 

 

Das einmal angeschlossene Batteriefach sollte möglichst immer verbunden bleiben, um die Lötanschlüsse nicht durch zu häufiges Erhitzen zu beschädigen. Setzen Sie nun drei 1,5-V-Batterien oder alternativ drei NiMh-Akkus in das Batteriefach ein. Nehmen Sie zum Abschalten eine der Batterien aus dem Fach.

 

 

Abb. 2.2: Minimale Beschaltung mit LEDs 

 

2.2 Wechselblinker

 

Mit dem Anschluss der Stromversorgung starten Sie das erste Beispielprogramm mit einem Wechselblinker mit der linken und der rechten LED. Die Blinkfrequenz beträgt etwa 1 Hz. Das Programm-Listing zeigt das einfache Programm mit nur fünf Zeilen. Es wird abwechselnd die LED 1 und die LED 8 eingeschaltet. Dazwischen liegen Wartebefehle mit einer Wartezeit von 0,5 s. Ein Rücksprung zum Anfang sorgt dafür, dass das Blinken endlos wiederholt wird. Die einzelnen Befehle werden weiter unten noch genauer erläutert. Sie können aber an diesem Beispiel schon die Einfachheit der Programmierung erkennen. Die Firmware des Controllers besitzt einen Interpreter, der die einfachen Kommandos erkennt und ausführt. Programme werden daher um ein Vielfaches kompakter als in anderen Systemen.

 

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 gesetzt werden, wobei die ursprünglichen Beispielprogramme wiederhergestellt werden.

 

Adresse

Befehl

Daten

Kommentar

20

1

1

LED 1

21

2

8

Warte 500 ms

22

1

8

LED 8

23

2

8

Warte 500 ms

24

3

4

Springe - 4

 

Listing 2.1: Wechselblinker

 

Falls das gewünschte Ergebnis ausbleibt, überprüfen Sie zuerst die korrekte Polung der LEDs. Hilfreich ist auch eine Messung einiger Spannungen. Verwenden Sie z.B. ein Digitalmultimeter im 20-V-Bereich und lassen Sie den Minusanschluss an GND. Alle Spannungen werden damit gegen GND gemessen:

 

VCC: 4,5 V

Reset: 4,5 V

Osc1: 1,5 V

E1 bis E4: 4,5 V

A1: wechselnd

A2, A3: 0V

A 3: wechselnd

 

 

2.3 Binärzähler und PWM-Ausgabe

 

Alle digitalen Eingänge sind mit einem internen Widerstand gegen VCC hochgezogen (Pullup-Widerstand) und haben eine Ruhespannung in Höhe der Betriebsspannung. Sie können aber jeden der Eingänge mit einem Draht oder einem Kontakt an GND legen. Beim Start liest das Default-Programm den Portzustand und wertet ihn aus. Einzelne Anschlüsse können an GND gelegt werden, sodass hier ein Null-Zustand gelesen wird. In Abhängigkeit vom Ergebnis werden verschiedene Programme aufgerufen.

 

Abb. 2.3: Einsatz der PWM-LED 

 

 

 

Abb. 2.4: Start des Binärzählers ((Platine5.jpg))

 

Legen Sie den Eingang E1 an GND. Sie können einen Draht zwischen E1 und GND anlöten, für diesen Versuch reicht es jedoch, einen Draht nur vorübergehend an die Anschlüsse zu halten. 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.

 

Adresse

Befehl

Daten

Kommentar

25

7

1

A = A + 1

26

5

4

Port = A

27

5

9

PWM = A

28

2

6

Warte 100 ms

29

3

4

Springe - 4

 

Listing 2.2: Binärzähler mit LED- und PWM-Ausgabe

 

Das Zählprogramm kann als Übungsprogramm für das Lesen von Binärzahlen eingesetzt werden, die für die eigene Programmierung beherrscht werden müssen. Jede der vier LEDs stellt ein Bit dar. Insgesamt kann daher eine 4-Bit-Zahl angezeigt werden. Die LEDs werden im Schaltplan und auf der Platine entsprechend ihrer Wertigkeit 8, 4, 2 und 1 bezeichnet. Durch Addition der jeweiligen Werte erhält man die Dezimalzahl. In hexadezimaler Schreibweise werden die Zahlen 10 bis 15 durch die großen Buchstaben A bis F dargestellt.

 

„8“

„4“

„2“

„1“

Dezimal

Hexadezimal

0

0

0

0

0

0

0

0

0

1

1

1

0

0

1

0

2

2

0

0

1

1

3

3

0

1

0

0

4

4

0

1

0

1

5

5

0

1

1

0

6

6

0

1

1

1

7

7

1

0

0

0

8

8

1

0

0

1

9

9

1

0

1

0

10

A

1

0

1

1

11

B

1

1

0

0

12

C

1

1

0

1

13

D

1

1

1

0

14

E

1

1

1

1

15

F

 

Das Programm lässt sich auch als Blinkgeber für unterschiedliche Frequenzen einsetzen. Der nächst höhere Ausgang hat jeweils die halbe Frequenz bzw. die doppelte Periodendauer:

 

A1: 200 ms

A2: 400 ms

A3: 800 ms

A4: 1600 ms

 

Zusätzlich werden die aufsteigenden Zahlenwerte auch an den PWM-Ausgang (Pulsweitenmodulation) ausgegeben. Das PWM-Signal ist ein Rechecksignal mit einer Frequenz von ca. 16 kHz. Die Pulslänge wird dabei gesteuert, sodass das Puls/Pausenverhältnis die durchschnittliche Einschaltdauer und damit die Helligkeit der LED bestimmt. Die Helligkeit der hier angeschlossenen LED wird in 15 Stufen zwischen Null und voller Helligkeit gesteuert.

 

Ein PWM-Signal kann mithilfe eines RC-Tiefpassfilters mti 10 kΩ und 47 µF zu einer Gleichspannung geglättet werden. Der PWM-Ausgang wird damit zu einem Analogausgang. Mit diesem Programm erhalten Sie eine stufenweise von 0 V bis 4,5 V ansteigende Gleichspannung. Verfolgen Sie den Spannungsverlauf mit einem Messgerät oder einem Oszilloskop.

 


Abb. 2.5: Tiefpassfilter am PWM-Ausgang 

 

 

 

Abb. 2.6: Geglättete PWM-Ausgangsspannung 

 

Bei diesem Versuch wurde der nicht verwendete, hochohmige Eingang AD2 als Stützpunkt für das Tiefpassfilter verwendet. Für eine kurze Messung reicht es, die Bauteile einfach nur provisorisch in die Lötlöcher zu stecken.

 

2.4 Der 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-Bit-Werten arbeitet, ist das Ergebnis der Analog-Digital-Wandlung eine Zahl im Bereich 0 bis 15. Das Ergebnis 0 steht für die Eingangsspannung 0, das Ergebnis 15 für eine Spannung, die der Betriebsspannung entspricht, also z.B. 4,5 V. Der AD-Wert wird als Binärzahl an den vier LEDs ausgegeben und zusätzlich an den PWM-Ausgang übergeben. Schließen Sie einen Spannungsteiler aus einem Festwiderstand und einem lichtabhängigen Sensorwiderstand (LDR) an den analogen Eingang AD1.

 


Abb. 2.7: Anschluss des Lichtsensors 

 

 

Abb. 2.8: Der LDR am AD1-Eingang 

 

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 2.3: AD-Wandler und PWM-Ausgang

 

Testen Sie das Programm mit unterschiedlicher Beleuchtung des Sensors. Je mehr Licht auf den LDR fällt, desto kleiner ist die Spannung an AD1. Umgekehrt entstehen bei Dunkelheit maximale AD-Werte und damit eine maximale Helligkeit der LED am PWM-Ausgang. Lesen Sie die Binärzahlen vom LED-Display ab und versuchen Sie z.B. eine Helligkeit genau auf der Hälfte des Bereichs einzustellen. Der digitale Wert liegt dann bei 0111 oder 1000. Bei etwas flackerndem Kunstlicht kann es vorkommen, dass das Ergebnis zwischen zwei Stufen wechselt.

 

 

2.5 Zufallsgenerator

 

Mit einer Drahtbrücke E3 gegen GND starten Sie ein Beispielprogramm für einen Zufallsgenerator. Hier wird die Taste S1 ausgewertet. Der zugehörige Eingang verfügt über einen internen Pullup-Widerstand, der die Spannung auf VCC-Level zieht. Die Taste ist gegen Masse angeschlossen. Ein Tastendruck zieht den Eingang S1 auf Null.

 


Abb. 2.9: Start des Zufallsschalters 

 

 

Abb. 2.10: Drahtbrücke zwischen E3 und GND 

 

Das Programm verwendet einen bedingten Sprungbefehl. Wenn der S1-Eingangszustand Eins ist, wird der folgende Befehl übersprungen. Drückt man auf die Taste, dann 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.

 

Adresse

Befehl

Daten

Kommentar

30

5

4

Port = A

31

C

E

S1 = 1? 

32

7

1

A = A + 1

33

3

3

Springe - 3

 

Listing 2.4: Zufallsgenerator

 

Drücken Sie jeweils kurz auf die Taste, um ein neues Zufallsergebnis zu erhalten. Testen Sie die Zufallsfunktion, indem Sie eine Statistik der Ergebnisse erstellen. Nach einer ausreichend großen Zahl von Durchläufen sollte sich zeigen, dass alle Ergebnisse etwa gleich häufig vorkommen. Das Programm eignet sich auch als Spiel, wobei z.B. die Zahl 1111 „gewürfelt“ werden muss.

 

Zugleich ist das Programm ein Zähler mit der maximal möglichen Arbeitsgeschwindigkeit, weil kein Wartebefehl verwendet wird. Sie können daher an diesem Beispiel die Arbeitsgeschwindigkeit des TPS-Controllers untersuchen. Solange die Taste gedrückt wird erscheint am Ausgang A1 ein Rechtecksignal mit einer Frequenz von ca. 133 Hz und einer Periodendauer vom 7,5 ms. Der Port ändert also nach jeweils 3,75 ms seinen Zustand. Das Programm durchläuft in der Zählschleife vier Befehle. Pro Befehl wird also etwa eine Millisekunde gebraucht. Der letzte Ausgang A4 zeigt eine Frequenz von 16,6 Hz, was noch als sichtbares Flackern erkennbar ist.

 

Wenn für zeitkritische Aufgaben einmal höhere Arbeitsgeschwindigkeiten erforderlich sind, können Sie die Taktgeschwindigkeit des Controllers durch Verkleinern des Widerstands an Osc1 erhöhen. Mit 100 kΩ hat man eine Taktrate von 2 MHz. Tauschen Sie den Widerstand gegen einen mit 27 kΩ. Damit erreichen Sie eine fast vierfach höhere Taktrate und eine Befehlszeit von ca. 0,25 ms. Im Normalfall sollte der Controller jedoch mit 100 kΩ an Osz1 laufen, weil damit eine geringe Stromaufnahme und ein sicheres Arbeiten auch bei kleiner Betriebsspannung bis herunter auf 2,2 V gesichert ist.

 

 

 

2.6 Impulslängenmessung

 

Mit E4 an GND wird nach einem Reset ein Beispielprogramm zur Messung einer Impulslänge gestartet. Auch hier wird wieder der Zustand am Eingang S1 ausgewertet.

 

 

Abb. 2.11: E4 an GND 

 

 

Abb. 2.12: Start der Impulslängenmessung 

 

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.

 

Adresse

Befehl

Daten

Kommentar

34

2

2

Warte 5 ms

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

3B

C

E

S1 = 1?

3C

3

4

Springe - 4

3D

3

9

Springe - 9

 

Listing 2.5: Zeitmessung

 

Drücken Sie die Taste S1 möglichst kurz. Sie erhalten z.B. das Ergebnis 1010, also dezimal 10. Da die Zeiteinheit des Programms 10 ms beträgt, bedeutet die Anzeige 100 ms. Mit etwas Training erreicht man auch kürzere Zeiten bis herunter auf 50 ms.

 

 

 


3 Der Programmiermodus

 

Für die Programmierung werden die Tasten S1 (Dateneingabe, links) und S2 (Programmieren rechts) gebraucht. Außerdem ist die Reset-Taste erforderlich. Allein mit den Tasten können beliebige Programme eingegeben werden. Mit etwas Übung kann man in kürzester Zeit neue Programme eingeben und bestehende Programme modifizieren.

 

3.1 Programme auslesen

 

In den Programmiermodus gelangt man mit einem Reset bei gedrückter Programmiertaste S2, wobei S2 erst etwa eine halbe Sekunde nach Reset losgelassen werden darf. Man kann nun allein mit der Taste S2 durch das vorhandene Programm scrollen und die Befehle und Daten ansehen. Jede Adresse erfordert dazu zwei Tastenbetätigungen an S2. So wechselt man zwischen Anzeige des Befehls und der Daten. Außerdem wird jeweils für kurze Zeit die aktuelle Adresse angezeigt.

 


Abb. 3.1: S1 und S2 für den Programmiermodus 

 

 

 

Abb. 3.2: Drei Taster und LED-Anzeige 

 

- 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, dann 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. Man weiß immer, ob die Anzeige gerade einen Befehl oder Daten darstellt. Im Auslieferungszustand befinden sich die folgenden Befehle in den ersten fünf Adressen. Dabei handelt es sich um den Anfang des Auswahlprogramms zum Start der einzelnen Beispielprogramme.

 

Adresse

Befehl

Daten

Kommentar

00

6

4

A = Din

01

5

1

B = A

02

4

E

A = 14

03

8

0

AdrHi = 0

04

C

3

A = B?

 

Listing 3.1: Programmcode im Grundzustand

 

Ein 4-Bit-Befehl und die zugehörigen 4-Bit-Daten bilden zusammen ein Byte, also eine 8-Bit-Zahl. Ein halbes Byte bezeichnet man auch als „Nibble“. Das höherwertige Nibble bildet jeweils den Befehl, das niederwertige Nibble die zugehörigen Daten. Das EEPROM des Controllers fasst insgesamt 128 Bytes. Damit kann ein Programm maximal 128 Befehle umfassen. Das reicht für die meisten Anwendungen aus, weil der Programmcode extrem kompakt ist. Viele nützliche Programme kommen mit weniger als 10 Befehlen aus.

 

Bringen Sie die einzelnen Befehle und Daten in die Anzeige und vergleichen Sie den Inhalt des Speichers. Drücken Sie danach erneut auf die Reset-Taste. Das alte Programm startet unverändert.

 

3.2 Programme eingeben

 

Die Taste S1 kommt nur zur Anwendung, wenn man einen Befehl oder seine Daten verändern oder neu eingeben will. Grundsätzlich können nur Zahlenwerte zwischen Null und 15 eingegeben werden. Mit dem ersten Druck auf S1 wird eine Null eingestellt. Jeder folgende Tastendruck erhöht die Zahl um Eins. Der aktuelle Stand wird jeweils über die vier LEDs binär angezeigt. Will man z.B. eine Vier eingeben, drückt man insgesamt fünfmal auf S1: 0, 1, 2, 3, 4. Die binäre Anzeige lautet dann 0100.

 

Wenn auf diese Weise entweder der Befehl oder die Daten oder beides neu eingegeben wurde, führt der zweite Tastendruck auf S2 dazu, dass dieses Byte ins EEPROM programmiert wird. Um das zu verdeutlichen wird die LED-Anzeige für 600 ms abgeschaltet, bevor die nächste Adresse und danach der nächste Befehl angezeigt wird. Diese kleine Pause soll intuitiv als Programmiervorgang verstanden werden. Man kann im Hinterkopf die Vorstellung aufbauen, dass das System die Energie für die Anzeige einspart und für die Programmierung des EEPROMs verwendet. So etwas kennt man ja schon vom Auto: Wenn der Anlasser betätigt wird, geht für einen kurzen Moment das Licht und das Radio aus.

 

Man kann ein schon bestehendes Programm z.B. 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.

 

Für den ersten Test soll ein Programm mit nur zwei Befehlen eingegeben werden. Es schaltet drei LEDs ein und führt dann in eine Endlosschleife.

 

Adresse

Befehl

Daten

Kommentar

00

1

7

A1...4 = 0111

01

3

0

Springe - 0

 

Listing 3.2: LEDs einschalten

 

 

Statt eines ausführlichen Listings kann man auch eine Kurzschreibweise wählen. Dabei werden die beiden Bytes zu Hexzahlen zusammengefasst: 17h, 30h. Im Folgenden wird grundsätzlich die hexadezimale Schreibweise verwendet. Die Programme werden daher in kurzer Schreibweise ohne die Hex-Kennzeichen geschrieben: 17 30

 

Zur Eingabe muss Folgendes getippt werden:

 

S2 + Reset

2 x S1

S2

8 x S1

S2

4 x S1

S2

1 x S1

S2

 

Wenn man versehentlich einmal zu oft auf die Taste S1 getippt hat, kann die richtige Zahl trotzdem erreicht werden. Man muss dann noch einmal über 15 gehen, denn danach folgt ein Übertrag auf den Wert Null.

Nach der vollständigen Eingabe wird das neue Programm mit der Reset-Taste gestartet. Man sieht, dass drei LEDs angeschaltet werden. Weiter passiert weiter nichts. Der Controller reagiert nun auch nicht mehr auf die Zustände an den Eingängen E1 bis E4, da das ursprüngliche Programm teilweise überschrieben wurde. Damit können auch die Beispielprogramme nicht mehr gestartet werden.

 

Da Sie nur die ersten beiden Speicheradressen geändert haben, können Sie das ursprüngliche Programm leicht wieder in Gang setzen, indem Sie nur die ersten beiden Kommandos (64 51) entsprechend dem Listing aus dem letzten Abschnitt neu eingeben.

 

Testen Sie die ursprüngliche Funktion der Beispielprogramme. Geben Sie am besten das neue Übungsprogramm noch einmal ein. Nach kurzer Zeit erreichen Sie eine gute Sicherheit im Umgang mit der Programmeingabe.

 

3.3 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 EEPROMs. 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. In diesem Fall wird das EEPROM automatisch mit der Beispielsoftware gefüllt. Diese Funktion dient eigentlich dazu, den Controller beim ersten Start mit den Beispielprogrammen im EEPROM zu versehen. Sie kann aber jederzeit verwendet werden, um den Grundzustand wiederherzustellen.

 

 

Adresse

Befehl

Daten

Kommentar

00

F

F

-

01

F

F

-

 

Listing 3.3: Rückkehr zum Grundzustand

 

Starten Sie also den Programmiermodus durch Reset bei gedrückter S2-Taste. Geben Sie dann insgesamt viermal den Wert F (dezimal 15) ein, bei dem alle LEDs A1 bis A4 an sind. Schließen Sie auch die letzte Eingabe mit S2 ab.

 

Drücken Sie dann auf Reset. Der Controller braucht nur einen Moment länger als üblich, um alle Bytes der Beispielprogramme neu einzuprogrammieren. Damit ist der Urzustand wiederhergestellt. Testen Sie z.B. ohne Drahtbrücke an den Eingängen den Wechselblinker aus Abschnitt 2.2.

 


4 TPS-Befehle

 

Die Tastenprogrammierbare Steuerung kennt insgesamt 14 Befehle (1...14). Zu vielen dieser  Befehle gehört ein Parameter in Form einer 4-Bit-Zahl 0000 bis 1111 (0...F), also mit einem Zahlenbereich bis 15 (dezimal). Andere Befehle kennen Unterfunktionen, die in Form des Parameters angegeben werden. Hinter einem Befehlscode können sich daher bis zu 16 Unterbefehle verbergen. So steht z.B. der Befehl 7 für „Rechne A = ...“, der Parameter gibt an, welche Rechenfunktion ausgeführt werden soll.  

 

4.1 Die Basisbefehle

 

Im Folgenden werden Befehle und Daten zusammen in hexadezimaler Schreibweise als ein Byte geschrieben. Aus dem Befehl 1 zusammen mit dem Parameter 4 wird so das Kommando 14h. Das Hex-Kennzeichen wird weggelassen, weil alle Befehle und Adressen grundsätzlich in hexadezimaler Schreibweise stehen.

 

Die ersten drei Befehle lauten:

 

10 ... 1F: Direkte Portausgabe an A1...A4, 0...15, binär 0000 bis 1111


20 ... 2F: Wartezeit 0...15
(1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000 ms)


30 ... 3F: Sprung zurück 0...15

 

Befehl 1 dient zur Portausgabe einer konstanten Zahl. Damit lassen sich beliebige Bitmuster ausgeben und z.B. auch mehrere LEDs gleichzeitig einschalten.

 

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.

 

Der Rücksprungbefehl 3 ist besonders einfach und reicht für viele Aufgaben aus, bei denen ein Vorgang endlos wiederholt werden soll. Die Sprungweite ist auf den Bereich bis 15 begrenzt. Da die Sprungweite relativ zur aktuellen Adresse gilt, können Programmteile mit diesem Rücksprung beliebig an andere Adressen verschoben werden.

 

Das erste Beispielprogramm aus dem Abschnitt 2.2 kommt mit diesen drei Befehlen aus. Es soll hier leicht modifiziert in den Adressbereich ab 00 geschrieben werden. Auch die Ausgabe-Bitmuster und die Wartezeiten wurden verändert.

 

 

Adresse

Befehl

Daten

Kommentar

00

1

1

A1...4 = 0001

01

2

7

Warte 200 ms

02

1

4

A1...4 = 0100

03

2

7

Warte 200 ms

04

3

4

Springe - 4

 

Listing 4.1: Blinkprogramm

 

In hexadezimaler Kurzschreibweise sieht das Programm nun so aus:

 

11 27 14 27 34

 

Auf der Basis dieser ersten drei Befehle lassen sich bereits zahlreiche einfache Programme schreiben. Analysieren und testen Sie die folgenden drei Programme. Das Ziel sollte sein, dass Sie diese Befehle intuitiv anwenden können. Einfache Programmabläufe wie diese kann man nach einiger Übung sogar aus dem Kopf programmieren und direkt eingeben. Ein Beispiel dafür ist ein einfaches Lauflicht mit vier Ausgabemustern:

 

Adresse

Befehl

Daten

Kommentar

00

1

1

LEDs  0001

01

2

8

Warte 500 ms

02

1

2

LEDs  0010

03

2

8

Warte 500 ms

04

1

4

LEDs  0100

05

2

8

Warte 500 ms

06

1

8

LEDs  1000

07

2

8

Warte 500 ms

08

3

8

Springe - 8

 

11 28 12 28 14 28 18 28 38

 

Listing 4.2: 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.

 

 

Adresse

Befehl

Daten

Kommentar

00

1

1

LEDs 0001

01

2

8

Warte 500 ms

02

1

2

LEDs 0010

03

2

8

Warte 500 ms

04

1

4

LEDs 0100

05

2

8

Warte 500 ms

06

1

8

LEDs 1000

07

2

8

Warte 500 ms

08

1

4

LEDs 0100

09

2

8

Warte 500 ms

0A

1

2

LEDs 0010

0B

2

8

Warte 500 ms

0C

3

C

Springe - 12

 

11 28 12 28 14 28 18 28 14 28 12 28 3C

 

Listing 4.3: Lauflicht 2, hin und zurück

 

Ein Zeitschalter kann mit einem Wartebefehl eine Verzögerung bis zu einer Minute enthalten. Am Ende steht ein Rücksprung mit der Sprungweite Null, also eine Endlosschleife ohne Inhalt, die als Programm-Ende dient. Ein neuer Start wird mit dem Reset-Taster ausgelöst. Erweitern Sie das Programm auch einmal zu einem Drei-Minuten-Küchentimer. Dabei könnten Sie die verbleibende Zeit durch die Anzahl der leuchtenden LEDs als Lichtbalken darstellen.

 

 

Adresse

Befehl

Daten

Kommentar

00

1

F

LEDs 1111

01

2

F

Warte 1 min

02

1

0

LEDs 0000

03

3

0

Ende

 

1F 2F 10 30

 

Listing 4.4: Zeitschalter für eine Minute

 

 

 

4.2 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. Die wichtigste Variable ist A und wird auch als Akkumulator oder kurz Akku bezeichnet. A ist bei allen Rechenoperationen beteiligt und erhält das Rechenergebnis. Außerdem wird A für den Datentransport eingesetzt. B wird hauptsächlich für Rechenoperationen benötigt. C und D können als Zwischenspeicher dienen und werden später noch als Zähler für Zählschleifen gebraucht.

 

Außerdem gibt es zwei analoge Eingänge (AD1 und AD2) und einen PWM-Ausgang. Die verarbeiteten Daten sind auf 4 Bit begrenzt und sind nur über die Variable A zugänglich (A = AD1, PWM = A). Der Akku A kann auch direkt mit einer Zahl geladen werden (Befehle 40...4F). Um B, C oder D zu füllen, muss man zuerst A laden und den Inhalt dann der anderen Variablen zuweisen (Befehle 51...53). Mit A und B können einige Rechenschritte (Befehle 71...7A) durchgeführt werden.

 

Die Befehle 40...4F weisen A einen neuen Wert zu. Die Befehlsgruppe 51...5A überträgt den Inhalt von A an ein Ziel wie z.B. eine andere Variable oder den PWM-Ausgang. In dieser Gruppe gibt es auch Kommandos, die ein einzelnes Bit des Ausgangsports setzen.

 

Genau die andere Datenrichtung liegt mit der Befehlsgruppe 61...6A vor, wo Daten einer Quelle in A eingelesen werden. Die Befehlsgruppe 71...7A schließlich führt einige Rechenoperationen durch, wobei das Ergebnis grundsätzlich in A erscheint. Der Ausgangsport Dout umfasst die vier Ausgänge A1 bis A4, die entweder gemeinsam oder als Einzelbits Dout.0 bis Dout.3 angesprochen werden können. Die Eingänge E1 bis E4 werden in gleicher Weise als Eingangsport Din angesprochen.

 

40...4F: A = 0...15

 

51...5A: Ziel 1...9 = A

51: B = A

52: C = A

53: D = A

54: Dout = A

55: Dout.0 = A.0

56: Dout.1 = A.0

57: Dout.2 = A.0

58: Dout.3 = A.0

59: PWM = A

 

61...6A: A = Quelle 1...10

            61: A = B

            62: A = C

63: A = D

64: A = Din

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 Kap. 2.3. Das Programm wurde hier an die Adresse Null gesetzt und leicht erweitert. Hinzugekommen ist ein definierter Anfang mit dem Wert Null in der Variablen A. In Adresse 01 findet man einen Rechenbefehl, hier eine Erhöhung um Eins. Der Inhalt der Variablen A wird danach an den PWM-Ausgang und an den Ausgangsport übergeben.

 

Adresse

Befehl

Daten

Kommentar

00

4

0

A = 0

01

7

1

A = A + 1

02

5

4

Port = A

03

5

9

PWM = A

04

2

6

Warte 100 ms

05

3

4

Springe - 4

 

40 71 54 59 26 34

 

Listing 4.5: Erhöhen um Eins

 

Ein weiteres Beispiel wurde bereits in Kap 2.4 gezeigt. Die Daten kommen dabei vom Analogeingang AD1 und werden an den Ausgangsport und an den PWM-Ausgang übertragen. Das modifizierte Programm enthält noch einen zusätzlichen Rechenschritt, nämlich die Invertierung des Inhalts der Variablen A. Dadurch wird aus dem Wert 0000 der neue Wert 1111, d.h. aus Null wird 15 und umgekehrt. Eine ansteigende Eingangsspannung führt auf diese Weise zu einer absteigenden PWM-Ausgabe.

 

 

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 4.6: Invertieren

 

 

4.3 Sprünge und Verzweigungen

 

Bisher gab es nur einen einfachen Rücksprung (Befehl 3), der maximal 15 Adressen zurück reichte. 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. Damit hat man den Adressraum 0...255. Das ist mehr als benötigt wird, denn das EEPROM des Controllers fasst nur 128 Bytes, also den Bereich 00 bis 7F (dezimal 0 bis 127). Der Speicher ist damit praktisch in 8 Seiten, Seite 0 bis Seite 7 (Page 0...7) eingeteilt. Vor einem absoluten Sprung muss die Seite des Sprungziels festgelegt werden.

 

Zwei Zählschleifen mit den Variablen C und D führen ebenfalls absolute Sprünge aus, wobei ebenfalls zuvor die Seite der Adresse festgelegt werden muss.

 

Die bedingten Sprünge arbeiten als Skip-Befehle (Auslassen, Überspringen). Wenn die jeweilige Bedingung wahr ist, wird eine Adresse übersprungen. Dort könnte z.B. ein Sprungbefehl oder auch ein Rechenbefehl stehen. Als Bedingungen stehen Vergleiche zwischen A und B sowie direkte Bit-Abfragen des Eingangsports zur Verfügung.

 

Außerdem gibt es noch einen Unterprogramm-Aufruf (Call) und den dazugehörenden Rücksprung-Befehl (Return). Es sind zwar mehrere Unterprogramme erlaubt, aber aus einem Unterprogramm darf kein weiteres Unterprogramm aufgerufen werden, weil der Interpreter sich immer nur eine Rücksprungadresse merkt.

 

80 ... 8F: Adr-high = 0...15

 

90 ... 0F: Direkter Sprung (Jump) auf Adr-high, Adr-low (0...15)

 

A0 ... AF: Zählschleife C-mal Adr-high, Adr-low (0...15)

 

B0 ... BF: Zählschleife D-mal Adr-high, Adr-low (0...15)

 

C1 ... CF: Bedingter Sprung: Wenn (Bedingung 1...15) dann überspringe

C1: if A > B then Adr = Adr + 1

C2: if A < B then Adr = Adr + 1

C3: if A = B then Adr = Adr + 1

C4: if Din.0 = 1 then Adr = Adr + 1

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.3 = 0 then Adr = Adr + 1

CC: if S1 = 0 then Adr = Adr + 1

CD: if  S2 = 0 then Adr = Adr + 1

CE: if S1 = 1 then Adr = Adr + 1

CF: if S2 = 1 then Adr = Adr + 1

 

D0 ... DF:  Unterprogrammaufruf (Call) Adr-high, Adr-low (0...15)

 

E0 ... EF: Rücksprung vom Unterprogramm (Return)

 

 

Ein Beispiel für die Verwendung bedingter Sprungbefehle findet man im Beispielprogramm in Kap. 2.6. Es wurde hier leicht modifiziert an die Adresse Null gesetzt. Weil der obere Teil der Adresse (Adr-hi) im Ruhezustand Null ist, der Controller also auf der Seite 0 beginnt, muss der Befehl 80 hier nicht verwendet werden. Wieder wird die Länge eines Tastendrucks gemessen und angezeigt. Alle Wartebefehle wurden aus dem Programm entfernt, sodass es jetzt mit einer höheren Zeitauflösung arbeitet.

 

 

Adresse

Befehl

Daten

Kommentar

00

C

C

S1 = 0? 

01

3

1

Springe - 1

02

4

0

A = 0

03

7

1

A = A + 1

04

5

4

Port = A

05

C

E

S1 = 1?

06

3

3

Springe - 3

07

3

7

Springe - 7

 

CC 31 40 71 54 CE 33 37

 

Listing 4.7:  Reaktion auf die Taste S1

 

 

Der Sprungbefehl CC in Adresse 00 wertet den Zustand am Taster S1 aus. Im Ruhezustand ist S1 = 1, die Bedingung ist also nicht wahr und der Befehl in Adresse 01 wird nicht übersprungen. Dort steht ein relativer Sprungbefehl auf den Anfang. Das Programm wiederholt die Befehle in Adresse 00 und 01 solange, bis die Taste gedrückt wird. Dann wird die Bedingung wahr und die Adresse 01 wird übersprungen. Damit beginnt der eigentliche Messvorgang. Der Akku wird gelöscht und dann immer wieder um Eins erhöht und an die LEDs ausgegeben. An der Adresse 05 steht ein weiterer bedingter Sprungbefehl CE. Hier ist die Bedingung für das Überspringen eines Befehls S1 = 1. Da die Taste zunächst noch gedrückt ist, ist die Bedingung nicht wahr. Der Befehl in 06 wird also ausgeführt und führt zu einem Rücksprung nach 03. Erst wenn die Taste losgelassen wird, gelangt das Programm an die Adresse 07 und damit zu einem Rücksprung auf den Anfang.

 

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.

 

 

Adresse

Befehl

Daten

Kommentar

00

8

3

Seite 3 

01

9

4

Adresse = 34

 

83 94

 

Listing 4.8:  Absoluter Sprung zum Zeitmesser-Programm

 

Das ursprüngliche Beispielprogramm wird damit wieder aufgerufen. Testen Sie dies auch einmal für andere Beispiele. Eine komplette Übersicht aller einsetzbaren Programme finden Sie im Anhang.

 

 


4.4 Die Befehlstafel

 

Alle Befehle auf einen Blick, das vereinfacht die Arbeit mit dem Controller. Die folgende Tabelle enthält den gesamten Befehlsvorrat in kompakter Form.

 

 

 

1

2

3

4

5

6

7

8

9

A

B

C

D

E

 

Port=

Wait

Jump -

A=

 ... =A

 A= ...

  A= ...

Page

Jump

C*

D*

Skip if ...

Call

Ret

0

0

1 ms

0

0

 

 

 

0

0

0

0

 

0

 

1

1

2 ms

1

1

B=A

A= B

A=A+1

1

1

1

1

A>B

1

 

2

2

5 ms

2

2

C=A

A=C

A=A–1

2

2

2

2

A<B

2

 

3

3

10

3

3

D=A

A=D

A=A+B

3

3

3

3

A=B

3

 

4

4

20

4

4

Dout=A

A=Din

A=A–B

4

4

4

4

Din.0=1

4

 

5

5

50

5

5

Dout.0=A.0

A=Din.0

A=A*B

5

5

5

5

Din.1=1

5

 

6

6

100

6

6

Dout.1=A.0

A=Din.1

A=A/B

6

6

6

6

Din.2=1

6

 

7

7

200

7

7

Dout.2=A.0

A=Din.2

A=A And B

7

7

7

7

Din.3=1

7

 

8

8

500

8

8

Dout.3= A.0

A=Din.3

A=A Or B

 

8

8

8

Din.0=0

8

 

9

9

1 s

9

9

PWM=A

A=AD1

A= A Xor B

 

9

9

9

Din.1=0

9

 

A

10

2 s

10

10

 

A =AD2

A=Not A

 

A

A

A

Din.2=0

A

 

B

11

5 s

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