„Ideen verändern die Welt – wenn sie umgesetzt werden.”
Norman Rentrop

Seit 1999 setzen wir Ideen im IT-Bereich mit neuen und innovativen Techniken um. Die Spannweite unserer Projekte reicht von kleinen elektronischen Basteleien über pfiffige Softwaretools bis hin zur komplexen datenbankgestützen Internetanwendung.

USBnub - JAL-Tutorial

Einleitung

Auf dieser Seite wird eine kurze Einführung in die Programmierung des USBnub mit der Programmiersprache JAL gegeben. Dazu wird zunächst die Syntax von JAL vorgestellt. Dieser Abschnitt setzt voraus, dass Sie bereits Erfahrung mit einer höheren Programmiersprache (etwa Basic, Pascal, C, C++ oder Java) besitzen. Anschließend demonstrieren praktische Beispiele den Einsatz von JAL zur Programmierung eines Mikrocontrollers. Benötigt wird nur eine USBnub Hardware und das freie Softwarepaket zum USBnub. Folgende Unterlagen bieten die Möglichkeit zum Nachschlagen und weiter vertiefen:

Crashkurs JAL

Die Syntax von JAL ist an die der Programmiersprache Pascal angelehnt. Im Folgenden wird kurz auf die wichtigsten Sprachkonstrukte eingegangen. Tiefergehende Informationen finden Sie im JALv2 User's Guide.

Variablen

Wie aus anderen Programmiersprachen bekannt bestehen Variablennamen in JAL aus Buchstaben, Zahlen und dem Unterstrich ("_"), wobei sie nicht mit einer Zahl beginnen dürfen. Die Deklaration einer Variablen geschieht mit dem Schlüsselwort VAR. Als Datentypen stehen zur Verfügung: BIT, BYTE (nicht vorzeichenbehaftet) und SBYTE (vorzeichenbehaftet), für die beiden letzteren kann noch eine Vielfachheit angegeben werden (z.B. BYTE*2 für eine nicht vorzeichenbehaftete 16-Bit Variable). Häufig genutzte Vielfachheiten sind vordefiniert: (S)WORD für (S)BYTE*2 und (S)DWORD für (S)BYTE*4.

VAR DWORD length VAR SBYTE*3 counter

Kontrollstrukturen

Die typischen Kontrollstrukturen wie if-Abfragen, case-Verzweigungen sowie for- und while-Schleifen stehen auch in JAL zur Verfügung. Im Gegensatz zu C oder Java werden jedoch keine geschweiften Klammern zur Eingrenzung von Blöcken genutzt:

if length == 10 then ... else ... end if
while length == 10 loop ... end loop
Die bei der Programmierung von Mikrocontrollern häufig genutzte Endlosschleife wird mit dem Schlüsselwort forever eingeleitet.

Prozeduren und Funktionen

Sie können in JAL eigene Unterprogramme schreiben. Je nach Rückgabewert nutzen Sie dazu das Schlüsselwort PROCEDURE (kein Rückgabewert) oder FUNCTION.

FUNCTION add(WORD IN a, WORD IN b) RETURN WORD IS RETURN a + b END FUNCTION

Ein erstes Beispielprogramm in Aktion

Die Installation der Entwicklungsumgebung und der Umgang damit werden mithilfe eines kleinen Beispielprogramms verdeutlicht.

Windows

Linux / MacOS X

Grundstruktur eines JAL-Programms

Nachdem die Entwicklungsumgebung eingerichtet ist, können wir uns dem Programmcode widmen. Im ersten Beispiel wird die Grundstruktur eines JAL-Programms bereits ersichtlich, auf die wir im Folgenden eingehen:

include 18f14k50 pragma target clock 48_000_000 enable_digital_io() pin_C7_direction = output var bit led is pin_C7 forever loop _usec_delay(1000_000) led = !led end loop
Die USBnub Hardware basiert auf einem PIC18F14K50. Daher werden die Definitionen für den PIC18F14K50 aus der jallib eingebunden. So sind alle Hardwareregister über Namen ansprechbar. Die Namensgebung orientiert sich dabei an den Bezeichnungen im Datenblatt.
USBnub läuft intern mit einem 48 MHz Takt. Die externen 12 MHz werden dazu mit einer PLL um den Faktor vier hochmultipliziert. Die Angabe der Taktfrequenz verwenden Bibliotheken, um zeitabhänige Funktionen zu realieren. So z.B. die verwendete Delay-Funktion, die in diesem Beispiel eine Pause von einer Sekunde erzwingt.
Um eine Ausgabe auf der angeschlossenen LED zu ermöglichen, werden die digitalen Ein-Ausgänge aktiviert und PIN RC7 als Ausgang geschalten. Um im Programm nicht ständig die wenig sagende Pinbezeichnung verwenden zu m¨ssen, wird die Variable led eingeführt.
In der Endlosschleife wird bei jedem Durchlauf nach einer Pause die Leuchtdiode per !-Operator invertiert geschalten.

Kontakt zur Aussenwelt: I/O-Grundlagen

Die Richtung jedes einzelnen Pins kann entweder auf Ein- oder Ausgang gesetzt werden. Dies geschieht mit den Aufrufen

pin_C7_direction = output pin_A3_direction = input
C7 bzw. A3 sind die Pinbezeichnungen. Im Datenblatt des Controllers sind sie als RC7 bzw. RA3 bezeichnet. Die beiden Pins sind im USBnub sind als Taster und Leuchtdiode verschalten. Möchte man die LED nur anschalten, wenn die Taste gedrückt ist, wäre dies so machbar:

var bit led is pin_C7 var bit switch is pin_A3 forever loop if switch == off then led = on else led = off end if end loop
Der Taster ist über einen externen Pullup-Widerstand nach +5V geschaltet. D.h. im Ruhezustand liegt ein High-Pegel am Mikrocontroller an. Im gedrückten Zustand wird der Eingang low. Daher invertierte Prüfung.
Hinweis: Wird der Taster verwendet, muss eventuell eine Entprellung vorgenommen werden.

Der Draht zum PC: USB als virtueller Comport

USBnubs Controller PIC18F14K50 besitzt ein USB-Client-Modul. Damit lassen sich diverse Applikationen zur Anbindung an einen Computer schaffen. Wir wollen uns mit der Kommunikation über einen virtuellen Comport befassen (USB-Geräteklasse "CDC, Communications Device Class"). Hierfür bietet jallib bereits fertige Funktionen, so dass ein Programm, welches Zeichen vom PC empfängt und wieder zurücksendet sehr einfach aussieht:

include 18f14k50 pragma target clock 48_000_000 include usb_serial usb_serial_init() var byte ch forever loop usb_serial_flush() if usb_serial_read(ch) then usb_serial_write(ch) end if end loop
Unter Windows meldet sich USBnub nach dem Starten als neues Gerät und verlant einen Treiber. Dieser ist im usbnub-pack unter driver\cdc\ zu finden. Danach wird ein virtueller Comport angelegt und kann mit einem belieben Terminalprogramm angesprochen werden (z.B. HTerm). Jedes gesendete Zeichen sollte dann auch wieder empfangen werden. Beachten Sie, dass die Leitung DTR gesetzt sein muss, damit der PC Empfangsbreitschaft signalisiert.

Eigenes Projekt: Spicken erlaubt!

Legen Sie los... Im USBnub-Pack sind unter usbnub/jal/projects/ Beispielprojekte zu finden. Neben der Anschlussbelegung ist auch stets der Quellcode verfügbar und kann als Basis für eigene Projekte dienen. Auch die jallib hat einige Beispielprogramme zu bieten. Zu finden sind diese unter jallib-pack/sample/.