Bedienungsanleitung
Version 1.2


Erstellt ab 6. Juni 2012
von Dietmar Harlos
letztes Update: 10. November 2017



Vorwort

Die vorliegende Bedienungsanleitung soll den Umgang mit der Open-Macro und der neuen Open-Maxi erleichtern. Der größte Teil beschäftigt sich mit der Programmierung im neuen OCBASIC-Dialekt. Zunächst beginnen wir aber mit der Beschreibung, was die OM eigentlich ist und wie sie entstanden ist. Da die Open-Macro und Open-Maxi maßgeblich zur C-Control Version 1.1 kompatibel sind, kann auch die Bedienungsanleitung zur C-Control zur Hand genommen werden.

Die Dokumentation besteht aus einer einzigen HTML-Seite, die dementsprechend unkompliziert ausgedruckt oder in ein anderes Dateiformat (wie DOC, PDF, PS, HLP, etc.) konvertiert werden kann. Es läßt sich auch sehr einfach nach einem Stichwort mittels Ctrl+F, bzw. Strg+F suchen. Um schneller in die einzelnen Hauptkapitel zu gelangen, wird in Frame-fähigen Internetbrowsern am linken Rand ein Menü angezeigt. Jeder Internetbrowser formatiert diese Dokumentation etwas anders. Die beste Formatierung wird mit dem Internet Explorer erzielt.

Diese Bedienungsanleitung ist nicht perfekt. Wer möchte, kann die Anleitung um zusätzliche Kapitel ergänzen oder die vorhandenen Erklärungen erweitern. Dann aber nicht diese HTML-Datei editieren, sondern mir den Text in einer E-Mail zusenden.














































Das Open-Micro-Projekt

Das OM-Projekt wurde von Dietmar Harlos ins Leben gerufen, um eine Alternative zur C-Control/Micro und einen würdigen Nachfolger für die C-Control I Version 1.1 M-Unit anzubieten. Das Ziel dieses Projektes ist es, unkompliziert zu programmierende Controller zu entwickeln, die weitgehend kompatibel zur C-Control/Micro und zur C-Control I Version 1.1 M-Unit sind, aber gleichzeitig einen deutlich größeren Funktionsumfang besitzen. Außerdem wurde großen Wert auf Fehlerfreiheit und gute Dokumentation gelegt. Als Ergebnis ist die Open-Micro entstanden. Und so ganz nebenbei entstand die Open-Mini gleich mit dazu. Diese beiden Controller unterscheiden sich nur von der Anzahl der zur Verfügung stehenden Ports. Die Open-Midi ist die große Schwester der Open-Mini. Denn sie ist maßgeblich kompatibel zu den bisherigen OM-Controllern, bietet jedoch deutlich mehr Speicher. Die Open-Macro unterstützt 16 Bit Handling und die Open-Maxi ist - soweit sinnvoll und möglich - in Hard- und Software abwärtskompatibel zur weitverbreiteten C-Control I Version 1.1 M-Unit, unterstützt aber gleichzeitig viele Features der bisherigen OM-Mikrocontroller.

Als Basis für die Open-Micro wurde wie auf der Original-Micro ein 68HC908QT4 von Freescale (früher Motorola) im PDIP-8-Gehäuse verwendet. Die Open-Mini basiert auf einem 68HC908QY4-Controller in PDIP-16. Somit stehen auf der Open-Micro 6 Ports und auf der Open-Mini 14 Ports zur Verfügung, die mehrfach belegt sind. Die Open-Midi und Open-Macro basieren auf dem 68HC908QB8, der die gleiche Gehäuseform und Pinbelegung wie die Open-Mini hat. Die Open-Maxi basiert auf der Open-Control M-Unit-Hardware von CCTools, die pinkompatibel zur C-Control I Version 1.1 M-Unit ist. Sie ist mit dem HCS08-Mikrocontroller MC9S08AW60 bestückt. Auf der Open-Maxi stehen deshalb über 24 I/O-Ports, 8 AD-Ports, 2 Frequenzmeßeingänge, 2 PWM-Analogausgänge, BEEP, TEST, eine herausgeführte Referenzspannung für den AD-Wandler und andere Features gleichzeitig zur Verfügung.

Das "Open" im Namen symbolisiert, daß diese Controller nicht verschlossen sind wie die Original-Micro, sondern im Gegenteil offen für einen einfachen Einstieg in die Welt der 68HC08er. Es sind alle Controller-Ressourcen nutzbar und es können unter anderem eigene Assembler-Routinen entwickelt und sehr komfortabel in das BASIC-Programm eingebunden werden. Es ist sogar möglich, ein Betriebssystem-Update durchzuführen. Damit können auch ältere OMs immer auf den neuesten Stand gehalten werden, um neue Features nutzen zu können.

Die OM-Mikrocontroller



Das Bild zeigt links die Open-Micro, rechts die Open-Mini und in der Mitte die neue Open-Control M-Unit mit dem Open-Maxi-Betriebssystem. Die Open-Midi und Open-Macro haben die gleiche Gehäuseform und Pinbelegung wie die Open-Mini.

Die Betriebssysteme der OM-Controller wurden auf geringe Größe bei maximalem Funktionsumfang optimiert, um mehr Platz für Anwenderprogramme zu schaffen. Auf den kleinen OM-Controllern Open-Micro, Open-Mini, Open-Midi und Open-Macro stehen bis zu 6462 Byte zur Programmspeicherung zur Verfügung. Aber die Open-Maxi bietet mit 58782 Byte den größten Programmspeicher. Darüber hinaus gibt es die Möglichkeit, den speziell an die OM-Controller angepaßten Open-Control/BASIC-Compiler zu verwenden, der durch Verwendung neuer Tokenbefehle die Programmgröße um typisch 20% reduziert. Der große Vorteil von OCBASIC ist die hohe Kompatiblität zu CCBASIC. Der auf der Open-Micro und Open-Mini zur Variablenspeicherung zur Verfügung stehende RAM-Speicher ist 64 Byte groß, wobei einige Betriebssystemfunktionen abgeschaltet werden können und so der Speicher auf mehr als 80 Byte ausgedehnt werden kann. Die Open-Midi bietet Anwendungen sogar über 170 Byte Variablenspeicher. Und die Open-Maxi 512 Byte - mit PEEK und POKE sogar über 1800 Byte.

Die Taktung wird bei den kleinen OM-Controllern standardmäßig intern durchgeführt, wodurch keine Pins am Controller belegt werden. Mit externer Taktung sind bis zu 8 MHz Bustakt möglich. Den höchsten Takt bietet die Open-Maxi mit 20 MHz Bustakt. Die OM-Controller sind deshalb 16 bis über 100 mal schneller als die Original-C-Control!

Interessant an den OM-Controllern ist vor allen Dingen, daß ein Anfänger seine ersten Programme in einfachstem BASIC schreiben kann, um sich dann nach und nach tiefer in die 68HC08-Materie einzuarbeiten. Man darf sich von den geringen Ausmaßen nicht täuschen lassen: Es handelt sich um vollwertige Mikrocontroller und durch die Möglichkeit der Programmierung in Assembler steht der gesamte Controller offen.

Die Vorteile der Open-Macro

Die Vorteile der Open-Maxi

Handhabung der OM-Controller

Die Versorgungsspannung

Auf keinen Fall darf die OM direkt mit 230 Volt Netzspannung verbunden werden. Es ist ausschließlich eine Schutzkleinspannung zu verwenden.

Die Open-Macro arbeitet mit einer stabilisierten Versorgungsspannung von 5 Volt +/- 0,4 Volt. Ein keramischer 100-nF-Kondensator, so nah wie möglich an die Versorgungsspannungs-Pins der OM, verbessert einige elektrische Eigenschaften des Controllers. Des weiteren ist Port[3] sehr empfindlich gegenüber elektromagnetischen Störungen. Aus diesem Grund sollte immer eine Z-Diode 5,1 V an Port[3] gegen Masse mit eingebaut werden. Alternativ läßt sich Überspannung auch mittels herkömmlicher Diode 1N4148 nach VDD (5 Volt) ableiten. Die Versorgungsspannung ist zugleich die Referenzspannung für den Analog-Digital-Umsetzer. Aus diesem Grund sollte die Versorgungsspannung möglichst stabil sein und wenig "Brumm" enthalten.

Die Open-Maxi benötigt eine stabilisierte Versorgungsspannung zwischen 4,4 und 5,5 Volt. Das Betriebssystem ist so konfiguriert, daß der Controller bei einer geringeren Spannung als typisch 4,3 Volt resettet wird. Vorsichtig sein sollte man mit zu hoher Versorgungsspannung. Laut Controllerhersteller kann der AW60 Schaden nehmen, wenn mehr als 5,8 Volt an die Betriebsspannungspins angelegt wird. Die Versorgungs- und Referenzspannung für den Analog-Digital-Umsetzer ist nach außen geführt, kann aber mit zwei Jumpern auf die normalen 5 Volt gelegt werden. Die M-Unit ist mit fünf 100 nF Kondensatoren und einem 47 µF Elko großzügig entkoppelt.

Die Programmierung

Die OM ist in OCBASIC, CCBASIC, mBasic, Basic++, CCPLUS und Assembler programmierbar. Sie ist also sehr kompatibel zu vorhandenen Programmiersprachen und Tools, die bereits zum Programmieren der C-Control-1 verwendet werden. Welche man davon einsetzt, bleibt jedem selber überlassen. Es wurde aber extra für die OM der neue BASIC-Compiler OCBASIC entwickelt, der das ganze Potential der OM ausschöpft. In dieser Anleitung wird ausschließlich auf OCBASIC näher eingegangen. Da der OCBASIC-Dialekt auf der CCBASIC-Syntax basiert, sollte es keine Schwierigkeiten bereiten, die beschriebenen Codesegmente an CCBASIC für Windows, CCBASIC für DOS oder CCBASIC für Linux anzupassen.

Pinbelegung der Open-Macro


Funktionen der Pins

Serielle Schnittstelle
An diesem Port liegt die Serielle Schnittstelle (RS232), über die Daten eingelesen und ausgegeben werden können. Außerdem wird die OM über diesen Port programmiert. Die Serielle Schnittstelle belegt also nur noch einen Port. Mit Hilfe eines kleinen Interfaces für Semi-Dual-Wire-RS232 verhält sich diese Schnittstelle allerdings genauso, wie eine herkömmliche RS232 mit den zwei Leitungen RXD und TXD. Die Open-Macro besitzt außerdem noch eine hardwaremäßig implementierte 2. Serielle Schnittstelle (ESCI), die vom Betriebssystem unterstützt wird (siehe UseEsci). Die TXD-Leitung der ESCI liegt am PORT[14] und RXD am PORT[13].

PORT[Nummer]
Hierbei handelt es sich um einen digitalen Port. Diese Ports können die Zustände ON (-1) und OFF (0) annehmen. Jeder Port kann als Eingang oder Ausgang fungieren. PORT[3] ist allerdings nur als Eingang zu verwenden und bei dessen Beschaltung ist zu beachten, daß dieser Port zugleich als HOST/RUN-Pin dient. Nach einem Reset muß dieser Pin auf High-Potential (5 Volt) liegen, sonst arbeitet der Controller das Anwenderprogramm nicht ab, sondern geht in den Hostmodus. Mittels Hostmodus lassen sich über die Serielle Schnittstelle Anwenderprogramme in den Controller übertragen.

AD[Nummer]
Hierbei handelt es sich um einen Analog-Digital-Port. Analoge Spannungen lassen sich in digitale Werte umsetzen. Ein AD-Port kann nur als Eingang verwendet werden und Werte zwischen 0 (0 Volt) und 255 (5 Volt) annehmen.

BEEP
An jedem dieser Ports kann ein Rechtecksignal mit unterschiedlicher Frequenz ausgegeben werden. Durch Anschluß eines Piezo-Schallwandlers (ohne Elektronik) wird ein Ton erzeugt. Es ist normalerweise nicht möglich, daß mehrere BEEP-Ports gleichzeitig einen Ton ausgeben.

FREQ1
Mit diesem Port kann eine Frequenz gemessen werden. Es findet eine Impulszählung statt. Die Fensterbreite ist auf 1 Sekunde festgelegt. Die Frequenzmessung ist nach Programmstart deaktiviert (siehe FREQ). Durch ein entsprechendes Assemblermodul können auch andere Pins zur Impulszählung verwendet werden.

IRQ
Es kann eine Assembler- oder BASIC-Interruptroutine gestartet werden, sobald an diesem Pin eine High-Low-Flanke detektiert wird. Die Interruptfunktionalität ist nach Programmstart deaktiviert.

Pinbelegung der Open-Maxi


Bild der älteren Version der Open-Maxi

Funktionen der Pins

PORT[Nummer]
Hierbei handelt es sich um einen digitalen Port. Diese Ports können die Zustände ON (-1) und OFF (0) annehmen. Jeder Port kann als Eingang oder Ausgang fungieren.

AD[Nummer]
Hierbei handelt es sich um einen Analog-Digital-Port. Analoge Spannungen lassen sich in digitale Werte umsetzen. Ein AD-Port kann nur als Eingang verwendet werden und Werte zwischen 0 (0 Volt) und 255 (5 Volt) annehmen. Der AD-Wandler bietet wahlweise gerundete 10 Bit oder gerundete 8 Bit.

SDA und SCL
An diesen beiden Pins ist der I²C-Bus nach außen geführt.

START
Nach einem Reset muß dieser Pin auf Low-Potential (0 Volt, Masse) liegen, sonst arbeitet der Controller das Anwenderprogramm nicht ab, sondern geht in den Hostmodus. Mittels Hostmodus lassen sich über die Serielle Schnittstelle Anwenderprogramme in den Controller übertragen. Es befindet sich auch ein AUTOSTART-Jumper auf der Platine, mit dem sich dieser Pin auf Masse legen läßt.

FREQ1 und FREQ2
Mit diesen Ports kann eine Frequenz gemessen werden. Es findet eine Impulszählung statt. Die Fensterbreite ist auf 1 Sekunde festgelegt.

DA[1] und DA[2]
Zwei PWM-Analogausgänge mit 8 Bit Auflösung und 2441 Hz PWM-Frequenz. Damit lassen sich analoge Spannungen erzeugen. Andere Auflösungen und PWM-Frequenzen lassen sich leicht einstellen. Es ist sehr einfach, an diesen beiden Ausgängen ein Servo-Signal auszugeben.

IRQ
Es kann eine Assembler- oder BASIC-Interruptroutine gestartet werden, sobald an diesem Pin eine High-Low-Flanke detektiert wird. Die Interruptfunktionalität ist nach Programmstart aktiviert.

RESET
Durch Legen dieses Pins auf Masse wird der Controller resettet.

RXD, TXD, CTS und RTS
An diesen Pins liegt die Serielle Schnittstelle (RS232), über die Daten eingelesen und ausgegeben werden können. Außerdem wird die Open-Maxi über diese Schnittstelle programmiert. Um ein Programm über die Serielle Schnittstelle in die Open-Maxi zu übertragen, benötigt man einen Pegelumsetzer wie den MAX232, der die 5-Volt-Signale der M-Unit auf die +/- 12 Volt des PCs umsetzt und invertiert. So ein Pegelumsetzer ist zum Beispiel auf dem Programmieradapter "950602" von Conrad Electronic vorhanden. Dieser Programmieradapter ist eigentlich für die C-Control I Version 1.1 M-Unit entworfen worden, kann aber auch mit der Open-Maxi betrieben werden, da sie pinkompatibel ist. Optional läßt sich an der Seriellen Schnittstelle Hardware-Handshake (CTS und RTS) aktivieren.

UREF
Die Referenzspannung für den AD-Wandler. Es befindet sich ein Jumper auf der Platine, mit dem dieser Pin auf 5 Volt gelegt werden kann.

BEEP
An diesem Pin kann ein Rechtecksignal mit unterschiedlicher Frequenz ausgegeben werden. Durch Anschluß eines Piezo-Schallwandlers (ohne Elektronik) wird ein Ton erzeugt. Der BEEP-Ton kann wie auf der C-Control I Version 1.1 parallel zur Programmausführung ausgegeben werden. Allerdings ist die Tonfrequenz um 25% höher.

TEST
Mit diesem Pin kann der Anwender testen, ob der "20-ms-Interrupt" korrekt arbeitet. Es wird ein Rechtecksignal mit 25 Hz Frequenz ausgegeben.

RUN-, ACTIVE- und DCF-OK-LEDs
Die RUN-, ACTIVE- und DCF-OK-LEDs werden vom Betriebssystem gesetzt. Die LEDs sind wie auf der C-Control I Version 1.1 low-aktiv und können mit Vorwiderstand zwischen diesen Pins und 5 Volt geschaltet werden.

VDDAD
Die Spannungsversorgung für den AD-Wandler ("VDDAD") ist separat herausgeführt. Wenn der Anwender dieses Feature nicht benötigt, muß er einen Jumper aufsetzen. Der Jumper muß zwischen VDDAD und 5 Volt gesetzt werden.

AUTOSTART-Jumper
Der AUTOSTART-Jumper liegt rechts von PORT[3] und PORT[4] und mit ihm kann der START-Pin auf Masse gelegt werden. Dadurch startet die Open-Maxi nach Reset und nach END automatisch das Anwenderprogramm. Während der Programmerstellung sollte der Jumper nicht gesetzt werden. Das ist auch nicht notwendig, da die Open-Maxi über die Serielle Schnittstelle gestartet werden kann.

UREF-Jumper
Der UREF-Jumper liegt rechts von BKGD und RESET und mit ihm kann die Referenzspannung für den AD-Wandler auf 5 Volt gelegt werden.

VDDAD-Jumper
Die Spannungsversorgung für den AD-Wandler ("VDDAD") ist separat herausgeführt. Wenn der Anwender dieses Feature nicht benötigt, muß er einen Jumper aufsetzen. Der Jumper muß zwischen die Pins VDDAD und 5 Volt gesetzt werden.

RXD2, TXD2, CTS2 und RTS2
Die Pins für die zweite Serielle Schnittstelle (SCI1-Modul) vom Controller. Sie werden vom Open-Maxi-Betriebssystem nicht benutzt und sind für zukünftige Anwendungen reserviert. Sie können zur Zeit vom Anwender frei verwendet werden.

SS, MISO, MOSI und SPSCK
Die Pins für das "Serial Peripheral Interface" (SPI-Modul) vom Controller. Sie werden vom Open-Maxi-Betriebssystem nicht benutzt und sind für zukünftige Anwendungen reserviert. Sie können zur Zeit vom Anwender frei verwendet werden.

PORT[35] & SERVO1
Mit einem zusätzlichen Assemblermodul kann an diesem Pin ein Servo-Signal ausgegeben werden. Dieser Port wird vom Open-Maxi-Betriebssystem nicht benutzt und kann vom Anwender frei verwendet werden.

PORT[36] & SERVO2
Mit einem zusätzlichen Assemblermodul kann an diesem Pin ein Servo-Signal ausgegeben werden. Dieser Port wird vom Open-Maxi-Betriebssystem nicht benutzt und kann vom Anwender frei verwendet werden.

PORT[53] & KEYB
Dieser Port wird vom Open-Maxi-Betriebssystem nicht benutzt und ist für zukünftige Anwendungen reserviert. Er kann zur Zeit vom Anwender frei verwendet werden.

PORT[19] & MCLK
Dieser Port wird vom Open-Maxi-Betriebssystem nicht benutzt und ist für zukünftige Anwendungen reserviert. Er kann zur Zeit vom Anwender frei verwendet werden.

BKGD
Das "Single-Wire Background Debug Interface" des AW60-Controllers.

Einfache Programmierschaltung für Open-Macro

Hier ein Schaltplan für eine einfache, vielbewährte Programmierschaltung mit Semi-Dual-Wire-RS232 für die Open-Micro, die aber auch mit der Open-Macro verwendet werden kann. Sie ist sowohl zur Übertragung von Anwenderprogrammen als auch zum Datenaustausch (mittels PRINT, INPUT, etc.) geeignet. Als Transistoren können alle Standard-Kleinsignal-NPN-Typen wie beispielsweise BC547B verwendet werden. Die Werte der Widerstände sollten jedoch nicht verändert werden. Die Schaltung ist mit PORT[1] der OM verbunden. Der Schalter S1 ist der Hostmodeschalter. In Stellung "HOST" verbindet er PORT[3] mit Masse. In Stellung "RUN" wird dieser Port über den Pull-Up-Widerstand R1 auf High-Potential gelegt. Die Schaltung wird mittels Nullmodemkabel an die Serielle Schnittstelle (RS232) eines PCs angeschlossen. Es kann das Nullmodemkabel der C-Control-1 verwendet werden.

Zur bequemen Programmentwicklung sollte das zweite PE-Board oder das Starterboard von CCTools verwendet werden, da es viel umfangreicher ist und eine bessere Testumgebung bietet. Auf diesen Boards wird der Portzustand mittels LEDs angezeigt, die über Porttreiber (4049 oder 4050) versorgt werden und daher, anders als beim Board von Conrad Electronic, nicht die Ports belasten.



Größeres Bild

Programmieradapter für Open-Maxi

Um ein Anwenderprogramm über die Serielle Schnittstelle in die Open-Maxi zu übertragen, benötigt man einen Pegelumsetzer wie den MAX232, der die 5-Volt-Signale der M-Unit auf die +/- 12 Volt des PCs umsetzt und invertiert. So ein Pegelumsetzer ist zum Beispiel auf dem Programmieradapter "950602" von Conrad Electronic vorhanden. Dieser Programmieradapter ist eigentlich für die C-Control I Version 1.1 M-Unit entworfen worden, kann aber auch mit der Open-Maxi betrieben werden, da sie pinkompatibel ist. Leider bietet Conrad diesen Adapter nicht mehr an, aber viele C-Control-Anwender werden ihn sicherlich noch besitzen.

Hier ein Bild von diesem C-Control BASIC M-Adapter:



Conrad Electronic bietet unter der Bestellnummer "198834" einen "M-Unit Programmer für CCI-2.0" an, der über eine 5-polige Buchse zum direkten Anstecken einer Open-Maxi verfügt. Allerdings ist er mit RS232-Anschluß schon fast 30 EUR teuer, mit USB ("198318") fast 40 EUR.

Einige Betatester haben gute Erfahrungen mit dem 15 EUR teuren Voltcraft USB-Programmierkabel "197339" von Conrad Electronic gemacht. Der 4-polige Programmierstecker ist sehr kompakt und stellt auch 5 Volt aus dem USB bereit, womit Schaltungen geringer Stromaufnahme direkt aus dem Programmierkabel versorgt werden können. Die Pegel von RXD und TXD sind direkt CMOS-kompatibel. Allerdings ist der Stecker nicht zur 5-poligen Steckerleiste der Open-Maxi kompatibel, und das Kabel ist mechanisch etwas steif.



Das Bild zeigt den von Jens Gürtler entwickelten preiswerten USB-Programmieradapter für die Open-Maxi auf Basis des FT232R. Wer sich zutraut, SMD zu löten (SSOP28), kann sich diesen Adapter aufbauen. Siehe Schaltbild. Die Treiber für alle gängigen Betriebssysteme kann man bei FTDI herunterladen. Wer bei Reichelt bestellt, kann den Programmer für unter 4 EUR herstellen. Die notwendigen Dateien für Target 3001! gibt es in diesem ZIP-Archiv.

Bei USB-nach-seriell-Adaptern mit FTDI-Chip kann die Übertragungsgeschwindigkeit bedeutend erhöht werden, indem im Geräte-Manager die Wartezeit bei den BM-Einstellungen auf 1 ms gesetzt wird. Reichelt bietet so einen Adapter unter der Bestellnummer "DELOCK 61425" an. Damit wird unter Windows 7 ein maximal großes Programm in unter 12 Sekunden übertragen.

Die aufgeführten Programmieradapter sind sowohl zur Übertragung von Anwenderprogrammen als auch zum Datenaustausch (mittels PRINT, INPUT, etc.) geeignet. Allerdings erreicht man meist nur mit einer "richtigen" Seriellen Schnittstelle die kürzesten Übertragungszeiten. Mit einem USB-nach-seriell-Wandler benötigt die Übertragung üblicherweise mehr Zeit.

Programmieren in OCBASIC

Die Beschreibung der Befehle und reservierten Wörter in den folgenden Kapiteln bezieht sich auf den OCBASIC-Compiler. Wird ein anderer Compiler verwendet, gibt es eventuell Einschränkungen bei den Befehlen, bzw. einige Befehle stehen nicht mehr zur Verfügung oder werden anders realisiert. Welche Programmiersprache, bzw. welcher BASIC-Dialekt verwendet wird, bleibt aber natürlich jedem selbst überlassen.

Beschreibung

Da das Copyright zu CCBASIC bei Conrad Electronic liegt, wurde während des OM-Projekts der "Open-Control/BASIC-Compiler" entwickelt. Der Compiler ist (soweit sinnvoll) 100% kompatibel zur CCBASIC-Syntax, bietet aber trotzdem viele neue Features wie beispielsweise mehrzeiliges als auch einzeiliges IF, WHILE..WEND, REPEAT..UNTIL, Funktionen und Subroutinen (Prozeduren) in Standardsyntax. Außerdem gibt es eine neue Syntax, mit der BIT-Variablen nicht mehr auf festen Positionen im User-RAM gespeichert werden müssen, sondern innerhalb von BYTE- oder WORD-Variablen als "Bitarrays" abgelegt werden können. Dadurch müssen keine Variablen mehr an festen Positionen plaziert werden. Der Compiler besitzt sogar einen integrierten 6808-Assembler. Damit können BASIC- und Assemblerroutinen innerhalb derselben Sourcecode-Datei erstellt werden. Assemblerroutinen sind so deutlich komfortabler zu erstellen, da in Assembler auf vom Anwender definierte Variablen und auf die meisten internen Variablen direkt zugegriffen werden kann. Assemblerroutinen lassen sich von BASIC aus auf die gleiche Weise aufrufen wie BASIC-Routinen.

Standardmäßig wird Tokencode erzeugt, der die neuen Befehle der OM nutzt und auf diese Weise die Programmgröße um typisch 20% reduziert. Es ist aber auch möglich, zu bisherigen C-Control-Versionen kompatiblen Tokencode mit bis zu 64 KB Größe zu erzeugen. Der Compiler kann statt CCBAS.EXE in die DOS-IDE oder in ConTEXT eingebunden werden.

Es wurde einige Zeit ins Austesten gesteckt und insbesondere darauf geachtet, daß der Compiler möglichst sinnvolle Meldungen ausgibt, falls während der Kompilierung Fehler auftreten. Der Compiler hat eine ausführliche Betatestphase durchlaufen und die offiziell erste Version wurde anhand diverser Beispielprogramme vor der Veröffentlichung ausführlich getestet.

Entwicklungsumgebungen (IDEs) für OCBASIC

Der Compiler besteht aus der Datei OCBAS.EXE, die sich in beliebige integrierte Entwicklungsumgebungen (IDEs), wie zum Beispiel ConTEXT oder die DOS-IDE von C-Control/BASIC anstelle des C-Control/BASIC-Compilers CCBAS.EXE einbinden läßt. Die IDE stellt einen Texteditor bereit, mit dem der BASIC-Quellcode erstellt und verändert werden kann. Mit einem einfachen Tastendruck läßt sich jederzeit der Compiler starten, der den Quellcode in Tokencode übersetzt. Mit einem ebenfalls in die IDE eingebundenen Downloadprogramm kann dieser Tokencode zum Controller übertragen werden.

Wie die ConTEXT-IDE in eine Entwicklungsumgebung für die Open-Micro, Open-Mini, Open-Midi, Open-Macro und Open-Maxi umfunktioniert werden kann, wird in dieser Dokumentation bei Tips und Tricks ausführlich beschrieben. Für erste Versuche kann der Compiler natürlich auch zunächst auf der MS-DOS-Eingabeaufforderung benutzt werden. In jedem Fall erhält OCBAS.EXE als Eingabe eine BAS-Datei mit dem BASIC-Quellcode und gibt eine DAT-Datei mit dem Tokencode aus. Diese DAT-Datei kann mit einem Downloadtool wie OMDLWIN.EXE, OMDL.EXE oder CCDL.EXE zur OM geschickt werden.

Es gibt zwei Varianten des Compilers: Einmal die 16-Bit-Version OCBAS.EXE und die 32-Bit-Version OCBAS32.EXE. Nur die 32-Bit-Variante ist zu allen Windows-Betriebssystemen kompatibel und sollte deshalb vorzugsweise verwendet werden.

Beim 16-Bit-Compiler OCBAS.EXE handelt es sich um ein DOS-Programm, das auch auf älteren Rechnern benutzbar ist. Aus Kompatiblitätsgründen können dem Programm aber nur kurze DOS-Dateinamen übergeben werden. Die Windows-Betriebssysteme unterstützen das auch bei Dateien mit langem Namen, indem sie jede Datei ebenfalls über einen DOS-Dateinamen ansprechbar machen. Die unter Windows angelegte Datei "Dateiname.bas" kann zum Beispiel mittels "CCBAS datein~1.bas" fehlerfrei übersetzt werden. In der ConTEXT-IDE läßt sich eine Option für kurze DOS-Dateinamen aktivieren. Innerhalb ConTEXT dürfen Quellcode-Dateien daher auch lange Dateinamen besitzen.

Hierarchie der Operatoren

Die Berechnung eines Terms, in dem mehrere Operatoren verwendet werden, erfolgt in einer bestimmten Reihenfolge. Sehr bekannt ist die Hierarchie "Punktrechnung vor Strichrechnung". Der Programmierer kann die Reihenfolge durch Verwendung von Klammern genau festlegen. Auf die Klammerung kann verzichtet werden, wenn die gewünschte Reihenfolge mit der Operatoren-Rangfolge übereinstimmt. Das sollte man aber genau prüfen und im Zweifelsfall besser eine Klammer zuviel setzen.

RangOperatorBeschreibung
8( )Klammern
7+ -positives und negatives Vorzeichen
6* / MOD SHL SHRMultiplikation, Division, Restwert und Schiebebefehle
5+ -Addition und Subtraktion
4= == <> > >= < <=numerischer Vergleich
3NOTlogisches Vorzeichen
2AND NANDlogisches UND
1OR NOR XORlogisches ODER

In einem Term mit mehreren Operatoren werden zuerst die Operationen durchgeführt, die einen hohen Rang besitzen und in der Tabelle am Anfang stehen. Erst danach werden die Rechenergebnisse mit den weiter unten stehenden Operatoren weiterverarbeitet. Die Rangfolge der Operatoren von OCBASIC entspricht exakt denen von CCBASIC.

Beispiel

Von C-Control-kompatiblen Controllern werden Berechnungen grundsätzlich mit Hilfe eines sogenannten Rechenstacks durchgeführt, der Platz für maximal 7 Elemente bietet. Damit läßt sich das Ergebnis selbst komplexer Terme errechnen. Falls jedoch sehr verschachtelte Ausdrücke berechnet werden müssen, kann der Stack unbemerkt überlaufen, wodurch auf dem Stack gespeicherte Werte verlorengehen. Das berechnete Ergebnis ist dann fehlerhaft. In der Praxis treten Stacküberläufe jedoch so gut wie nie auf, weil komplexe Terme nur sehr selten vorkommen. Das folgende Beispiel benötigt alle 7 Stackelemente, da die einzelnen Berechnungen aufgrund des höheren Rangs nachfolgender Operatoren bis zum Schluß hinausgezögert werden.

Beispiel

Sprungziele (#)

Sprungziele ("Labels") markieren bestimmte Punkte in der Folge der Programmoperationen. Labels sind Ziele der Sprungoperationen GOSUB und GOTO innerhalb eines Algorithmus. In OCBASIC stehen Labels am Anfang einer Zeile und beginnen wie in CCBASIC stets mit einem Doppelkreuz, dann folgt (ohne Leerzeichen) der Bezeichner des Labels. Zu beachten ist, daß OCBASIC etwas strengere Regeln als CCBASIC für gültige Labelnamen besitzt.

Das folgende Beispiel demonstriert eine Endlosschleife. Wenn man mehrere Labels erstellt, dann kann man im Programm von Label zu Label springen und das BASIC-Programm auf diese Weise verzweigen. Es ist sinnvoll, dem Label einen ausdrucksstarken Namen zu geben, um die Programmübersicht zu wahren.

In OCBASIC kann in vielen Fällen auf Labels und die Befehle GOTO und GOSUB verzichtet werden, weil hinter IF..THEN mehr als ein Befehl angegeben werden darf und die neuen Schleifenbefehle WHILE..WEND und REPEAT..UNTIL existieren. Außerdem lassen sich Funktionen mittels FUNCTION und Subroutinen mittels PROCEDURE definieren. Aber trotzdem wird weiterhin die bekannte und im folgenden Beispiel demonstrierte CCBASIC-Syntax unterstützt.

Beispiel

Bekannte Schlüsselwörter

Die Syntax von OCBASIC entspricht in fast allen Punkten der bekannten Syntax von CCBASIC. Wer bisher die C-Control in CCBASIC programmiert hat, wird sicher keine Schwierigkeiten haben, zu OCBASIC zu wechseln. Trotzdem werden im Folgenden noch einmal die bekannten Schlüsselwörter von CCBASIC im Zusammenhang mit der OM kurz vorgestellt. Eine umfangreiche Beschreibung der CCBASIC-Befehle befindet sich in der Dokumentation zur C-Control Version 1.1 und in der Online-Hilfe von CCBASIC für Windows und DOS.

&B

Beschreibung
Hinweis
Syntax
Beispiel

&H

Beschreibung
Hinweis
Syntax
Beispiel

ABS

Beschreibung
Syntax
Beispiel

AD

Beschreibung
Hinweis
Verfügbarkeit
Syntax
Beispiel

AND

Beschreibung
Syntax
Beispiel

APPEND

Beschreibung
Syntax
Beispiel

BAUD

Beschreibung
Hinweis
Syntax
Beispiel

BEEP

Beschreibung
Hinweis
Verfügbarkeit
Syntax
Beispiel

BIT

Beschreibung
Syntax
Beispiel
Hinweis
Hinweis

BYTE

Beschreibung
Hinweis
Syntax
Beispiel
Hinweis

BYTEPORT

Beschreibung
Verfügbarkeit
Syntax
Beispiel
Hinweis

CLOSE#

Beschreibung
Syntax
Beispiel

CTS

Beschreibung
Syntax
Beispiel

DA

Beschreibung
Syntax
Beispiel

DAY

Beschreibung
Syntax
Beispiel

DEACT

Beschreibung
Syntax
Beispiel

DEFINE

Beschreibung
Hinweis
Syntax
Beispiel
Hinweis

DOW

Beschreibung
Syntax
Beispiel

ELSE

Beschreibung
Syntax
Beispiel

END

Beschreibung
Syntax
Beispiel

EOF

Beschreibung
Syntax
Beispiel

FILEFREE

Beschreibung
Syntax
Beispiel

FOR TO NEXT

Beschreibung
Syntax
Beispiel

FREQ

Beschreibung
Verfügbarkeit
Syntax
Beispiel

FREQ2

Beschreibung
Syntax
Beispiel
Hinweis

GET

Beschreibung
Syntax
Beispiel

GOSUB

Beschreibung
Syntax
Beispiel

GOTO

Beschreibung
Syntax
Beispiel

HANDSHAKE

Beschreibung
Syntax
Beispiel

HOUR

Beschreibung
Syntax
Beispiel

IF

Beschreibung
Syntax
Beispiel
Hinweis

INPUT

Beschreibung
Syntax
Beispiel
Hinweis

INPUT#

Beschreibung
Syntax
Beispiel

INTERRUPT

Beschreibung
Syntax
Beispiel

LOOKTAB

Beschreibung
Syntax
Beispiel

LOOKTABBYTE

Beschreibung
Syntax
Beispiel

MAX

Beschreibung
Syntax
Beispiel

MIN

Beschreibung
Syntax
Beispiel

MINUTE

Beschreibung
Syntax
Beispiel

MOD

Beschreibung
Syntax
Beispiel

MONTH

Beschreibung
Syntax
Beispiel

NAND

Beschreibung
Syntax
Beispiel

NOR

Beschreibung
Syntax
Beispiel

NOT

Beschreibung
Syntax
Beispiel

OFF

Beschreibung
Syntax
Beispiel

ON

Beschreibung
Hinweis
Syntax
Beispiel

ON GOSUB

Beschreibung
Hinweis
Syntax
Beispiel

ON GOTO

Beschreibung
Hinweis
Syntax
Beispiel

OPEN#

Beschreibung
Syntax
Beispiel

OR

Beschreibung
Syntax
Beispiel

PAUSE

Beschreibung
Syntax
Beispiel

PORT

Beschreibung
Verfügbarkeit
Syntax
Beispiel
Hinweis

PRINT

Beschreibung
Syntax
Beispiel

PRINT#

Beschreibung
Hinweis
Syntax
Beispiel

PULSE

Beschreibung
Verfügbarkeit
Syntax
Beispiel

PUT

Beschreibung
Syntax
Beispiel

RAND

Beschreibung
Hinweis
Syntax
Beispiel
Hinweis

RANDOMIZE

Beschreibung
Hinweis
Syntax
Beispiel

READ

Beschreibung
Syntax
Beispiel

RETURN

Beschreibung
Syntax
Beispiel

RETURN INTERRUPT

Beschreibung
Syntax
Beispiel

RXD

Beschreibung
Syntax
Beispiel

SECOND

Beschreibung
Hinweis
Syntax
Beispiel

SGN

Beschreibung
Syntax
Beispiel

SHL

Beschreibung
Syntax
Beispiel

SHR

Beschreibung
Syntax
Beispiel

SLOWMODE

Beschreibung
Hinweis
Syntax
Beispiel

SQR

Beschreibung
Syntax
Beispiel

STEP

Beschreibung
Syntax
Beispiel

SYS

Beschreibung
Syntax
Beispiel
Hinweis

SYSCODE

Beschreibung
Syntax
Beispiel
Hinweis

SYSEND

Beschreibung
Syntax
Beispiel

TABLE

Beschreibung
Hinweis
Syntax
Beispiel

TABEND

Beschreibung
Syntax
Beispiel

TIMER

Beschreibung
Syntax
Beispiel

TOG

Beschreibung
Verfügbarkeit
Syntax
Beispiel

WAIT

Beschreibung
Syntax
Beispiel

WORD

Beschreibung
Syntax
Beispiel
Hinweis

WORDPORT

Beschreibung
Verfügbarkeit
Syntax
Beispiel

WRITE

Beschreibung
Syntax
Beispiel

XOR

Beschreibung
Syntax
Beispiel

YEAR

Beschreibung
Syntax
Beispiel

Neue Schlüsselwörter

Der OCBASIC-Compiler unterstützt einige neue Befehle und interne Variablen, die in CCBASIC nicht zur Verfügung stehen. Sie erzeugen Tokencode, der meist nur von der OM ausgeführt werden kann.

ADD

Beschreibung
Syntax
Beispiel

ASC

Beschreibung
Syntax
Beispiel

ASSEMBLER (!)

Beschreibung
Syntax
Beispiel

CSTKPTR

Beschreibung
Syntax
Beispiel

DBNZ

Beschreibung
Syntax
Beispiel

DBNZCTR

Beschreibung
Syntax

DIM

Beschreibung
Syntax

ERR

Beschreibung
Syntax
Beispiel
Hinweis

ERRADR

Beschreibung
Syntax
Beispiel

FILEPOS

Beschreibung
Syntax
Beispiel

FREERAM

Beschreibung
Hinweis
Syntax
Beispiel

FUNCTION

Beschreibung
Syntax
Beispiel
Hinweis

GSTKPTR

Beschreibung
Syntax
Beispiel

I2C-LCD

Beschreibung
Syntax
Beispiel
Hinweis

INCLUDE

Beschreibung
Syntax
Beispiel

IVAR

Beschreibung
Syntax
Beispiel

OPTION

Beschreibung
Syntax
Beispiel

PCADR

Beschreibung
Syntax
Beispiel

PEEK & POKE

Beschreibung
Syntax
Beispiel
Hinweis

POP

Beschreibung
Syntax
Beispiel

PROCEDURE

Beschreibung
Syntax
Beispiel
Hinweis

PUSH

Beschreibung
Syntax
Beispiel
Hinweis

REMOVETOS

Beschreibung
Syntax
Beispiel

REPEAT UNTIL

Beschreibung
Syntax
Beispiel

SUB

Beschreibung
Syntax
Beispiel

WHILE WEND

Beschreibung
Syntax
Beispiel

ZEIGER (^, @)

Beschreibung
Syntax
Beispiel

Neue interne Variablen

Die OM besitzt zusätzlich viele neue interne Variablen, die größtenteils als Flags, also als Bitvariablen, ausgelegt sind und mit denen sich das Betriebssystem konfigurieren läßt. Außerdem kann auf Systembereiche zugegriffen werden. Wenn die neuen internen Variablen verwendet werden sollen, müssen sie zunächst definiert werden, denn sie sind nicht Bestandteil der OCBASIC-Syntax. Am einfachsten geht das mit Hilfe einer zum verwendeten Controller passenden Definitionsdatei, die auf der offiziellen Informationssite zur OM heruntergeladen werden kann. Sie wird mit dem folgenden INCLUDE-Befehl in das Anwenderprogramm eingebunden. Dieser INCLUDE-Befehle sollte am Beginn jedes Programms stehen.

Beispiel
Hinweis

CARRY

Beschreibung
Beispiel

CLOCKDIS

Beschreibung
Beispiel

CONFIG1

Beschreibung
Beispiel

CONFIG2

Beschreibung
Beispiel

CONONERR

Beschreibung
Beispiel

DCF77DIS

Beschreibung
Beispiel

DCFCLKST

Beschreibung
Beispiel

DCFOK

Beschreibung
Beispiel

DCFSZ

Beschreibung
Beispiel

END2HOST

Beschreibung
Beispiel

ESCIERR

Beschreibung
Beispiel

EXTPERR

Beschreibung
Beispiel

FILEBYTE

Beschreibung
Beispiel

FILECHG

Beschreibung
Beispiel

FILEERR

Beschreibung
Beispiel

HWHSENAB

Beschreibung
Beispiel

I2CDELAY

Beschreibung
Beispiel
Hinweis

I2CEEPADR

Beschreibung
Beispiel

I2CLCDADR

Beschreibung
Beispiel

IIARFND

Beschreibung
Beispiel

IRQACT

Beschreibung
Beispiel

IRQREQ

Beschreibung
Beispiel

IRQSET

Beschreibung
Beispiel

LCDEN2

Beschreibung
Beispiel

LCDERR

Beschreibung
Beispiel

LCDLIGHT

Beschreibung
Beispiel

PRINTHEX

Beschreibung
Beispiel

PRINTSPC

Beschreibung
Beispiel

PTAPE

Beschreibung
Hinweis
Beispiel

PTBPE

Beschreibung
Hinweis
Beispiel

PTEPE

Beschreibung
Hinweis
Beispiel

PULLUPA

Beschreibung
Verfügbarkeit
Beispiel

PULLUPB

Beschreibung
Verfügbarkeit
Beispiel

REALPOP

Beschreibung
Beispiel

RUNONERR

Beschreibung
Hinweis
Beispiel

SCIERR

Beschreibung
Beispiel

UFILEEND

Beschreibung
Beispiel

UIRADC

Beschreibung
Beispiel

UIRESCIE

Beschreibung
Beispiel

UIRESCIR

Beschreibung
Beispiel

UIRESCIT

Beschreibung
Beispiel

UIRICG

Beschreibung
Beispiel

UIRIIC1

Beschreibung
Beispiel

UIRIRQ

Beschreibung
Beispiel

UIRKYB

Beschreibung
Beispiel

UIRLVD

Beschreibung
Beispiel

UIRRTI

Beschreibung
Beispiel

UIRSCI1E

Beschreibung
Beispiel
Hinweis

UIRSCI1R

Beschreibung
Beispiel
Hinweis

UIRSCI1T

Beschreibung
Beispiel
Hinweis

UIRSCI2E

Beschreibung
Beispiel
Hinweis

UIRSCI2R

Beschreibung
Beispiel
Hinweis

UIRSCI2T

Beschreibung
Beispiel
Hinweis

UIRSPI

Beschreibung
Beispiel

UIRSPIR

Beschreibung
Beispiel

UIRSPIT

Beschreibung
Beispiel

UIRSWI

Beschreibung
Beispiel

UIRTIM0

Beschreibung
Beispiel

UIRTIM1

Beschreibung
Beispiel

UIRTIM2

Beschreibung
Beispiel

UIRTIM3

Beschreibung
Beispiel

UIRTIM4

Beschreibung
Beispiel

UIRTIM5

Beschreibung
Beispiel

UIRTOFL

Beschreibung
Beispiel

UIRTPM2C0

Beschreibung
Beispiel

UIRTPM2C1

Beschreibung
Beispiel

UIRTPM2OFL

Beschreibung
Beispiel

URILLTOK

Beschreibung
Beispiel

URTOK

Beschreibung
Beispiel

USEESCI

Die Open-Macro bietet eine hardwaremäßig implementierte 2. Serielle Schnittstelle (ESCI). Die TXD-Leitung der ESCI liegt am PORT[14] und RXD am PORT[13]. Auf dem Starterboard von CCTools oder dem zweiten PE-Board auf der offiziellen OM-Website kann der Jumper für RS232 auf Dual-Wire umgeschaltet und PORT[14] mit PORT[1] und PORT[13] mit PORT[2] verbunden werden, um die ESCI zu testen oder zu nutzen.

Beispiel
Hinweis

VERSION

Beschreibung
Hinweis
Beispiel

Schlüsselwortliste

Hier die thematisch sortierte Liste aller vom OCBASIC-Compiler derzeit unterstützten Schlüsselwörter und durch die Definitionsdateien erstellten neuen internen Variablen. Durch Anklicken des jeweiligen Schlüsselworts kann zur Stelle in dieser Dokumentation gesprungen werden, an der die ausführliche Beschreibung zu finden ist. Einige Schlüsselwörter passen in verschiedene Themenbereiche. Sie wurden dennoch nur einmal aufgeführt.

Anweisungen an den Compiler
 
Schlüsselwort Kurzbeschreibung Beispiel
INCLUDE
Datei an die aktuelle Position des Sourcecodes einfügen INCLUDE "omac.def"
OPTION
Compiler auf Controllertype konfigurieren OPTION openmaxi

Definitionen
 
Schlüsselwort Kurzbeschreibung Beispiel
AD
Analogen Eingang definieren DEFINE adpoti AD[6]
BIT
Bitvariable definieren DEFINE bit7vonzahl BIT[8] OF zahl
BYTE
Bytevariable definieren DEFINE variable BYTE
BYTEPORT
Byteport definieren DEFINE port_a BYTEPORT[1]
DA
Digital-Analog-Port (PWM) definieren DEFINE pwm_port DA[1]
DEFINE
Bezeichner (Port, Variable oder Konstante) definieren DEFINE a,b,c BYTE
DIM
Bezeichner (Port, Variable oder Konstante) definieren DIM a,b,c BYTE
IVAR
Neue interne Variable definieren DEFINE PULLUPA IVAR[140]
PORT
Digitalport (Bitport) definieren DEFINE led PORT[4]
WORD
Wordvariable definieren DEFINE variable1 WORD
WORDPORT
Wordport definieren DEFINE alle_ports WORDPORT[1]
ZEIGER (^, @)
USER-RAM-Zeiger definieren und verwenden @pb=234

Port-Ein-/Ausgabe
 
Schlüsselwort Kurzbeschreibung Beispiel
BEEP
Rechtecksignal (Ton) an einem Digitalport ausgeben BEEP 250, 50, ton_port
DEACT
Ausgabeport auf Eingang schalten port1=OFF : DEACT port1
FREQ
Frequenz am FREQ-Pin (bzw. PORT[3]) abfragen FREQ=50 : PRINT FREQ
FREQ2
Frequenz am FREQ2-Pin abfragen PRINT FREQ2
PTAPE
Interne Pull-Up-Widerstände an BYTEPORT[1] PTAPE=&b11111111
PTBPE
Interne Pull-Up-Widerstände an BYTEPORT[2] PTBPE=&b11111111
PTEPE
Interne Pull-Up-Widerstände an BYTEPORT[5] PTEPE=&b11111111
PULLUPA
Interne Pull-Up-Widerstände an BYTEPORT[1] PULLUPA=&b00111111
PULLUPB
Interne Pull-Up-Widerstände an BYTEPORT[2] PULLUPB=&b11111111
PULSE
Puls an einem Ausgabedigitalport ausgeben led=OFF : PULSE led
TOG
Ausgabedigitalport umschalten led=ON : TOG led
EXTPERR
Extended Ports: ein I²C-Portexpander sendet kein ACK IF ExtPErr THEN PRINT "Fehler"

Mathematische Berechnungen
 
Schlüsselwort Kurzbeschreibung Beispiel
&B
Konstante im binären Zahlensystem &B10011001
&H
Konstante im hexadezimalen Zahlensystem &H1FFE
ABS
Berechnung des Absolutbetrags y = ABS(-1)
ADD
Schnelle und platzsparende Addition bei User-Variablen ADD a,1
AND
Logische und bitweise UND-Verknüpfung IF x>10 AND x<20 THEN y=x
ASC
Stringkonstante in ASCII-Zeichen wandeln PUT ASC("?")
CARRY
Carry nach Berechnungen PRINT Carry
MAX
Größeren Wert ermitteln z=MAX(x,10)
MIN
Kleineren Wert ermitteln z=MIN(x,10)
MOD
Rest einer ganzzahligen Division PRINT 10 MOD 6
NAND
UND-Verknüpfung mit anschließender Negation (NOT) x=a NAND b
NOR
ODER-Verknüpfung mit anschließender Negation (NOT) x=a NOR b
NOT
Logische und bitweise Negation (1er Komplement) x=NOT(y)
OFF
Vordefinierte Konstante für 0 (logisch unwahr, Port low) Led=OFF
ON
Vordefinierte Konstante für -1 (logisch wahr, Port high) Led=ON
OR
Logische und bitweise ODER-Verknüpfung y=a OR b
POP
Top-Of-Stack (TOS) des Rechenstacks auslesen a=POP
PUSH
Wert auf dem Rechenstack ablegen PUSH 123
RAND
Zufallszahl im Integerformat generieren x=RAND
RANDOMIZE
Zufallszahlengenerator initialisieren RANDOMIZE TIMER
REMOVETOS
Top-Of-Stack (TOS) des Rechenstacks entfernen REMOVETOS
SGN
Mathematische Signum-Funktion z=SGN(x)
SHL
Bitweises arithmetisches Linksschieben x=x SHL 3
SHR
Bitweises arithmetisches Rechtsschieben x=x SHR 3
SQR
Ganzzahliger Näherungswert für die Quadratwurzel z=SQR(x)
SUB
Schnelle und platzsparende Subtraktion bei User-Variablen SUB a,1
XOR
Logische und bitweise Exclusiv-ODER-Verknüpfung x=a XOR b

Programmablaufsteuerung
 
Schlüsselwort Kurzbeschreibung Beispiel
DBNZ
Schnelle DBNZ-Schleife ausführen DBNZ loop
DBNZCTR
Zähler für DBNZ-Schleifen DBNZCTR=15
ELSE
Alternativzweig bei IF..THEN IF x=0 THEN x=1 ELSE x=2
END
Programmausführung beenden END
END2HOST
Nach Programmende in den Host-Modus wechseln End2Host=ON : END
FOR TO NEXT
Programmschleife FOR i=32 TO 255 : PUT i : NEXT i
FUNCTION
Funktion definieren FUNCTION funktion(a,b)
GOSUB
Subroutine aufrufen GOSUB unterprogramm1
GOTO
Unbedingter Sprung zu einem Label (Sprungziel) GOTO endlos
IF THEN
Bedingte Befehlsausführung IF x>10 THEN END
ON GOSUB
Unterroutinenaufruf in Abhängigkeit eines Wertes ON x GOSUB label1, label2
ON GOTO
Programmsprung in Abhängigkeit eines Wertes ON x GOTO label1, label2
PAUSE
Programmunterbrechung für Vielfache von 20 Millisekunden PAUSE 50
PROCEDURE
Unterprogramm (Subroutine, Prozedur) definieren PROCEDURE subroutine(a,b)
REPEAT UNTIL
Fußgesteuerte Schleife mit Abbruchbedingung a=0 : REPEAT : a=a+1 : UNTIL a>9
RETURN
Aus einer Subroutine oder einer Funktion zurückkehren RETURN
Sprungziele (#)
Ziele der Sprungoperationen GOSUB und GOTO #label
STEP
Schrittweite bei einer FOR-Programmschleife FOR i=1 TO 9 STEP 2 : NEXT i
WAIT
Auf Eintreten einer Bedingung warten WAIT taste=ON
WHILE WEND
Kopfgesteuerte Schleife mit Einstiegsbedingung WHILE taste : WEND

BASIC-Interruptroutine
 
Schlüsselwort Kurzbeschreibung Beispiel
INTERRUPT
BASIC-Interruptroutine vereinbaren INTERRUPT basicirq
RETURN INTERRUPT
Aus der BASIC-Interruptroutine zurückkehren RETURN INTERRUPT

Serielle Schnittstelle
 
Schlüsselwort Kurzbeschreibung Beispiel
BAUD
Baudrate der Seriellen Schnittstelle einstellen BAUD R9600
CTS
Test, ob die CTS-Leitung aktiv ist IF CTS THEN GET x
ESCIERR
Abfrage, ob Empfangsfehler an der ESCI IF EsciErr THEN PRINT "Fehler"
GET
Byte (Zeichen) von der Seriellen Schnittstelle lesen GET x
HANDSHAKE
Hardware-Handshake auf der RTS- und CTS-Leitung (obsolet) HANDSHAKE ON
HWHSENAB
Hardware-Handshake auf der RTS- und CTS-Leitung HwHsEnab=ON
INPUT
Zahlenwert im Textformat von der Seriellen Schnittstelle einlesen INPUT x
PRINT
Werte und Texte über die Serielle Schnittstelle ausgeben PRINT "Wert ist ";wert
PRINTHEX
Bei PRINT alle Zahlen im Hexadezimalformat ausgeben PrintHex=ON
PRINTSPC
Bei PRINT dezimale Zahlen mit führendem Leerzeichen ausgeben PrintSpc=ON
PUT
Byte über die Serielle Schnittstelle ausgeben PUT x
RXD
Test, ob ein Byte seriell empfangen wurde IF RXD THEN GET x
SCIERR
Abfrage, ob Empfangsfehler an der Seriellen Schnittstelle IF SciErr THEN PRINT "Fehler"
USEESCI
ESCI- statt Semi-Dual-Wire-RS232 benutzen UseEsci=ON : BAUD R9600

Datenspeicherung
 
Schlüsselwort Kurzbeschreibung Beispiel
APPEND
Datei zum Anfügen von Daten öffnen OPEN# FOR APPEND
CLOSE#
Datei schließen CLOSE#
EOF
Test auf Dateiende beim Auslesen der Datei IF NOT EOF THEN INPUT# a
FILEBYTE
PRINT#, INPUT# und FILEFREE im Byte- statt Wordformat FileByte=ON
FILEERR
File-I/O-Error - das I²C-EEPROM sendet kein ACK IF FileErr THEN PRINT "Fehler"
FILEFREE
Test auf freien Speicherplatz vor dem Schreiben in die Datei IF FILEFREE>0 THEN PRINT# a
FILEPOS
Dateipositions-Zeiger PRINT FILEPOS
I2CEEPADR
I²C-Schreibadresse vom I²C-EEPROM setzen POKE i2ceepadr,&b10100110
INPUT#
Zahlenwert aus der Datei einlesen INPUT# x
LOOKTAB
Word aus einer Datentabelle lesen PRINT LOOKTAB(tabelle1, mess)
LOOKTABBYTE
Byte aus einer Datentabelle lesen PRINT LOOKTABBYTE(tabelle2, mess)
OPEN#
Datei im Modus Schreiben, Anfügen oder Lesen öffnen OPEN# FOR READ
PRINT#
Wert in die Datei schreiben IF FILEFREE>0 THEN PRINT# 123
READ
Datei zum Auslesen von Daten öffnen OPEN# FOR READ
TABLE
Datentabelle definieren TABLE tab2 BYTE "datei.tab"
TABEND
Abschluß einer bei TABLE eingegebenen Werteliste TABLE tab1 : 17 25 4 5 : TABEND
UFILEEND
Fileende-Zeiger der Datei PRINT PEEKW(ufileend)
WRITE
Datei zum Schreiben neuer Daten öffnen OPEN# FOR WRITE

Echtzeituhr
 
Schlüsselwort Kurzbeschreibung Beispiel
CLOCKDIS
Weiterzählen der Uhr deaktivieren ClockDis=ON
DAY
Tagwert der Echtzeituhr PRINT DAY
DOW
Wochentagwert der Echtzeituhr IF DOW = 1 THEN PRINT "Montag"
HOUR
Stundenwert der Echtzeituhr PRINT HOUR
MINUTE
Minutenwert der Echtzeituhr PRINT MINUTE
MONTH
Monatswert der Echtzeituhr PRINT MONTH
SECOND
Sekundenwert der Echtzeituhr PRINT SECOND
TIMER
20-ms-Timer x=TIMER
YEAR
Jahrwert der Echtzeituhr PRINT YEAR
DCFCLKST
DCF77: "Interne Uhr der OM wurde gestellt" IF DcfClkSt THEN PRINT "Uhr gestellt"
DCFOK
DCF77: "DCF-Signal zur Zeit okay" IF DcfOk THEN PRINT "DCF77 okay"
DCFSZ
DCF77: "Sommerzeit ist aktiv" IF DcfSZ THEN PRINT "Sommerzeit"

I²C-LCD
 
Schlüsselwort Kurzbeschreibung Beispiel
I2CLCDADR
I²C-Schreibadresse vom I²C-Portexpander setzen POKE i2clcdadr,&h40
LCDCLS
Bildschirm vom LCD löschen LCDCLS
LCDCMD
Kommando zum LCD schicken LCDCMD &b00001111
LCDINIT
LCD initialisieren LCDINIT
LCDEN2
Zweite ENABLE-Leitung verwenden LcdEn2=ON
LCDERR
Der I²C-Portexpander sendet kein ACK IF LcdErr THEN PRINT "Fehler"
LCDLIGHT
Hintergrundbeleuchtung ein- oder ausschalten LcdLight=ON
LCDLOCATE
Cursor im LCD positionieren LCDLOCATE y,x
LCDPRINT
String oder Zahl auf dem LCD darstellen LCDPRINT "Zahl:";-12345
LCDPUT
Zeichen auf dem LCD darstellen LCDPUT ASC("!")

Fehlerverfolgung
 
Schlüsselwort Kurzbeschreibung Beispiel
CONONERR
Programmausführung trotz Fehler fortsetzen (obsolet) ConOnErr=ON
ERR
Fehlergrund ermitteln IF ERR THEN PRINT ERR : END
ERRADR
Fehlerstelle im Tokencode PRINT ERRADR
RUNONERR
Programm bei einem Fehler neustarten RunOnErr=ON

Speicherzellen lesen oder beschreiben
 
Schlüsselwort Kurzbeschreibung Beispiel
PEEK
Ein Byte aus dem Speicher lesen PRINT PEEK(i2cdelay)
PEEKW
Ein Word aus dem Speicher lesen PRINT PEEKW(ufileend)
POKE
Ein Byte in den Speicher schreiben POKE i2clcdadr,&h40
POKEW
Ein Word in den Speicher schreiben POKEW freq1tmp,1

Assemblerprogrammierung
 
Schlüsselwort Kurzbeschreibung Beispiel
ASSEMBLER (!)
Assemblerbefehl in das Programm einfügen ! lda variable
FREERAM
Für Assemblerroutinen reservierter RAM-Speicher FREERAM=123
SYS
Aufruf einer Maschinensprache-Routine SYS &HFD00
SYSCODE
S19-Datei mit Assembler-Routinen in das Programm einbinden SYSCODE "test.s19"
SYSEND
Abschluß einer mit SYSCODE direkt eingegebenen Byteliste SYSCODE &H81 SYSEND
UIRADC
Assemblerroutine in den ADC-Interrupt einbinden UIRAdc=ON
UIRESCIE
Assemblerroutine in den ESCI-ERROR-Interrupt einbinden UIREsciE=ON
UIRESCIR
Assemblerroutine in den ESCI-RECEIVE-Interrupt einbinden UIREsciR=ON
UIRESCIT
Assemblerroutine in den ESCI-TRANSMIT-Interrupt einbinden UIREsciT=ON
UIRICG
Assemblerroutine in den ICG-Interrupt einbinden UIRIcg=ON
UIRIIC1
Assemblerroutine in den IIC1-Interrupt einbinden UIRIic1=ON
UIRIRQ
Assemblerroutine in den IRQ-Interrupt einbinden UIRIrq=ON
UIRKYB
Assemblerroutine in den KEYB-Interrupt einbinden UIRKyb=ON
UIRLVD
Assemblerroutine in den LVD-Interrupt einbinden UIRLvd=ON
UIRRTI
Assemblerroutine in den RTI-Interrupt einbinden UIRRti=ON
UIRSCI1E
Assemblerroutine in den SCI1-ERROR-Interrupt einbinden UIRSci1e=ON
UIRSCI1R
Assemblerroutine in den SCI1-RECEIVE-Interrupt einbinden UIRSci1r=ON
UIRSCI1T
Assemblerroutine in den SCI1-TRANSMIT-Interrupt einbinden UIRSci1t=ON
UIRSCI2E
Assemblerroutine in den SCI2-ERROR-Interrupt einbinden UIRSci2e=ON
UIRSCI2R
Assemblerroutine in den SCI2-RECEIVE-Interrupt einbinden UIRSci2r=ON
UIRSCI2T
Assemblerroutine in den SCI2-TRANSMIT-Interrupt einbinden UIRSci2t=ON
UIRSPI
Assemblerroutine in den SPI-Interrupt einbinden UIRSpi=ON
UIRSPIR
Assemblerroutine in den SPI-RECEIVE-Interrupt einbinden UIRSpiR=ON
UIRSPIT
Assemblerroutine in den SPI-TRANSMIT-Interrupt einbinden UIRSpiT=ON
UIRSWI
Assemblerroutine in den SWI-Interrupt einbinden UIRSwi=ON
UIRTIM0
Assemblerroutine in den TIM0-Interrupt einbinden UIRTim0=ON
UIRTIM1
Assemblerroutine in den TIM1-Interrupt einbinden UIRTim1=ON
UIRTIM2
Assemblerroutine in den TIM2-Interrupt einbinden UIRTim2=ON
UIRTIM3
Assemblerroutine in den TIM3-Interrupt einbinden UIRTim3=ON
UIRTIM4
Assemblerroutine in den TIM4-Interrupt einbinden UIRTim4=ON
UIRTIM5
Assemblerroutine in den TIM5-Interrupt einbinden UIRTim5=ON
UIRTOFL
Assemblerroutine in den TIMOFL-Interrupt einbinden UIRTofl=ON
UIRTPM2C0
Assemblerroutine in den TPM2CH0-Interrupt einbinden UIRTpm2C0=ON
UIRTPM2C1
Assemblerroutine in den TPM2CH1-Interrupt einbinden UIRTpm2C1=ON
UIRTPM2OFL
Assemblerroutine in den TPM2OVF-Interrupt einbinden UIRTpm2Ofl=ON
URILLTOK
Assemblerroutine bei einem illegalen Tokenbefehl starten URIllTok=ON
URTOK
Assemblerroutine in den Interpreter einbinden URTok=ON

Konfiguration
 
Schlüsselwort Kurzbeschreibung Beispiel
CONFIG1
Erstes Konfigurationsregister der Open-Macro PRINT CONFIG1
CONFIG2
Zweites Konfigurationsregister der Open-Macro CONFIG2=&b01000000
DCF77DIS
DCF77-Auswertung an FREQ1 deaktivieren Dcf77Dis=ON
FREQ2
Systemtakt auf der Open-Macro justieren (kalibrieren) FREQ2=128
I2CDELAY
I²C-Bustakt konfigurieren POKE i2cdelay,20
REALPOP
LIFO-Stackhandling aktivieren und Stacksichern deaktivieren RealPop=ON
SLOWMODE
Controller in einen stromsparenden Modus versetzen SLOWMODE ON

Betriebssystemstatus
 
Schlüsselwort Kurzbeschreibung Beispiel
CSTKPTR
Zeiger (Pointer) des Rechenstacks PRINT CSTKPTR
FILECHG
Signalflag für Dateiveränderungen PRINT FileChg
GSTKPTR
Zeiger (Pointer) des GOSUB-Stacks PRINT GSTKPTR
IIARFND
Signalflag für existierende INLINE-Interrupt-Assemblerroutine PRINT IiarFnd
IRQACT
Signalflag für Ausführung der BASIC-Interruptroutine PRINT IrqAct
IRQREQ
Signalflag für Anforderung der BASIC-Interruptroutine PRINT IrqReq
IRQSET
Signalflag für Vereinbarung der BASIC-Interruptroutine PRINT IrqSet
PCADR
Programmzähler im Tokencode PRINT PCADR
VERSION
Versionsnummer vom geladenen Betriebsystem abfragen PRINT VERSION

Softwaremodule für die OM

Um die Funktionalität der OM zu erhöhen, existieren viele Softwaremodule, die meist in INLINE-Assembler geschrieben wurden und so in jedes beliebige BASIC-Programm eingebunden werden können. Wie die Module im einzelnen zu benutzen sind, wird in den entsprechenden ZIP-Archiven erklärt. Die folgenden Erläuterungen sollen nur eine Übersicht über einige Softwaremodule vermitteln.

Inter-Integrated-Circuit-Bus (I²C, IIC)

Das Softwaremodul stellt an den beiden Digitalports PORT[5] und PORT[6] der kleinen OM-Controller einen I²C-Bus mit 100 kHz Bustakt zur Verfügung. Außerdem wird in den beiliegenden Beispielprogrammen gezeigt, wie ein I²C-EEPROM, das Videotext-IC SAA5246AP/E und mittels PCF8574-Portexpander ein 4x20-LCD über den I²C-Bus angesprochen werden kann. Damit kann nun erstmals auch an der Open-Micro ein LCD mit hoher Geschwindigkeit betrieben werden und es muß nicht mehr der gesamte zweite Byteport der Open-Mini, -Midi oder -Macro belegt werden.

Bei der Open-Maxi steht der I²C-Bus an den eigens dafür vorgesehenen Ports SDA und SCL zur Verfügung. Die Routinen für I²C befinden sich bereits im Betriebssystem und können als Firmwareroutinen genutzt werden.

I²C ist ein von Philips in den frühen 80er Jahren entwickelter serieller Bus, der benutzt wird, um Integrierte Schaltkreise (ICs) mit geringer Übertragungsgeschwindigkeit zu verbinden. Daten lassen sich beliebig langsam über den Bus senden. Die Standardgeschwindigkeit beträgt 100 kBit/s, was einer Datenrate von ungefähr 10 Kilobyte pro Sekunde entspricht.

Der Bus besteht aus den drei Leitungen SDA, SCL und GND. SDA dient zur bidirektionalen Übermittlung von Adressen und Daten zwischen bis zu 256 verschiedenen Geräten am Bus. SCL ist die CLOCK-Leitung. Sie signalisiert, zu welchem Zeitpunkt SDA einen gültigen Zustand hat. Die Geräte am I²C-Bus werden in die Kategorien Master und Slave unterteilt. Der Master sorgt für das Takten der SCL-Leitung sowohl beim Senden als auch beim Empfangen von Daten zum, bzw. vom Slave.



Der Ruhezustand beim I²C-Bus ist auf beiden Leitungen HIGH-Potential (5 Volt). Das wird dadurch erreicht, indem die beiden Leitungen über Pullup-Widerstände mit 5 Volt verbunden sind. Wenn nach dem Ruhezustand SDA auf LOW (0 Volt) geht, während SCL weiter HIGH ist, ist das das Startsignal für die Datenübertragung. Danach wird in einem Byte (8 Bit) die Kennung des anzusprechenden Geräts am Bus beginnend mit dem MSB übertragen, indem SDA entsprechend dem Bit gesetzt, und anschließend mittels SCL ein kurzer LOW/HIGH/LOW-Impuls gesendet wird. Nach der Übertragung der 8 Bits deaktiviert der Sender die SDA-Leitung, damit der Empfänger auf dieser Leitung ein Acknowledge-Signal senden kann, indem SDA auf LOW gezogen wird. Fehlt das ACK-Signal ist der Empfänger entweder beschäftigt, oder - wenn der Empfänger ein Master ist - dem Sender wird signalisiert, daß das Senden von Daten beendet werden soll. Wenn mehr als ein Byte übertragen wird, folgen die nächsten 8 Bit direkt an das ACK-Signal (ohne neues Startsignal). Beendet wird die Übertragung, wenn im Anschluß an die ACK-Quittierung SDA auf HIGH geht, während SCL bereits HIGH ist. Somit ist dann wieder der Ausgangszustand erreicht.



Um verschiedene Geräte über den I²C-Bus ansprechen zu können, erhält jedes Gerät eine Kennung, bzw. Bus-Adresse. Ein Sender muß bei einer Übertragung mit dem START-Impuls und der Gerätekennung beginnen. Die ersten 4 Bit der Kennung geben den Schaltungstyp an. Dieser wird vom Hersteller vorgegeben. Bei einem I²C-EEPROM wie dem 24C256 ist die Kennung des Schaltungstyps dualkodiert 1010. Die folgenden 3 Bits (A2, A1 und A0) können mittels Verdrahtung an den Pins des EEPROMs gesetzt werden. Das achte Bit (R/W) gibt an, ob der Sender im folgenden Byte lesen (R/W ist HIGH) oder schreiben (R/W ist LOW) will. So ergibt sich eine Lesekennung für das serielle EEPROM von $a1 (dezimal 161) und eine Schreibkennung von $a0 (dezimal 160). Auf diese Art und Weise können bis zu acht EEPROMs am Bus betrieben werden, vorausgesetzt A2, A1 und A0 sind bei jedem EEPROM anders kodiert.

Das Bild zeigt den Anschluß des EEPROMs 24C256 an die OM. Das IC bietet 32 Kilobyte EEPROM zur permanenten Datenspeicherung. Die im Bild eingezeichneten Pull-Up-Widerstände R1 und R2 können bei der OM entfallen, da das Softwaremodul SCL im Push-Pull-Modus anspricht und an SDA der interne Pull-Up-Widerstand im Controller aktiv ist. Für größere Leitungslängen empfiehlt es sich aber, zusätzliche externe Widerstände bis hinunter zu 1 kOhm vorzusehen.

I²C-LC-Display (I²C-LCD)

Die OM-Controller unterstützen das Ansprechen eines I²C-Liquid Crystal Displays (I²C-LC-Display, I²C-LCD, I²C-Flüssigkristallanzeige). Dazu muß ein normales Text-LCD (HD44780-kompatibel, Industriestandard) an einen I²C-Portexpander PCF8574 angeschlossen und der Portexpander mit dem I²C-Bus der OM verbunden werden.

Im Beispiel "Kleine Pizza-Uhr" befinden sich die aktuellsten Routinen für das I²C-LCD auf der Open-Macro. Die Ausgabe findet auf dem an BYTEPORT[2] angeschlossenen I2C-LCD von Conrad Electronic (Bestellnr. 198330) statt. Darüber hinaus wird gezeigt, wie auf dem LCD komfortabel Strings (also Texte) ausgegeben werden können. Als kleinen Bonus gibt es zwei weitere Programme, die ebenfalls das I2C-LCD nutzen.

Die Open-Maxi besitzt bereits in ihrem Betriebssystem Routinen für das I²C-LCD. Es wird daher komfortabel unterstützt. Es stehen die neuen Befehle LCDINIT, LCDCLS, LCDLOCATE, LCDCMD, LCDPUT und LCDPRINT zur Verfügung. Die I²C-Adresse des Portexpanders PCF8574 für das LCD ist änderbar. Dadurch wird das Ansprechen mehrerer LCDs ermöglicht. Die Hintergrundbeleuchtung oder 2. Enable-Leitung lassen sich vom Anwender setzen. Siehe Beispiel, Hinweis und Pinbelegung.

Pulsweitenmodulation (PWM)

Mit dem PWM-Assemblermodul kann mit der Open-Macro ein pulsweitenmoduliertes Signal erzeugt werden. Die Open-Maxi bietet bereits von Haus die zwei PWM-Ports DA[1] und DA[2] an. Im Folgenden wird erklärt, was ein PWM-Signal ist und wozu es nützlich ist.



Bild a zeigt ein Rechtecksignal, bei dem das Tastverhältnis 1-zu-1 beträgt. Die Zeit, die das Signal auf 0 Volt (GND) liegt, ist also genauso groß wie die Zeit, während der das Signal auf 5 Volt (VDD) liegt. Beide Zeiten zusammenaddiert ergeben die Periodendauer des Signals. Und der Kehrwert der Periodendauer ist die Frequenz des Signals, gemessen in Schwingungen pro Sekunde oder Hertz (Hz).

In Bild b beträgt das Tastverhältnis nicht mehr 1:1, sondern ungefähr 1:3. Über größere Zeitabschnitte betrachtet ist das Signal also 25% der Zeit auf 5 Volt und 75% der Zeit auf 0 Volt. Und in Bild c ist das Tastverhältnis in etwa umgekehrt.

Signale, wie die im Bild gezeigten, lassen sich von einem Mikrocontroller meist sehr einfach erzeugen. Die Frequenz bleibt konstant und es wird nur das Tastverhältnis verändert. Man spricht von Pulsweitenmodulation (PWM). Wird ein pulsweitenmoduliertes Signal über einen größeren Zeitraum gemittelt, zum Beispiel mit Hilfe eines Tiefpaßfilters mit ausreichend geringer Grenzfrequenz, so ergibt sich eine Spannung am Ausgang des Filters, die proportional zum Tastverhältnis ist. In Bild a ist das Signal 50% der Zeit auf 5 Volt. Gemittelt ergibt sich also der Spannungswert 2,5 Volt. In Bild b ergeben sich 25% von 5 Volt, also 1,25 Volt. Und das Signal in Bild c würde zu einer Gleichspannung von 3,75 Volt.

Auf diese Weise erhält man einen sehr einfach aufzubauenden Digital-Analog-Umsetzer. Der Mikrocontroller kann hiermit jede beliebige Gleichspannung erzeugen. Falls die Frequenz des PWM-Signals ausreichend groß und die Grenzfrequenz des Tiefpaßfilters nicht zu niedrig gewählt wurde, lassen sich auch Wechselspannungen, z.B. Tonsignale, mit Hilfe des PWM-Signals erzeugen. Im Prinzip handelt es sich um einen 1-Bit-DA-Wandler.

Um ein PWM-Signal zu filtern, würde ein einfaches passives Tiefpaßfilter, bestehend aus einem Widerstand und einem Kondensator, ausreichen. Allerdings sind die damit erzielten Ergebnisse nicht optimal. Sinnvoller ist der Einsatz eines Tiefpaßfilters höherer Ordnung.



Der linke Operationsverstärker LM358, die Widerstände R2, R3 und R4 und die Kondensatoren C2, C3 und C4 bilden ein Tiefpaßfilter 3. Ordnung. Der rechte Operationsverstärker ist als nichtinvertierender Spannungsverstärker geschaltet, der mit R1 und R5 auf eine Verstärkung von 2 eingestellt wurde. Der Verstärker wirkt zugleich als Impedanzwandler. Zum Einsatz kam der LM358, da dieser Operationsverstärker mit einfacher Versorgungsspannung auskommt.

Die Bauteilwerte des Filters wurden experimentell ermittelt. Die Schaltung bietet eine gute Werteauflösung, aber eine schlechte Zeitauflösung. Das heißt, es dauert einige Zeit (rund 0,3 Sekunden), bis die Ausgangsspannung den gewünschten Spannungswert erreicht. Der Wert wird aber sehr präzise erreicht. Die Taktfrequenz des PWM-Signals wird sehr stark unterdrückt.

Für höhere Ansprüche kann man ein Filter nach einer bestimmten Filtercharakteristik entwerfen. In der Meßtechnik wird sehr häufig die Besselcharakteristik gewählt, da diese im Gegensatz zu Tschebyscheff und Butterworth nicht zum Überschwingen im Zeit- und/oder Frequenzbereich neigt, aber einen steileren Übergang vom Durchlaß- in den Sperrbereich bietet als ein passives Filter. Siehe "Halbleiter-Schaltungstechnik" von Tietze und Schenk.

DCF77-Signalauswertung

Mit dem Zeitgesetz vom 25. Juli 1978 hat die Physikalisch-Technische Bundesanstalt (PTB) den Auftrag erhalten, für die Bundesrepublik Deutschland die Gesetzliche Zeit darzustellen und zu verbreiten. Zur Wahrnehmung der ersten Aufgabe benutzt das Labor "Zeiteinheit" der PTB Braunschweig vier Atomuhren, CS1 bis CS4, die zu den genausten Frequenznormalen gehören. Die Bezeichnung "CS" ist vom Cäsium abgeleitet, dessen Eigenschaften in den verwendeten Atomuhren genutzt werden. Zur Verbreitung der codierten Zeitinformation dient der Sender DCF77 in Mainflingen, etwa 30 km südöstlich von Frankfurt am Main. Er benutzt die Langwellenfrequenz 77,5 kHz, wodurch eine maximale Reichweite von 1000 bis 1500 km bei nur 30 kW Sendeleistung erreicht wird. Auf diese Weise kann das Zeitsignal zumindest nachts in ganz Mitteleuropa empfangen werden.

Mittels DCF-Modul (Conrad-Best.Nr. 641138) und DCF-Routinen läßt sich das Zeitsignal auch auf der Open-Macro nutzen und auswerten. Im Open-Maxi-Betriebssystem sind die Routinen bereits integriert. Es muß der invertierte Ausgang des Empfängermoduls verwendet werden. Selbstverständlich sollte man das Modul an einer stabilisierten Spannungsquelle (ohne Brumm) betreiben. Außerdem sollen einige verkaufte Module kein sauberes Signal ausgeben. Es soll helfen, einen 100-nF-Kondensator an den Ausgang gegen Masse zu schalten.

Tip zum Aufstellen des DCF77-Empfängermoduls: Die Stelle, die für den Empfänger vorgesehen ist, mit einem tragbaren Radio "abhören". Hört man an der Stelle Langwellensender (Langwelle von 150-285 kHz) ist schon fast sicher, daß man dort auch DCF77 empfangen kann. Durch Drehen um die Längsachse läßt sich hier die beste Stellung des Moduls finden. Vermeiden sollte man die Nähe von Lautsprechern, Monitoren, Fernsehern, Computern und schaltenden Relais. In der Nähe von Fenstern hat man dagegen meistens einen guten Empfang. Falls es tagsüber trotzdem nicht klappt, sollte man es einmal nachts versuchen. Und falls es immer noch nicht kappt, kann es daran liegen, daß der DCF77-Sender augenblicklich gewartet wird. Das geschieht etwa 20 mal pro Monat und in der Zeit wird der Sender für 2 bis 10 Minuten abgeschaltet.

Extended Ports

Ein Nachteil der kleinen OM-Controller war bisher deren relativ geringe Portanzahl. Aus diesem Grund lassen sie sich jetzt mit diesem Softwaremodul um bis zu 64 Extended Ports erweitern. Die Extended Ports werden mittels PCF8574-I2C-Portexpandern realisiert und lassen sich in BASIC nach der Aktivierung des Softwaremoduls genauso wie die normalen Ports ansprechen.

Auf der Open-Maxi befinden sich die Softwareroutinen für acht Portexpander bereits im Betriebssystem und da sich die Open-Maxi die Ausgabe merkt, lassen sich sogar einige Pins eines PCF8574 als Input und andere als Output verwenden.

Über die drei Pins A0, A1 und A2 am PCF8574 werden die acht Portexpander unterschieden. Das heißt, bei jedem der acht Portexpander müssen diese drei Pins anders beschaltet werden.

Modellbau-Servos

Mit dem Servo-Assemblermodul ist es möglich, Modellbau-Servos (positiver Impuls) mit der OM anzusteuern. Bei den kleinen OM-Controllern kann man den Servo-Impuls an jedem Port außer PORT[3] erzeugen. Außerdem wurde auf einen großen Stellwinkel (erweiterter Stellbereich) Wert gelegt, um das Potential des Servos voll auszuschöpfen.

Wenn man den Servo an der gleichen Stromquelle wie die OM betreibt, dann ist darauf zu achten, daß die Stromquelle einen ausreichenden Strom zur Verfügung stellen kann. Denn sonst liefert die OM keine sauberen Impulse und der Servo fährt die vorgesehene Position nicht an.

8 MHz Bustakt

Der Bustakt der Open-Macro wird von 3.2 MHz auf 8 MHz erhöht. Die OM wird also genauso schnell getaktet wie die C-Control I UNIT M 2.0. Da die OM oft nur mit Bytevariablen arbeiten muß, schneidet sie in Benchmark-Tests deutlich schneller ab als die neue C-Control. Es kann im laufenden Betrieb zwischen 3.2 und 8 MHz hin- und hergewechselt werden.

Es wird ein Quarzoszillator im DIP-14-Gehäuse verwendet, den Reichelt unter der Artikelnummer "OSZI 32,000000" für 0,86 EUR anbietet. Auch ein SMD-Quarzoszillator läßt sich verwenden. Dieser hat eine Größe von nur 3,2 x 2,5 mm, ist aber für eine Lastkapazität von nur 15 pF ausgelegt.

Erweiterte Zahlenformate

Für 32-Bit-Ganzzahl-Arithmetik existiert ein in Assembler erstelltes Softwaremodul. Es bietet hohe Verarbeitungsgeschwindigkeit, vorzeichenbehaftete Zahlen und ein schnelles PRINT32. Es ist zu allen OM-Controllern kompatibel.

Für die Open-Macro und Open-Maxi gibt es ein Softwaremodul für 32-Bit-Fließkommazahlen ("Gleitkommazahlen") im IEEE-Format. Es verwendet die Float-Routinen für 6805 von Motorola. Der Darstellungsbereich umfaßt ±1,175*10-38 bis ±3,403*1038 bei etwa 7 dezimalen Stellen. Ganzzahlige, vorzeichenbehaftete 16-Bit-Zahlen lassen sich leicht ins Fließkommazahlen-Format konvertieren. Ebenso leicht ist die Rückkonvertierung möglich.

Weitere Softwaremodule

Weitere Softwaremodule und Beispielprogramme befinden sich auf der offiziellen OM-Infosite. Sie wird laufend erweitert. Die "Neuigkeiten"-Seite sollte regelmäßig besucht werden.

Beschaltung der Ports

In den nachfolgenden Beispielen wird beschrieben, wie man die Eingangs- und Ausgangsports der OM-Controller beschalten kann. Da es sehr viele Möglichkeiten zur Beschaltung gibt, soll nur ein kleiner Einblick in die Grundlagen vermittelt werden.

Beschaltung von Eingangsports

Bild 1
In diesem Beispiel führt der Port ein "High"-Signal (5 Volt, ON), wenn der Schalter offen ist. Wird der Schalter geschlossen, wird am Port ein "Low"-Signal (0 Volt, OFF) erkannt. Da die OM interne Pull-Up-Widerstände besitzt, läßt sich der Widerstand R1 meist einsparen.

Bild 2
Ist genau das gleiche wie in Bild 1, nur invertiert. Bei einem offenen Schalter wird ein "Low"-Signal (OFF) erkannt. Damit die internen Pull-Up-Widerstände der OM das Meßergebnis nicht verfälschen, sollten sie deaktiviert werden (siehe PULLUPA und PULLUPB).

Bild 3
Hier wird ein Optokoppler zur galvanischen Trennung verwendet. Damit können Spannungen, die größer als 5 Volt sind, oder auf ungünstigem Potential liegen mit der OM detektiert werden.

Bild 4
Diese Schaltung basiert auf dem Prinzip des Spannungsteilers. Durch die Reihenschaltung der Widerstände wird die Spannung herabgesetzt. In diesem Beispiel können so Gleichspannungen bis 16 Volt gemessen werden. Das Spannungsverhältnis wird durch die beiden Widerstände festgelegt und beträgt rund 3/(6,8+3)=0,3. Bei 16 Volt liegen also etwa 16*0.3=4,9 Volt am Ausgang.

Bild 5
Hier wird das Signal eines KTY10 (Temperatursensor) ausgewertet. Wie in Bild 4 basiert diese Schaltung auf einem Spannungsteiler. Ändert sich die Temperatur, so ändert sich auch der Widerstand vom KTY10. Die gemessene Spannung läßt sich mit Hilfe einer Tabelle (siehe LOOKTAB) linearisieren.

Beschaltung von Ausgangsports

Bild 1
Hier wird eine LED über einen Vorwiderstand direkt an einem Port betrieben. Die Ports der OM können maximal 10 mA schalten. Ist der Port "high", dann ist die LED an. Ist der Port "low", dann ist die LED aus. Sogenannte Low-Current-LEDs kommen mit weniger Strom aus und der Widerstand R1 läßt sich dann vergrößern.

Bild 2
Um die Schaltleistung zu verstärken kann man einen Transistor verwenden. Je nach Type lassen sich so mehrere Ampere schalten. Bei diesem Beispiel mit PNP-Transistor ist die Lampe aus, wenn der Port "high" ist.

Bild 3
Mit dieser Schaltung wird gezeigt, wie ein Relais angeschlossen werden kann. Durch die Verwendung eines Relais erhält man gleichzeitig eine galvanische Trennung. So können Geräte geschaltet werden die eine größere Spannung haben. Die Freilaufdiode D1 ist unbedingt erforderlich, da der Transistor oder der Controller sonst zerstört werden könnte.

Bild 4
Der ULN2803 besteht aus mehreren Transistoren. Mit diesem Schaltkreis können 8 Ports verstärkt werden. Wenn mehrere Ausgänge verwendet werden, dann ist das IC eine gute Alternative zu Transistoren. Die maximale Strombelastbarkeit liegt bei 1 Ampere.

Bild 5
Bei einigen Anwendungen ist eine galvanische Trennung zwingend notwendig, ohne daß man eine große Schaltleistung benötigt. Dafür kann man auch einen Optokoppler verwenden.

Bild 6
Ein Solid-State-Relais ist ein elektronisches Relais. Es verfügt auch über eine galvanische Trennung. Allerdings besitzen Solid-State-Relais keine Mechanik und können daher schneller schalten und sie haben keine Verschleißteile, was eine hohe Lebensdauer garantiert.

Pinbelegung der Open-Control M-Unit

Hier die ausführliche Auflistung aller Pins des AW60-Controllers und ob sie bei der Open-Control M-Unit-Hardware, auf der die Open-Maxi basiert, an einer Standard-Stiftleiste liegt, die bereits die C-Control 1.1 M-Unit zur Verfügung stellte, oder aber an einer neuen Stiftleiste.

Pin am AW60-
Controller
Pin-Bezeichnung
laut Freescale
Auf Standard-
Stiftleiste
oder neue
Stiftleiste
Pinfunktion im
Open-Maxi-Betriebssystem

(Funktion in Klammern wird
nicht vom OS bereitgestellt)
Alternative oder
optionale Pinfunktion

(Funktion in Klammern wird
nicht vom OS bereitgestellt)
         
26 PTA0
standard
PORT[1]  
27 PTA1
standard
PORT[2]  
28 PTA2
standard
PORT[3]  
29 PTA3
standard
PORT[4]  
30 PTA4
standard
PORT[5]  
31 PTA5
standard
PORT[6]  
32 PTA6
standard
PORT[7]  
33 PTA7
standard
PORT[8]  
   
 
   
34 PTB0/AD1P0
standard
PORT[9] AD[9]
35 PTB1/AD1P1
standard
PORT[10] AD[10]
36 PTB2/AD1P2
standard
PORT[11] AD[11]
37 PTB3/AD1P3
standard
PORT[12] AD[12]
38 PTB4/AD1P4
standard
PORT[13] AD[13]
39 PTB5/AD1P5
standard
PORT[14] AD[14]
40 PTB6/AD1P6
standard
PORT[15] AD[15]
41 PTB7/AD1P7
standard
PORT[16] AD[16]
   
 
   
60 PTC0/SCL1
standard
SCL PORT[17]
61 PTC1/SDA1
standard
SDA PORT[18]
62 PTC2/MCLK
neu
(MCLK) PORT[19]
63 PTC3/TxD2
standard
TXD PORT[20]
01 PTC4
neu
RTS PORT[21]
64 PTC5/RxD2
standard
RXD PORT[22]
09 PTC6
neu
CTS PORT[23]
   
 
   
42 PTD0/AD1P8
standard
AD[1] PORT[25]
43 PTD1/AD1P9
standard
AD[2] PORT[26]
46 PTD2/KBI1P5/AD1P10
standard
AD[3] PORT[27]
47 PTD3/KBI1P6/AD1P11
standard
AD[4] PORT[28]
50 PTD4/TPM2CLK/AD1P12
standard
AD[5] PORT[29]
51 PTD5/AD1P13
standard
AD[6] PORT[30]
52 PTD6/TPM1CLK/AD1P14
standard
AD[7] PORT[31]
53 PTD7/KBI1P7/AD1P15
standard
AD[8] PORT[32]
   
 
   
13 PTE0/TxD1
neu
PORT[33] (TXD2)
14 PTE1/RxD1
neu
PORT[34] (RXD2)
15 PTE2/TPM1CH0
neu
PORT[35] (SERVO1)
16 PTE3/TPM1CH1
neu
PORT[36] (SERVO2)
17 PTE4/SS1
neu
PORT[37] (SS)
18 PTE5/MISO1
neu
PORT[38] (MISO)
19 PTE6/MOSI1
neu
PORT[39] (MOSI)
20 PTE7/SPSCK1
neu
PORT[40] (SPSCK)
   
 
   
04 PTF0/TPM1CH2
standard
BEEP PORT[41]
05 PTF1/TPM1CH3
standard
TEST PORT[42]
06 PTF2/TPM1CH4
standard
FREQ1 PORT[43]
07 PTF3/TPM1CH5
standard
FREQ2 PORT[44]
08 PTF4/TPM2CH0
standard
DA[1] PORT[45]
11 PTF5/TPM2CH1
standard
DA[2] PORT[46]
12 PTF6
neu
(RTS2) PORT[47]
10 PTF7
neu
(CTS2) PORT[48]
   
 
   
23 PTG0/KBI1P0
standard
START PORT[49]
24 PTG1/KBI1P1
neu
RUN-LED PORT[50]
25 PTG2/KBI1P2
neu
ACTIVE-LED PORT[51]
48 PTG3/KBI1P3
neu
DCFOK-LED PORT[52]
49 PTG4/KBI1P4
neu
(KEYB) PORT[53]
57 PTG5/XTAL
---
XTAL PORT[54]
58 PTG6/EXTAL
---
EXTAL PORT[55]
   
 
   
03 RESET
standard
RESET  
02 IRQ
standard
IRQ  
56 BKGD/MS
neu
BKGD  
   
 
   
22 VDD
standard
VDD  
21 VSS
standard
GND  
59 VSS
standard
GND  
44 VDDAD
neu
VDDAD  
45 VSSAD
---
GND  
54 VREFH
standard
UREF  
55 VREFL
---
GND  

Tips und Tricks

Die ConTEXT-Entwicklungsumgebung

Um ein BASIC-Programm komfortabel zu erstellen und auf die OM zu übertragen, benötigt man eine sogenannte integrierte Entwicklungsumgebung (IDE). Eine Entwicklungsumgebung besteht aus mehreren Tools, die aufeinander abgestimmt werden müssen. Bei vielen Anwendern ist die Entwicklungsumgebung ConTEXT sehr beliebt. ConTEXT enthält unter anderem einen komfortablen Programm-Editor zum Erstellen der BASIC-Programme. Das Tool kann auf der Internetseite http://www.contexteditor.org kostenlos heruntergeladen werden. Da ConTEXT aber nur den Editor bereitstellt, benötigt man noch einen BASIC-Compiler und ein Übertragungstool ("Downloadtool") um das erstellte und übersetzte BASIC-Programm auf die OM zu laden. Als BASIC-Compiler wird am sinnvollsten der eigens für die OM entwickelte Open-Control/BASIC-Compiler (OCBAS.EXE) von Dietmar Harlos verwendet. Als Übertragungstool hat sich unter Windows besonders OMDLWIN bewährt. Beide Programme können bei den Downloads heruntergeladen werden. OMDLWIN läßt sich komfortabel in die ConTEXT-IDE einbinden, auf Tastendruck starten und kann den OM-Controller nach einer erfolgreichen Übertragung automatisch starten. ZIP-Archive lassen sich übrigens mittels WinZip entpacken.



Bevor man mit der Programmierung der OM beginnen kann, muß man aber erst noch diese Tools aufeinander abstimmen. Außerdem ist es sinnvoll, noch ein Terminal-Programm mit in die Programmierumgebung einzubinden. Mit dem Terminal-Programm kann man sich dann die Daten anschauen, die von der OM über die Serielle Schnittstelle per PRINT oder PUT gesendet werden. Man kann damit auch Zeichen und Texte über die PC-Tastatur eingeben und zur OM senden. In der Betatestphase hat sich das Terminal-Programm für die C-Control von Dietmar Harlos (TERMINAL.EXE) hervorragend bewährt. Das Terminal-Programm liegt dem ZIP-Archiv mit den Übertragungstools bei. Auf der Downloadseite gibt es auch das vollkompatible Terminalprogramm für Windows von Jens Gürtler. Es sollte unter zum Beispiel Windows 7 Home eingesetzt werden, weil das andere Terminalprogramm unter dieser Windows-Version nicht funktioniert.

Nachfolgend wird detailliert beschrieben, wie solch eine Konfiguration aussehen kann.

Zuerst erstellt man auf Laufwerk C: ein Verzeichnis mit dem Namen OM-Tools. Es läßt sich also über den Pfad C:\OM-Tools ansprechen. In dieses Verzeichnis wird nun der BASIC-Compiler OCBAS.EXE, der BASIC-Compiler OCBAS32.EXE, das Übertragungstool OMDLWIN.EXE und das Terminal-Programm TERMINAL.EXE hineinkopiert. Es befinden sich also nach dem Kopieren die vier Dateien in dem Verzeichnis C:\OM-Tools. Selbstverständlich ist es auch möglich, die Hilfsprogramme in einem anderen Verzeichnis abzulegen. Dann müssen in der folgenden Anleitung allerdings die Pfade zu den Dateien angepaßt werden.

Jetzt wird ConTEXT in der deutschen Version installiert. Dabei wird immer den Anweisungen gefolgt, bis die Installation abgeschlossen ist. Nach der Installation sollte sich ein ConTEXT-Icon auf dem Desktop befinden. Damit ist die halbe Arbeit bereits getan und die Programme müssen nur noch aufeinander abgestimmt werden.

Dazu startet man jetzt ConTEXT und geht auf den Menüpunkt Einstellungen. Danach auf den Menüpunkt Umgebungseinstellungen. Dann wechselt man auf Benutzerbefehle. Jetzt werden die Einstellungen der einzelnen Tools festgelegt. Dazu ruft man Neu auf. Es öffnet sich ein neues Fenster in dem jetzt bas eingefügt und dann auf OK geklickt wird. Jetzt wird als Benutzerbefehl bas mit den Zweigen F9, F10, F11, F12 angezeigt.

Man klickt jetzt einfach auf F9 und kann dann Angaben zum Tool machen, das starten soll, wenn die Taste F9 in ConTEXT gedrückt wird. Wir belegen jetzt F9 mit dem BASIC-Compiler. Bei Ausführen wird jetzt C:\OM-Tools\OCBAS32.EXE eingegeben. Bei Start in ein %p (das p unbedingt klein schreiben). Bei Parameter wird ein %n -withfilename eingetragen. Bei Fenster wird Normal ausgewählt. Bei Hinweis wird BASIC-Compiler eingetragen und bei Speichern wird aktuelle Datei eingetragen. Jetzt folgen noch ein paar Häkchen und der BASIC-Compiler ist fertig eingerichtet. Bei Benutze kurze DOS-Dateinamen, bei Konsolenausgabe aufzeichnen und bei Konsolenausgabe zur letzten Zeile scrollen wird ein Häkchen gesetzt. Bei Regel für Compiler-Ausgabe wird %n(%l) eingetragen. Damit sind wir fertig. Diese Einstellungen werden erst einmal mit Übernehmen abgespeichert.

Jetzt klickt man auf F10 und gibt die Parameter des Übertragungstools ein. Bei Ausführen wird C:\OM-Tools\OMDLWIN.EXE eingegeben. Bei Start in ein %p (das p unbedingt klein schreiben). Bei Parameter wird %F.DAT COM1 autobaud autostart (das F unbedingt groß schreiben, kein Leerzeichen zwischen %F und .DAT) eingetragen. Das COM1 bezieht sich auf die erste Serielle Schnittstelle. Wird die OM an einem anderen COM-Port angeschlossen, so muß natürlich der entsprechende COM-Port eingetragen werden (COM2, COM3, COM4 oder andere). Es existieren Konverter, die USB nach RS232 wandeln können. Damit läßt sich die OM auch über USB programmieren. In diesem Fall muß der virtuelle COM-Port des Treibers eingetragen werden. Durch das "autostart" wird der OM-Controller nach einer erfolgreichen Programmübertragung automatisch gestartet. Durch "autobaud" wird automatisch die maximal mögliche Übertragungsgeschwindigkeit gewählt. Das ist nützlich auf der Open-Macro und Open-Maxi. Bei Fenster wird wieder Normal ausgewählt und bei Hinweis wird DAT übertragen eingetragen. Bei Benutze kurze DOS-Dateinamen wird ein Häkchen gesetzt. In den anderen Feldern wird wieder nichts eingetragen. Diese Einstellungen werden mit Übernehmen gespeichert.

Jetzt klickt man auf F11 und trägt das Terminal-Programm ein. Bei Ausführen wird C:\OM-Tools\TERMINAL.EXE eingegeben. Bei Fenster wird Normal ausgewählt und bei Hinweis wird Terminal starten eingetragen. In den anderen Feldern wird wieder nichts eingetragen und es werden auch keine Häkchen gesetzt. Die Einstellungen werden jetzt mit Übernehmen gespeichert und danach wird die Umgebungseinstellung mit OK verlassen.

ConTEXT ist jetzt konfiguriert und es können BASIC-Programme editiert, compiliert und auf die OM geladen werden. Wer im externen Assembler AS05 programmieren möchte, kann diese Einstellungen natürlich auch für den Assembler AS05.EXE vornehmen. Dazu bei den Benutzerbefehlen wieder Neu aufrufen und die neue Gruppe asm anlegen. Sinnvollerweise legt man den Assembler auf die Taste F9. Als Parameter sollte -sl %n eingetragen werden. Auf die beschriebene Weise können natürlich auch andere Programme in ConTEXT eingebunden werden, die den Umgang mit der OM erleichtern. Zum Beispiel das Hilfsprogramm zum Starten der OM über die Serielle Schnittstelle.

Um ein Programm in die Open-Macro zu laden muß der Schalter auf dem PE-Board in Stellung Host stehen. Danach wird die Versorgungsspannung eingeschaltet und der Schalter sinnvollerweise auf Run zurückgestellt. Bei der Open-Maxi geht man folgendermaßen vor: Den AUTOSTART-Jumper nicht setzen und die Betriebsspannung anlegen. Zuerst sollte man ein Demo-Programm auf die OM laden, um sich zu vergewissern, daß die vorgenommenen Einstellungen korrekt sind. Dazu eignet sich gut die Datei MICRO_BM.BAS aus dem ZIP-Archiv mit den diversen Beispielen. Dazu öffnet man die Datei MICRO_BM.BAS in ConTEXT. Unmittelbar nach dem Öffnen wird der Quellcode der Datei im Editor angezeigt, den man mit den üblichen Editierkommandos verändern könnte.

Oberhalb im Menü sind 4 kleine Köpfe (Benutzerbefehle) abgebildet. Bewegt man den Mauszeiger über den ersten Kopf so wird BASIC-Compiler (F9) angezeigt. Sobald man ihn anklickt, wird eine Datei namens MICRO_BM.DAT erzeugt. Sie enthält den fertig übersetzten sogenannten Tokencode. Falls Fehler im Quellcode enthalten sein sollten, dann wird das im unteren Teil (in der Konsolenausgabe) von ConTEXT angezeigt und die DAT-Datei nicht erstellt. Durch Doppelklicken auf die Fehlermeldung springt der Cursor zur Zeile mit dem Fehler in der Quellcodedatei. Danach klickt man auf den zweiten Kopf bei dem DAT übertragen (F10) angezeigt wird. Jetzt wird die Datei MICRO_BM.DAT auf die OM geladen. Es muß also immer zuerst die BAS-Datei in eine DAT-Datei compiliert und diese dann übertragen werden. Nachdem die Datei erfolgreich übertragen wurde, wird jetzt der dritte Kopf bei dem Terminal starten angezeigt wird, angeklickt. Es öffnet sich das Terminal-Programm in einem Fenster. Falls das Programm in der OM noch nicht per OMDLWIN und "autostart" gestartet wurde, kann es durch den Reset-Knopf auf dem PE-Board oder durch Drücken der Eingabetaste (auch Enter oder Return genannt) im Terminal-Fenster gestartet werden. Wenn alles ordnungsgemäß funktioniert, dann wird im Terminal-Programm jetzt immer wieder Ergebnis: 10480 I/s (Open-Macro) angezeigt. Wenn man genug davon hat, kann man den Controller ausstellen und das Terminal-Programm durch Drücken auf die Taste ESC beenden.

Auf der Open-Maxi gilt: Während der Anwender sein Programm entwickelt, sollte der AUTOSTART-Jumper nicht gesetzt werden. Das ist auch nicht notwendig, denn die Open-Maxi wird durch das Downloadtool OMDLWIN oder durch Drücken der Eingabetaste (auch Enter oder Return genannt) im Terminal gestartet. Wenn das Programm fertig entwickelt ist, kann der AUTOSTART-Jumper gesetzt werden. Er wird von der Open-Maxi nur einmal nach RESET und nach jedem END abgefragt. Also nicht wie auf der C-Control I Version 1.1 ständig in der Idleloop, bzw. im Hostmode. Mittels "End2Host=ON : END" kann der Anwender wie bei den bisherigen OM-Controllern auch bei gesetztem AUTOSTART-Jumper in den Hostmode gelangen und ein neues Programm in die Open-Maxi übertragen.

Im Menüpunkt Einstellungen gibt es den Eintrag Einstellungen exportieren (Registry), mit dem man die oben vorgenommenen Einstellungen sichern kann. Damit stehen diese Einstellungen für eine Neuinstallation von ConTEXT zur Verfügung.

Schneller Programmdownload

Es existiert ein Downloadtool namens OMDLWIN.EXE, das speziell für die OM-Controller entwickelt wurde und unter Windows läuft. Ab Version 1.3 dieses Downloadtools unterstützt es den neuen Parameter "AUTOBAUD", der statt der Baudrate angegeben werden kann, und auf der Open-Macro die schnellstmögliche Baudrate automatisch wählt, falls die Hardware-RS232 (ESCI) aktiviert ist. Mit ESCI und AUTOBAUD werden Programme bis zu zehnmal schneller übertragen! Im ZIP-Archiv, in dem sich OMDLWIN.EXE ab Version 1.3 befindet, existiert auch die INFO.TXT-Datei. Hier wird beschrieben, auf welche Weise der Anwender das ESCI der Open-Macro für den Programmdownload aktivieren kann.

Die Open-Maxi bietet komfortablen Programmdownload mit bis zu 115200 Baud an der Standard-Schnittstelle. Ab OMDLWIN.EXE Version 1.4 wird damit ein 58782 Byte großes Programm in 12 Sekunden übertragen. Um diesen schnellen Download zu aktivieren, muß ebenfalls der Parameter "AUTOBAUD" verwendet werden.

Die Adreßaufteilung

Beim QB8-Controller reicht der Flash-Speicher von Adresse $de00 bis einschließlich $fdff. Er hat also mit 8192 Byte die doppelte Größe wie auf dem QT4/QY4. Der Speicher wird in Flash-Pages mit 64 Byte Größe verwaltet. Das Betriebssystem der Open-Macro reicht von Adresse $de00 bis einschließlich $e8bf und belegt somit 2752 Byte. Der Zeiger mit der Startadresse der Datendatei steht direkt hinter dem Betriebssystem auf $e8c0 und der Tokencode beginnt bei $e8c2. Falls ein Assemblermodul mit SYSCODE in den BASIC-Sourcecode eingebunden wird, belegt es wie auf den anderen kleinen OM-Controllern die letzten 256 Byte des Flash-Speichers ab Adresse $fd00.

Beim AW60-Controller reicht der Flash-Speicher von Adresse $0870 bis einschließlich $17ff und von $1860 bis einschließlich $ffff. Er hat also mit 63280 Byte eine beachtliche Größe. Der Speicher wird in Flash-Pages mit 512 Byte Größe verwaltet. Das Betriebssystem der Open-Maxi reicht von Adresse $0a00 bis einschließlich $17ff und von $fe00 bis $ffff und belegt somit 4096 Byte. Übrigens hat der Sourcecode des Betriebssystems 5329 Zeilen. (Zum Vergleich: Open-Micro und Open-Mini: 2483 Zeilen, Open-Midi: 2597 Zeilen, Open-Macro: 3848 Zeilen.) Die Länge der Tokendatei steht auf $1860 und der Tokencode beginnt bei $1862. Falls ein Assemblermodul mit SYSCODE in den BASIC-Sourcecode eingebunden wird, belegt es 400 Byte des Flash-Speichers und beginnt auf Adresse $0900.

Informationen in der Definitionsdatei

Es lohnt sich besonders für fortgeschrittene Anwender, auch einmal einen Blick in die Definitionsdatei der verschiedenen OM-Controller zu werfen. Die jeweils aktuelle Datei kann auf der offiziellen Informationssite heruntergeladen werden. Die Definitionsdatei für die Open-Macro trägt den Namen OMAC.DEF und die zur Open-Maxi passende heißt OMAX.DEF. Die Datei enthält die unbedingt notwendigen Definitionen für die neuen internen Variablen zum Konfigurieren des Betriebssystems, zur Statusabfrage und zum Einbinden der User-Interruptroutine in verschiedene Interrupts. Außerdem sind am Ende der Datei die Definitionen für den integrierten Assembler aufgeführt, um auf alle Register der Controller-Module zugreifen zu können. Damit lassen sich alle vom Controller bereitgestellten Funktionen nutzen. Die Informationen in der Datei beschränken sich jedoch nicht nur auf reine Definitionen, sondern es wurden auch viele nützliche Bemerkungen und Hinweise eingefügt.

Die Firmwareroutinen

Die Betriebssysteme der OM-Controller stellen bis zu 15 nützliche Firmwareroutinen zur Verfügung, die der Anwender in eigenen Assemblerprogrammen benutzen kann. Dazu muß die Datei OM_FW.PRO mittels INCLUDE eingebunden werden. In der Datei sind die diversen Firmwareroutinen ausführlich beschrieben. Die jeweils aktuelle Datei kann auf der offiziellen Informationssite heruntergeladen werden.

Dauerhafte Datenspeicherung an fester Adresse

Manchmal ist es auf der Open-Macro wünschenswert, Daten dauerhaft zu speichern. Dafür können normalerweise die Dateifunktionen verwendet werden. Allerdings werden die Daten in der Datei gelöscht, sobald ein neues Programm in den Controller geladen wird. Außerdem werden sie immer im Flash-Speicher auf der ersten Seite (Page) hinter dem BASIC-Programm abgelegt. Die Adresse ist also abhängig von der Größe des BASIC-Programms.

Durch Umbiegen des Dateizeigers FILEPOS ist es allerdings möglich, jede beliebige Adresse des Flash-Speichers auszulesen und zu beschreiben. Der Flash-Speicher läßt sich aber nur pageweise löschen. Dieser Löschvorgang wird von den Dateifunktionen nur dann automatisch durchgeführt, wenn auf den Beginn einer Page geschrieben wird.

Das jeweils erste Byte einer jeden Flash-Page steht an Adresse $xx00, $xx40, $xx80 und $xxc0. Wenn ein SYSCODE-Assemblermodul vorhanden ist und nicht überschrieben werden darf, dann könnte man Daten auf der Flash-Page vor dem Assemblermodul, auf Adresse $fcc0 abspeichern. Wenn kein SYSCODE-Assemblermodul vorhanden ist oder es eine Größe von 192 Byte oder weniger hat, dann könnte man die Flash-Page $fdc0 benutzen. Auf diese Weise werden bis zu 64 Byte Daten jeweils am Ende des nutzbaren Flash-Speichers abgelegt.

Auf der Open-Maxi müssen keine solchen Tricks angewandt werden, da die Daten in der 32 kB großen I²C-EEPROM-Datei nicht durch das Übertragen eines Programms gelöscht werden.

Beispiel

Besonderheiten der Controller

Der Controller, auf dem die Open-Maxi basiert, enthält leider einen Fehler, den Freescale (heute NXP) verschuldet hat: Der Oszillator soll laut den Angaben von Freescale unterhalb von 0 °C nicht mehr zuverlässig funktionieren. Der "Internal Clock Generator" des AW60s ist sehr komplex, deshalb gibt mehrere Möglichkeiten, diesen Fehler zu umgehen. Die sinnvollste Methode ist, das Bit "High Gain Oscillator Select" (HGO) zu aktivieren. Dadurch benötigt der Controller laut meinen Messungen allerdings rund 3 mA mehr Strom. Auf der offiziellen OM-Infosite kann das Programm NVCONFIG.BAS ("Konfiguration der Open-Maxi") heruntergeladen werden, mit dem sich das Betriebssystem der Open-Maxi dauerhaft umkonfiguriert läßt und so auch eine Verwendung bei Minusgraden erlaubt.

Bei der Open-Maxi sollte man vorsichtig sein mit zu hoher Betriebsspannung: Laut Freescale beträgt die absolut maximale Betriebsspannung (VDD) des AW60s nur 5.8 Volt. Über diesem Wert kann der Controller zerstört werden. Beim QT4, QY4 und QB8 lag dieser Wert bei 6.0 Volt.

Die Stromaufnahme des AW60s bei einem Bustakt von 20 MHz beträgt typisch 16.8 mA bei 5 Volt. Es macht also Sinn, einen niedrigeren Takt zu benutzen. Das geht zum Beispiel mit SLOWMODE ON sehr komfortabel.

Bei der jetzigen Open-Control M-Unit ist die Spannungsversorgung für den AD-Wandler ("VDDAD") separat herausgeführt und kann vom Anwender als zusätzliches Feature besser als die Betriebsspannung für die digitalen Funktionen gefiltert werden. Das heißt aber, VDDAD hängt in der Luft, wenn kein Jumper auf zwei Stifte einer Stiftleiste aufgesetzt wird. Der Jumper muß zwischen die Pins VDDAD und 5 Volt (unten rechts) gesetzt werden.

Die AD-Ports AD[1] bis AD[8] liegen bei der Open-Maxi genauso wie bei der C-Control I Version 1.1 standardmäßig in der Luft, was ungünstig ist. Wenn der Anwender nicht alle AD-Ports benötigt, sollte er die nicht verwendeten auf festes Potential legen. Sie können zum Beispiel auf I/O-Port-Funktion umgeschaltet und die internen Pull-Up-Widerstände aktiviert werden.

Auf der Open-Maxi ist das LVD-Modul auf 5 Volt konfiguriert. Messungen zeigten, daß der AW60-Controller bei 4.25 Volt Betriebsspannung stehenbleibt und bei 4.35 Volt wieder anfängt zu laufen.

Die C-Control I Version 1.1 setzt bei HANDSHAKE OFF die RTS-Leitung auf low. Das passiert bei der Open-Maxi erst, wenn versucht wird, Daten von der Seriellen Schnittstelle zu holen.

Die LED-Ports werden vom Open-Maxi-Betriebssystem nach einem Reset auf Ausgang geschaltet. Die ACTIVE-LED wird bei Programmstart eingeschaltet und bei Programmende ausgeschaltet. Die RUN-LED genauso, allerdings verlischt sie während PAUSE. Die DCF-OK-LED wird vom DCF77-Interrupt an- und ausgeschaltet. Er kann vom Anwender mit "Dcf77Dis=ON" deaktiviert werden.

Open-Maxi: Direkt nach Systemstart arbeitet der AW60 laut meinen Messungen mit stabilen 20 MHz Bustakt, die mittels 4 MHz Quarz erzeugt werden. Wenn man nun aber den Oszillator streßt, indem man den EXTAL-Pin über einen niederohmigen Widerstand auf Masse zieht, setzt der Takt aus. Der Controller bleibt aber nicht einfach stehen, sondern wird durch eine Art "Not-Taktung" weiterhin intern getaktet. Aber dadurch fängt der Bustakt an, in einem Bereich von +/- 0.1% zu pendeln und bleibt in diesem Zustand bis zum nächsten Reset oder bis das Anwenderprogramm wieder auf den externen Takt umschaltet. Dieser Wert liegt völlig in den Spezifikationen, denn Freescale gibt im Anhang des Manuals einen CJitter von max. 0.2% an. Es ist also beim AW60 völlig normal, daß der Bustakt in einem gewissen Frequenzbereich hin- und herpendelt. Das liegt daran, daß der Takt per FLL ("frequency-locked loop") generiert wird.

Das IIC-Modul vom AW60 ist kaum dokumentiert, umständlich, macht vieles automatisch, ist kaum getestet und kennt kein I²C-INIT. Deshalb verwendet das Open-Maxi-Betriebssystem die erprobten in Software emulierten Routinen der bisherigen OM-Controller. Sie belegen kaum (ca. 40 Byte) mehr OS-Speicher als die IIC-Routinen. Der I²C-Bustakt ist konfigurierbar. In eigenen Programmen kann das IIC-Modul aktiviert und ohne Einschränkungen benutzt werden.

OCBASIC unterstützt bei der Open-Maxi die EXT-Adressierungsart bei LDHX, STHX und CMPHX. Außerdem gibt es den neuen Assemblerbefehl BGND. Andere neue Befehle der HCS08-CPU werden nicht unterstützt.

Daß Assemblerprogramme für die C-Control I Version 1.1 auf der Open-Maxi ohne Neuübersetzung laufen, ist sehr unrealistisch. Denn: Das Speicherlayout der Ports ist anders, der Rechenstack ist anders und an anderer Adresse, der SYSCODE-Bereich beginnt an Adresse $0900 statt $0101 (wird evt. durch SYS hingebogen), Assembler-Interruptroutinen werden anders vereinbart, der Bustakt ist viel höher, USER-RAM liegt an anderer Adresse ($aa statt $a1), Einsprünge ins OS sind notgedrungen nicht an gleicher Adresse und I²C ist anders.

Damit das Betriebssystem nicht zuviel Platz einnimmt, unterstützt die Open-Maxi keinen Hostmode-Befehl zum Auslesen des BASIC- oder SYSCODE-Programms. Es ist aber ein Auslesen über das BDC-Interface am Pin BKGD möglich. Wenn ein Anwender das Auslesen komplett unterbinden möchte, muß er die Security Options des AW60 aktivieren. Siehe Controllermanual zum AW60 von Freescale. Das ist aber noch ungetestet.

Der von DIE HARD entworfene Benchmark zur C-Control Pro befindet sich im Forumsbeitrag 397 und 425.

Beim Einstieg in den Hostmode per "End2Host=ON : END" wird der Empfangsbuffer der Seriellen Schnittstelle nicht geleert.

Die meisten QB8-Controller werden von Freescale offenbar für 3 Volt Betriebsspannung kalibriert, so daß sie bei 5 Volt rund 2,5% zu langsam arbeiten. Dadurch kann es bei CCPLUS und bei der CCBASIC-Windows-IDE während des Programmdownloads zu Übertragungsfehlern kommen. Um die Taktrate dauerhaft zu kalibrieren kann das Utility OSCTRIM verwendet werden. Die bei CCTools verkauften Controller wurden bereits getrimmt.



Bei der Open-Macro ist der Pin PTA2/IRQ sehr empfindlich gegenüber elektromagnetischen Störungen (EMV). In gestörter Umgebung genügt bereits ein Berühren des Ports, um einen Reset auszulösen. In der späteren Applikation sollte deshalb wie im Bild gezeigt eine Z-Diode 5V1 vom Pin nach Masse geschaltet werden. Alternativ läßt sich Störspannung auch mittels herkömmlicher Diode 1N4148 nach VDD (5 Volt) ableiten. Letztere Variante ist aber weniger effektiv. Natürlich könnte man den Pin auch direkt auf VDD legen. In diesem Fall läßt sich der Port allerdings nicht mehr in der Applikation verwenden.

Dateinamenserweiterungen anzeigen

Nicht zuletzt zum Schutz vor Viren und anderen bösartigen Programmen ist es sinnvoll, die sogenannte Dateinamenserweiterung, auch Dateiendung oder Suffix genannt, von grundsätzlich allen Dateitypen im Windows Explorer anzeigen zu lassen. Zum Beispiel haben ausführbare Programme die Endung "EXE", während ASCII-Textdateien meist die Endung "TXT" besitzen. Unter jeder Windowsversion läßt sich die Anzeige dieser zusätzlichen Information auf etwas unterschiedliche Art und Weise aktivieren. In den folgenden zwei Bildern wird gezeigt, wie es unter Windows 2000 funktioniert.




DOS-Programme unter Windows

Zur Herstellung der OM-Controller und zur Programmentwicklung werden überwiegend sogenannte DOS-Programme eingesetzt. Neuere Windowsversionen arbeiten bei der Ausführung von DOS-Programmen etwas anders als beispielsweise Windows 95 oder 98. Nachdem ein DOS-Programm zum Beispiel im Windows Explorer per Doppelklick gestartet wurde, wird wie bisher ein DOS-Fenster geöffnet, in dem die Ausgaben des Programms erscheinen. Falls das Programm nur einen kurzen Hinweistext über dessen Benutzung ausgibt wird das Fenster nun aber sehr schnell wieder geschlossen und die Ausgaben gehen verloren. Das läßt sich konfigurieren: Im Windows Explorer muß das DOS-Programm ausgewählt und anschließend die rechte Maustaste gedrückt werden. Es erscheint das sogenannte Kontextmenü, dessen letzter Eintrag "Eigenschaften" lautet. In diesen Eigenschaften kann "Nach Beenden schließen", wie im folgenden Bild gezeigt, deaktiviert werden.


Unterstützter Befehlsumfang

In der folgenden Tabelle ist aufgeführt, welche Befehle (genauer Tokenbefehle) von der C-Control-Micro und den verschiedenen OM-Mikrocontroller-Varianten unterstützt werden. Ein Sternchen steht dafür, daß der entsprechende Befehl unterstützt wird, ein Bindestrich steht für das Gegenteil.

Bisher bekannte Fehler und Einschränkungen sind unterhalb der Tabelle aufgelistet. Die Liste der Einschränkungen bei der C-Control-Micro ist allerdings nicht vollständig. Beispielsweise sorgt ein verändertes Stackhandling dafür, daß mBasic, CCPLUS und einige OCBASIC- und CCBASIC-Programme nicht mehr mit der C-Control-Micro zusammenarbeiten. Bei fehlerhafter Verwendung von GOSUB und RETURN und bei Berechnungen kann unbemerkt der Stack überlaufen, woraufhin wichtige System- oder Anwenderdaten überschrieben werden. Außerdem wurde im Betriebssystem sehr viel Platz verschenkt, weshalb der den Anwendungen zur Verfügung stehende Programmspeicher deutlich kleiner als bei den OM-Controllern ausfällt. Schließlich läßt sich die Version 2.00 der C-Control-Micro kaum per S19-Systemerweiterung erweitern, weil die meisten Systemerweiterungen nur auf der Version 2.01 arbeiten. Weitere Nachteile gegenüber den OM-Controllern können an anderer Stelle in den Dokus nachgelesen werden.

Einige Funktionen in den OM-Controllern haben Bonuscharakter und sind deshalb nur von eingeschränktem Nutzen. Da sich auf den OM-Controllern allerdings jede Funktion mittels nachladbarem Softwaremodul ersetzen oder nachrüsten läßt, können auch diese Bonusfunktionen bei Bedarf ersetzt werden. Auf diese Weise kann auf der Open-Micro und Open-Mini sogar vollwertiges WORD-Handling realisiert werden, obwohl diese Controller von Haus aus nur BYTE-Arithmetik zur Verfügung stellen. Die Tabelle gibt also den Sachverhalt ohne Erweiterungen wieder.

Token Zugehöriger Befehl C-Control-Micro 2.00 C-Control-Micro 2.01 Open-Micro Open-Mini Open-Midi Open-Macro Open-Maxi
0 NOP  -   -   *   *   *   *   * 
1 PUSH 0  -   -   *   *   *   *   * 
2 PAUSE  *   *1  *   *   *   *   * 
3 GOTO  *   *   *   *   *   *   * 
4 IF .. THEN  *2  *2  *   *   *   *   * 
5 GOSUB  *   *   *   *   *   *   * 
6 RETURN  *   *   *   *   *   *   * 
7 RETURN INTERRUPT  -   -   *   *   *   *   * 
8 SYS  *3  *3  *   *   *   *   * 
9 SLOWMODE  -   *   *   *   *   *   * 
10 PUSH BITPORT  *   *   *   *   *   *   * 
11 PUSH BYTEPORT  -   -   *   *   *   *   * 
12 PUSH WORDPORT  -   -    *13   *13   *13  *   * 
13 POP BITPORT  *4  *4  *   *   *   *   * 
14 POP BYTEPORT  -   -   *   *   *   *   * 
15 POP WORDPORT  -   -    *13   *13   *13  *   * 
16 PUSH ADPORT  *   *   *   *   *   *   * 
17 POP DAPORT  -   *5  -   -   -   -   * 
18 INLASM  -   -   *   *   *   *   * 
19 PUSH -1  -   -   *   *   *   *   * 
20 PUSH WORDVALUE  *   *   *   *   *   *   * 
21 PUSH BITVAR  *   *   *   *   *   *   * 
22 PUSH BYTEVAR  *   *   *   *   *   *   * 
23 PUSH WORDVAR  -   -   -   -   -   *   * 
24 POP BITVAR  *   *   *   *   *   *   * 
25 POP BYTEVAR  *   *   *   *   *   *   * 
26 POP WORDVAR  -   -   -   -   -   *   * 
27 LOOKTAB  *6  *6  *   *   *   *   * 
28 PUSH INTERNALVAR  *7  *7  *   *   *   *   * 
29 POP INTERNALVAR  *7  *7  *   *   *   *   * 
30 PRINT NUMBER  *8  *8  *   *   *   *   * 
31 PRINT STRING  *   *   *   *   *   *   * 
32 PUT  *   *   *   *   *   *   * 
33 RXD  -   -    *14   *14   *14  *   * 
34 GET  *   *   *   *   *   *   * 
35 INPUT  -   -   *   *   *   *   * 
36 ARRAY/POINTER  -   -   *   *   *   *   * 
37 CTS  -   -    *14   *14   *14   *14  * 
38 PRINTCRLF  -   -   *   *   *   *   * 
39 PUSH 1  -   -   *   *   *   *   * 
40 NOT  *   *   *   *   *   *   * 
41 AND  *   *   *   *   *   *   * 
42 NAND  -   -   *   *   *   *   * 
43 OR  *   *   *   *   *   *   * 
44 NOR  -   -   *   *   *   *   * 
45 XOR  *   *   *   *   *   *   * 
46 SHL  *9  *9  *   *   *   *   * 
47 SHR  *9  *9  *   *   *   *   * 
48 RANDOMIZE  -   -   *   *   *   *   * 
49 RAND  *10  *10  *   *   *   *   * 
50 NEGIEREN (-)  *   *   *   *   *   *   * 
51 ADDITION (+)  *   *   *   *   *   *   * 
52 SUBTRAKTION (-)  *   *   *   *   *   *   * 
53 MULTIPLIKATION (*)  *   *   *   *   *   *   * 
54 DIVISION (/)  *   *   *   *   *   *   * 
55 MOD  *   *   *   *   *   *   * 
56 ABS  -   -   *   *   *   *   * 
57 SQR  -   -   *   *   *   *   * 
58 MAX  -   -   *   *   *   *   * 
59 MIN  -   -   *   *   *   *   * 
60 GROESSER (>)  *   *   *   *   *   *   * 
61 GROESSER/GLEICH (>=)  *   *   *   *   *   *   * 
62 KLEINER (<)  *   *   *   *   *   *   * 
63 KLEINER/GLEICH (<=)  *   *   *   *   *   *   * 
64 GLEICH (=)  *   *   *   *   *   *   * 
65 UNGLEICH (<>)  *   *   *   *   *   *   * 
66 SGN  -   -    *15   *15   *15  *   * 
67 REMOVETOS  -   -   *   *   *   *   * 
68 ADD BYTEVAR,STACK  -   -   *   *   *   *   * 
69 ADD WORDVAR,STACK  -   -   -   -   -   *   * 
70 Filehandling (OPEN#, etc.)  -   -   *   *   *   *   * 
71 EOF  -   -   *   *   *   *   * 
72 BAUD   *11   *11   *16   *16   *16  *   * 
73 INTERRUPT  -   -   *   *   *   *   * 
74 FOR_NEXT_CMP BYTEVAR   *12  *   *   *   *   *   * 
75 FOR_NEXT_CMP WORDVAR  -   -   -   -   -   *   * 
76 FOR_NEXT_ADD BYTEVAR  *   *   *   *   *   *   * 
77 FOR_NEXT_ADD WORDVAR  -   -   -   -   -   *   * 
78 DBNZ  -   -   *   *   *   *   * 
79 PEEK & POKE  -   -   -   -   -   -   * 
80 TOG  *   *   *   *   *   *   * 
81 PULSE  -   -   *   *   *   *   * 
82 DEACT BITPORT  *   *   *   *   *   *   * 
83 DEACT BYTEPORT  -   -   *   *   *   *   * 
84 DEACT WORDPORT  -   -    *13   *13   *13  *   * 
85 PUSH BYTEVALUE  -   -   *   *   *   *   * 
86 PUSH BYTEVAR,BYTEVALUE  -   -   -   -   *   *   * 
87 PUSH WORDVAR,WORDVALUE  -   -   -   -   -   *   * 
88 LOOKTABBYTE  -   -   -   -   -   *   * 
89 I²C-LCD  -   -   -   -   -   -   * 
255 END  *   *   *   *   *   *   * 
   
1 Auf der C-Control-Micro funktioniert die Systemerweiterung zum Empfang von RC5-Signalen nicht richtig, wenn ein PAUSE-Befehl verwendet wird.
2 Die Funktion wurde fehlerhaft implementiert. Die C-Control-Micro führt IF STACK=255 THEN statt IF STACK<>0 THEN aus.
3 Nur Sprünge in den Bereich $FCxx und $FDxx werden unterstützt. Außerdem werden nur Assemblermodule mit dem korrekten Sicherungscode ausgeführt.
4 Nach Deaktivierungphasen (z.B. bei der Erstinitialisierung) können Störungen (Glitches) am Port auftreten.
5 Die PWM-Frequenz beträgt nur 50 Hz. Außerdem können Störungen beim Ändern des PWM-Werts auftreten.
6 Tabellen müssen WORD-Werte enthalten, obwohl der Controller nur BYTE-Werte verarbeiten kann.
7 Nicht auf alle internen Variablen kann lesend oder schreibend zugegriffen werden.
8 Die Ausgabe erfolgt bei Zahlen kleiner 10 mit einer führenden Null.
9 Die Funktion wurde fehlerhaft implementiert. Die C-Control-Micro führt SHL 0 und SHR 0 als SHL 256 und SHR 256 aus.
10 Sehr einfaches Verfahren. Liefert keine guten Zufallszahlen.
11 Die Baudrate von 19200 Baud wurde fehlerhaft implementiert. Der interne Oszillator der C-Control-Micro muß per FREQ2 nachgetrimmt werden.
12 Die Funktion wurde fehlerhaft implementiert. Die C-Control-Micro führt bei FOR..NEXT einen Schleifendurchlauf zu wenig aus.
   
13 Bonusfunktion: Läßt sich zum schnellen und speicherplatzschonenden Zugriff auf BYTEPORT[1] nutzen.
14 Bonusfunktion: Liefert immer ON zurück.
15 Bonusfunktion: Liefert höchstwertiges Bit (MSB) zurück.
16 Bonusfunktion: Parameter wird ignoriert. Ohne nachladbares Softwaremodul werden nur 9600 Baud unterstützt.

Seiten im Internet

Diese Seiten enthalten wertvolle Hinweise, Demos und Tools rund um die C-Control und die OM. Für den Fall, daß man nicht weiter weiß, kann man versuchen, hier eine Lösung für das Problem zu finden.

Die offizielle Informationssite zur OM
http://om.dharlos.de

Das Forum zur C-Control-1 und zur OM
http://ccintern.dharlos.de/forum

CCTools - Bezug der OM-Controller
http://www.cctools.eu

C-Control-intern - Informationen rund um das Betriebssystem der CC1.1
http://ccintern.dharlos.de

Besonders wichtig sind die offiziellen Websides zu den Controllern 68HC908QT4, QY4, QB8 und MC9S08AW60. Dort können Manuals, Beispielcode und Application Notes zum Controller und zur CPU heruntergeladen werden. Im Anhang des Manuals zum Controller befinden sich auch die umfangreichen Technischen Daten.

Offizielle Webside der Mikrocontroller MC68HC908QT4 (Open-Micro), MC68HC908QY4 (Open-Mini) und MC908QB8 (Open-Midi und Open-Macro)
http://www.nxp.com/products/microcontrollers-and-processors/more-processors/8-16-bit-mcus/8-bit-hc08/8-bit-eeprom-emulation-q-mcus:HC08Q

Offizielle Webside des Mikrocontrollers MC9S08AW60 (Open-Maxi)
http://www.nxp.com/products/microcontrollers-and-processors/more-processors/8-16-bit-mcus/8-bit-s08/8-bit-general-purpose-aw60-48-32-16-mcus:S08AW

Der AS05-Assembler von Frank A. Vorstenbosch ist der Defacto-Standard auf der C-Control 1.1, kann aber auch auf 68HC908-Mikrocontrollern wie der Open-Micro, Open-Mini, Open-Midi und Open-Macro eingesetzt werden, da die 6808-CPU objektcode- und quellcodekompatibel zur 6805er ist. Die HCS08-CPU des AW60s ist abwärtskompatibel zur 6808. Die Betriebssysteme wurden vollständig mit dem sehr zuverlässigen AS05-Assembler und Macros für die neuen 6808-Befehle erstellt.

Frank's Cross Assemblers
http://www.kingswood-consulting.co.uk/assemblers