Einstieg
Der Vorteil von BASIC++ ist der einfache Einstieg für Anfänger in die Welt der Mikrocontroller. Diese Übersicht soll Ihnen einen kurzen Einstieg in die Programmierung mit BASIC++ geben. Wenn Sie die Referenz durchstöbern, werden Sie feststellen, dass dieser Einstieg nur einen kleinen Teil vom Leistungsvermögen von BASIC++ abdeckt.
Für einen tieferen Einblick sei auf das Buch "Messen, Steuern und Regeln mit C-Control M-Unit 2" in der 2. akt. Auflage vom Franzis' Verlag verwiesen (ISBN: 978-3772354885).
Inbetriebnahme
Bitte halten Sie sich bei der Inbetriebnahme an die original Beschreibung von Conrad Electronic (siehe Datenblätter). Beachten Sie, dass die C-Control mit TTL-Pegeln arbeitet. Schleißen Sie die RXD- und TXD-Anschlüsse des Controllers daher niemals direkt an die serielle RS232-Schnittstelle des PCs an. Für die korrekte Programmierung ist ein Schnittstellenbaustein, wie der MAX232 oder direkt der original Programmieradapter zu verwenden.
Übersicht
- Ausgabe über die serielle Schnittstelle
- Ausgabe auf ein LC-Display
- Aufnahme von Messwerten und Schalten von Ports
- Funktionen
Ausgabe über die serielle Schnittstelle
Machen Sie sich bitte mit der Programmierung der C-Control vertraut. Der Controller muss für das folgende Beispiel mit der seriellen Schnittstelle des Computer verbunden sein. Das Beispiel kann z.B. mit dem Hyperterminal getestet werden.
Im folgendem Beispiel wollen wir über die serielle Schnittstelle zehn mal den Inhalt einer Variablen i ausgeben, die dabei jedesmal um 1 inkrementiert wird. Die Ausgabe könnte also in etwa so aussehen:
012345678
Dazu definieren wir mit DEFINE zunächst eine Variable vom Typ Byte.
DEFINE i AS BYTE
Byte kann Zahlen zwischen 0 und 255 aufnehmen. Für größere (auch negative Zahlen) steht der Datentyp WORD bereit, der zwei Byte im Arbeitsspeicher belegt.
Die Ausgabe über die serielle Schnittstelle erfolgt mit der PRINT-Anweisung. Wir wollen den Wert von i mit Print ausgeben:
PRINT i
Um zehn mal den Wert von i ausgeben wollen, könnten wir nun zehn PRINT Anweisungen untereinander schreiben. Wir wollen aber gleichzeitig i bei jeder Ausgabe inkrementiert. Dann könnten wir nach jeder Print-Anweisung
i = i + 1
schreiben. Oder wir bedienen uns der komfortablen FOR-Schleife. Es handelt sich dabei um eine Zählerschleife, bei der wir den Start- und Endwert direkt vorgeben können. Die Schleife zählt dann die Variable i vom Start-Wert bis zum End-Wert aufwärts (inkrementiert also i direkt mit).
Das komplette Programm kann dann so aussehen:
DEFINE i AS BYTE ' Das ist ein Kommentar, der vom Compiler ' ignoriert wird. FOR i = 0 TO 10 PRINT i NEXT i
Ausgabe auf ein LC-Display
BASIC++ unterstützt die Extended-Objekte der C-Control I M-Unit 2.0 und der C-Control I Station 2.0. Damit lässt sich zum Beispiel sehr komfortabel Text auf einem LC-Display ausgeben. Wir verwenden dafür das LCD-Objekt und schreiben das obige Beispiel wie folgt um:
DEFINE i AS BYTE LCD.INIT FOR i = 0 TO 10 LCD.PRINT i NEXT i LCD.OFF
LCD.INIT sorgt dafür, dass die Print-Ausgabe auf das LC-Display umgeleitet wird. Mit LCD.OFF wird diese Umleitung wieder aufgehoben.
Aufnahme von Messwerten und Schalten von Ports
Mit DEFINE können wir nicht nur Variablen für den Arbeitsspeicher definieren, sondern auch eine Verbindung zur Peripherie wie A/D-Eingänge oder Ports herstellen. Für A/D-Eingänge wählen wir dabei den Datentyp AD. Für Digitalports den Typ PORT.
Im folgendem Beispiel gehen wir davon aus, dass an den A/D-1-Eingang (die C-Control hat 8 A/D-Eingänge) ein Thermometer und am Port 1 (die C-Control hat 16 Ports) ein Lüfter angeschlossen ist. Ein A/D-Eingang hat eine Auflösung von 8 Bit, kann also 256 Zustände von 0 bis 255 darstellen. Gehen wir davon aus, der Wert 0 des A/D-Eingang würde einer Temperatur von -20 °C entsprechen. Der Wert 1 könnte dann z.B. -19 °C entsprechen. Beim Wert 255 würden wir also eine Temperatur von 235 °C messen.
In unserem Beispiel soll die Temperatur "gemessen" und per Print ausgegeben werden. Zusätzlich soll ein an Port 1 angeschlossener Lüfter ab einer Temperatur von 100 °C (entspricht dann also dem AD-Wert 120) eingeschaltet und bei tieferen Temperaturen ausgeschaltet werden.
Das Beispiel sieht dann so aus:
DEFINE Temperatur AS AD[1] DEFINE Luefter AS PORT[1] Luefter = OFF ' Lüfter zunächst ausschalten DO ' Eine Endlosschleife; das Programm soll ja ' nicht irgendwann zuende sein PRINT "Temperatur: " & (Temperatur - 20) & " C" IF Temperatur < 120 THEN Luefter = OFF ELSE Luefter = ON END IF LOOP
Eine Endlosschleife (siehe DO) sorgt dafür, dass das Programm immer weiter ausgeführt wird. Würden wir DO ... LOOP auskommentieren, so würde PRINT und der IF ... ELSE ... END IF Block (siehe IF) nur einmal ausgeführt werden und der Controller danach das Programm beenden.
Anders als bei Variablen im Arbeitsspeicher müssen bei Hardware-Resourcen in der DEFINE Anweisungen die so genannten OFFSETs (also der jeweilige A/D- oder PORT-Eingang) in eckigen Klammern ausgewählt werden. Das ist auch bei Variablen für den Arbeitsspeicher möglich, sollte von Anfängern allerdings erstmal noch nicht verwendet werden.
Funktionen
Programmteile, die immer wieder aufgerufen werden können in Funktionen bzw. Unterprogrammen gekapselt werden. Dazu verwendet man den FUNCTION-Block. Wie in der Mathematik können Funktionen auch Werte zurückgeben (siehe RETURN).
Wir wollen das obige Beispiel so umbauen, dass jetzt die Messung des A/D-Werts mit einer Funktion ausgewertet und dort auch die Temperatur durch Herausrechnen des 20 °C-Offsets realisiert wird. Dazu wird der A/D-Wert der Funktion als Parameter Temp übergeben:
FUNCTION TemperaturMessen(Temp AS BYTE) TemperaturMessen = Temp - 20 END FUNCTION
Dann erhalten wir für unser Beispiel-Programm:
DEFINE Temperatur AS AD[1] DEFINE Luefter AS PORT[1] Luefter = OFF ' Lüfter zunächst ausschalten DO PRINT "Temperatur: " & TemperaturMessen(Temperatur) & " C" IF TemperaturMessen(Temperatur) < 100 THEN Luefter = OFF ELSE Luefter = ON END IF LOOP FUNCTION TemperaturMessen(Temp AS BYTE) TemperaturMessen = Temp - 20 END FUNCTION
Temp ist dabei eine lokale Variable der Funktion TemperaturMessen, die nur innerhalb dieser Funktion und nicht im Hauptprogramm (z.B. in der DO-Schleife) gültig ist.