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
- usbnub-pack-win.zip herunterladen und auf dem Rechner entpacken
- Unter usbnub-pack-win\pnotepad\pn.exe Programmer's Notepad starten
- Beispielprogramm in Programmer's Notepad laden (usbnub-pack-win\usbnub\jal\tutorial\led_blink\led_blink.jal)
- Kompilieren aus Programmer's Notepad: Tools->Compile (F7)
- Programm auf USBnub übertragen. Dazu USBnub in Bootloader-Modus starten: Taster auf USBnub gedrückt halten und USB-Kabel anstecken.
Dann: Tools->Flash (F5)

- Fertig! Jetzt sollte die LED auf dem USBnub im Sekundentakt blinken.
Linux / MacOS X
- jallib-pack herunterladen und entpacken
- MPHidFlash herunterladen und ggf. kompilieren
- usbnub.tar.gz herunterladen und entpacken
- Umgebungsvariable JALLIBPACK setzen. Z.b fest in ~/.bashrc eintragen:
export JALLIBPACK="/pathtoyourjallib/jallib-pack-2.4m-0.5.0"
- In Beispielverzeichnis wechseln:
cd usbnub/jal/tutorial/led_blink/
- Kompilieren mit: make
- Programm auf USBnub übertragen. Dazu USBnub in Bootloader-Modus starten: Taster auf USBnub gedrückt halten und USB-Kabel anstecken. Dann: make flash
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/.