<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Klause</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Klause"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Klause"/>
	<updated>2026-04-10T23:21:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96670</id>
		<title>NIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96670"/>
		<updated>2017-06-20T13:35:27Z</updated>

		<summary type="html">&lt;p&gt;Klause: Vorhandene Alternativen würden aufgezeigt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dies ist eine vorläufige und höchst unvollständige Beschreibung einer Software, die noch in Entwicklung, d.h. im Alpha-Stadium ist. Ein entsprechender Thread über NIC wird im Forum &amp;quot;Projekte &amp;amp; Code&amp;quot; eröffnet, sobald eine Beta-Version des NIC-Interpreters verfügbar ist. Details können sich durchaus noch ändern, daher ist diese Dokumentation zur Zeit noch rein als PRELIMINARY zu sehen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NIC ist eine einfache strukturierte Programmiersprache, welche speziell für die Mikrocontroller-Familie STM32 entwickelt wurde. Da der NIC-Interpreter in C geschrieben ist, kann dieser auch auf andere 32-Bit-Mikrocontroller portiert werden. &lt;br /&gt;
&lt;br /&gt;
Ebenso sind NIC-Programme auch unter Linux und Windows lauffähig, wobei dies eher der Entwicklung und des Debuggings des NIC-Interpreters dient. Ein in NIC geschriebenes Programm wird zunächst von dem NIC-Compiler &amp;quot;nicc&amp;quot; auf dem Host in einen Metacode übersetzt, welcher durch den NIC-Interpreter &amp;quot;nici&amp;quot; auf dem Mikrocontroller-System sehr effizient abgearbeitet werden kann. Die üblichen Übersetzungsdauern liegen meist unter einer Sekunde, die Geschwindigkeit, mit der die Befehle dann von nici ausgeführt werden, liegen bei ca. 100.000 bis 250.000 Befehlen pro Sekunde - je nach verwendetem STM32. Als Host zum Compilieren von NIC-Programmen dient zur Zeit ein PC-System mit Linux oder Windows, später wird dies auch ein vorgeschalteter µC wie ein ESP8266 sein, der gleichzeitig ein Filesystem (SPIFFS) bietet, um die Compilate zu speichern und damit permanent vorzuhalten. Zudem erweitert dieser dann das NIC-Laufzeitsystem um Netzwerkfunktionalitäten.&lt;br /&gt;
&lt;br /&gt;
Motivationen zur Entwicklung eines solchen Interpreters gibt es einige: Zum einen wird Einsteigern ein sehr einfaches System geboten, sich in die Welt von 32-Bit-Mikrocontrollern einzuarbeiten, zum anderen schrecken viele Umsteiger von 8-Bit-Systemen auf 32-Bit-Systeme vor der Komplexität der 32-Bitter zurück. Genau diese Komplexität wird in die NIC-Bibliotheksfunktionen verlegt, so dass man sich als NIC-Programmierer nicht damit im Detail befassen muss. Ein erfahrener Programmierer jedoch kann die NIC-Laufzeitbibliothek durch eigene C-Module erweitern, um diese dann im NIC-Programm unter Nutzung der NIC-API zu nutzen. So ist es dann zum Beispiel auf einfache Art und Weise möglich, eine Kette von WS2812-LEDs per DMA zu steuern, ohne sich im Detail mit der Programmierung einer DMA auseinandersetzen zu müssen.&lt;br /&gt;
&lt;br /&gt;
NIC als strukturierte Programmiersprache ähnelt in manchen Teilen C, PHP, Pascal oder auch Basic. Datentypen müssen jedoch zum Beispiel im Gegensatz zu PHP stets angegeben werden. Trotzdem ist stets eine implizite Typumwandlung (zum Beispiel von Integer-Werten in Strings oder umgekehrt) möglich, die klaren Regeln unterworfen ist. Casts wie in C sind dabei nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist NIC als Interpretersprache nicht so schnell wie ein C-Programm, kann sich aber trotzdem bezüglich Ausführungsgeschwindigkeit durchaus sehen lassen. Ein erfahrener C-Programmierer kann zeitkritische Programmteile in C erstellen, um sie dann als NIC-Bibliotheksfunktionen komfortabel zu nutzen. Der NIC-Interpreter ist ca. doppelt so schnell wie ein adäquates PHP-Programm und meist 3-5 mal schneller als vergleichbare Python-Programme, siehe auch [[NIC#Benchmarks|Benchmarks]].&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und diese Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und eine Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
= Compiler nicc =&lt;br /&gt;
&lt;br /&gt;
Der Compiler nicc ist für Windows und Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Windows ===&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und eine Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    nicc [-v] [-u COMx] datei.nic&lt;br /&gt;
&lt;br /&gt;
Die in eckigen Klammern angegebenen Parameter sind optional.&lt;br /&gt;
&lt;br /&gt;
Optionen:&lt;br /&gt;
    -v : Verbose, gibt Statistiken, wie zum Beispiel Optimierungen von Ausdrücken aus&lt;br /&gt;
    -u COMx: Upload der compilierten Datei über die seriellen Schnittstelle COMx&lt;br /&gt;
&lt;br /&gt;
Der NIC-Quelltext wird dabei in einen optimierten, maschinenunabhängigen Objekt-Code übersetzt. Das Kompilat legt nicc in der Datei datei.nico ab, welche (zur Zeit noch) eine ASCII-Datei ist. Gibt man per Upload-Parameter die serielle Schnittstelle an, wird das Kompilat direkt auf den µC geladen. Der Interpreter legt den Objekt-Code dann als binäre Datenstrukturen im RAM ab, um diese dann effizient abzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
    nicc -u com5 lauflicht1.nic&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Linux ===&lt;br /&gt;
    nicc [-v] datei.nic&lt;br /&gt;
&lt;br /&gt;
Hier fehlt (noch) die Upload-Funktion. Dafür ist es aber möglich, das Kompilat direkt unter Linux zu starten, siehe nächstes [[NIC#Interpreter_nici|Kapitel]].&lt;br /&gt;
&lt;br /&gt;
=== Optimierungen ===&lt;br /&gt;
&lt;br /&gt;
Der NIC-Compiler bringt sämtliche arithmetische Ausdrücke wie &amp;quot;3 * 4 + x + 1 &amp;lt;&amp;lt; 6&amp;quot; nach den Prioritätenregeln (Punkt- vor Strichrechnung usw.) in die UPN-Notation - auch Postfix genannt. Dabei werden konstante Teilausdrücke wie &amp;quot;3 * 4&amp;quot; direkt durch das Ergebnis &amp;quot;12&amp;quot; zur Compilezeit ersetzt. Dadurch muss der Interpreter sich nicht mehr um solche Regeln kümmern, sondern braucht nur noch einen Stack abzuarbeiten, auf dem alle Operanden und Operatoren schon fix und fertig in der richtigen Reihenfolge vorliegen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren werden zur Compilezeit sämtliche Sprungadressen, die durch Schleifen wie loop, repeat, for, while, break und continue entstehen, vorher ausgerechnet, so dass der Interpreter je nach Bedingung nur noch Sprungadressen laden muss. Desweiteren sind bei Aufruf von Bibliotheksfunktion (wie zum Beispiel [[NIC#Bibliothek_gpio|GPIO]]) die zu übergebenden Daten direkt zum Bedienen der API für Bibliotheksfunktionen vorbereitet. Diese können damit schnell und effektiv bedient werden.&lt;br /&gt;
&lt;br /&gt;
Häufig vorkommende Konstrukte wie &amp;quot;n = n + 1&amp;quot; werden in spezielle Increment- und Decrement-Befehle gewandelt, die vom NIC-Interpreter ohne Evaluierung des arithmetischen Ausdrucks rechts vom Gleichheitszeichen direkt intern auf den Variableninhalt wirken.&lt;br /&gt;
&lt;br /&gt;
= Interpreter nici =&lt;br /&gt;
&lt;br /&gt;
Der NIC-Interpreter nici wird im Flash des STM32 installiert (HEX-Datei). Dieser wartet dann auf dem UARTx auf das übersetzte NIC-Programm, um es direkt nach dem Upload auszuführen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler:&lt;br /&gt;
&lt;br /&gt;
Man kann den Interpreter unter Linux und Windows direkt von der Kommandozeile aus starten.&lt;br /&gt;
&lt;br /&gt;
Übersetzen:&lt;br /&gt;
    nicc datei.nic&lt;br /&gt;
Ausführen:&lt;br /&gt;
    nici datei.nico&lt;br /&gt;
&lt;br /&gt;
STM32-spezifische Funktionen wie gpio.toggle() laufen dabei auf eine Stub-Funktion geleitet, welche die Laufzeitparameter als Info ausgeben. Alle anderen Funktionen werden jedoch ordnungsgemäß ausgeführt. Trotzdem ist der Interpreter nicc unter Linux bzw. Windows eher zur Weiterentwicklung und Debugging des Compilers und des Interpreters gedacht und nicht dafür, Programme für Linux/Windows in der Programmiersprache NIC zu entwickeln - auch wenn das so möglich wäre.&lt;br /&gt;
&lt;br /&gt;
= main-Funktion =&lt;br /&gt;
&lt;br /&gt;
Jedes NIC-Programm muss eine Funktion namens &amp;quot;main()&amp;quot; definieren. Das ist der Startpunkt eines jeden NIC-Programms. Die Funktion main() liefert stets keinen Rückgabewert zurück und muss daher immer mit dem Funktionstyp &amp;quot;void&amp;quot; angegeben werden. Außerdem erhält sie keine Parameter, daher ist der Inhalt zwischen den Klammern &amp;quot;(&amp;quot; und &amp;quot;)&amp;quot; leer.&lt;br /&gt;
&lt;br /&gt;
Damit ergibt sich als Funktionsrumpf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
Ale Einstiegsprogramm einer Programmiersprache wird oft ein einfaches Hello-World-Programm angegeben, welches die Zeichenkette &amp;quot;Hello, World&amp;quot; ausgibt. Für Mikrocontroller jedoch ist es oft das Blinken einer an den Mikrocontroller angeschlossenen LED.&lt;br /&gt;
&lt;br /&gt;
Das folgende NIC-Programm lässt die LED auf einem Nucleo-Board blinken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.set (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
        gpio.reset (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die LED wird dabei für 500msec ein- und dann für 500msec wieder abgeschaltet. Durch die Kontrollstruktur &amp;quot;loop&amp;quot; läuft das Programm in einer Endlosschleife und kann nur durch Drücken der RESET-Taste gestoppt werden. Hier werden drei interne Bibliotheksfunktionen der Familie &#039;&#039;&#039;[[NIC#Bibliothek_gpio|gpio]]&#039;&#039;&#039; aufgerufen, nämlich [[NIC#gpio.init_.28.29|gpio.init()]], [[NIC#gpio.set_.28.29|gpio.set()]] und [[NIC#gpio.reset_.28.29|gpio.reset()]]. Die erste Funktion [[NIC#gpio.init_.28.29|gpio.init()]] initialisiert den Pin A5 des STM32 als Ausgabe-Pin durch Angabe des Schlüsselwortes &amp;quot;OUTPUT&amp;quot;, die Funktion [[NIC#gpio.set_.28.29|gpio.set()]] setzt dann den Pin auf HIGH-Pegel, die Funktion [[NIC#gpio.reset_.28.29|gpio.reset()]] wieder auf LOW-Pegel. Die Bibliotheksfunktion time.delay() lässt den Mikrocontroller eine bestimmte Anzahl von Millisekunden warten - hier 500msec.&lt;br /&gt;
&lt;br /&gt;
Am Pin A5 ist bei den Nucleo-Boards eine board-interne grüne LED angeschlossen. Diese blinkt dann bei der Ausführung des Programms. Um die board-interne blaue LED eines STM32F103-Mini-Development-Boards anzusprechen, muss der Port GPIOA durch GPIOC ersetzt und die Pinnummer auf 13 geändert werden, denn hier ist die LED an Pin C13 angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Durch Anwendung der Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] kann der Code noch vereinfacht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wechselt die Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] automatisch den jeweiligen LOW- bzw. HIGH-Pegel und lässt die LED mit einer Frequenz von einem Hertz blinken.&lt;br /&gt;
&lt;br /&gt;
Wie wir später noch sehen werden, kann das Blinken der LED auch timergesteuert ausgeführt werden. Dann macht der NIC-Interpreter das &amp;quot;nebenbei&amp;quot;, d.h. wir haben in der Hauptschleife Zeit für andere Dinge.&lt;br /&gt;
&lt;br /&gt;
Hier schon mal das Programm, erklärt wird es dann später unten (alarm-Funktionen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink ()&lt;br /&gt;
    gpio.toggle (GPIOA, 5)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    alarm.set (500, function.blink)                 // blink() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie schnell ist nun der NIC-Interpreter? Wir können nun durch Entfernen des delay-Aufrufs die LED mit maximaler Geschwindigkeit blinken lassen und dann die Zeiten messen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103-Mini-Board: LED=C13&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Endlosschleife &#039;&#039;&#039;[[NIC#loop|loop]]&#039;&#039;&#039; wurde hier durch ein &#039;&#039;&#039;[[NIC#repeat|repeat]]&#039;&#039;&#039; ersetzt. Hier können wir angeben, wie oft eine Schleife durchlaufen wird. In unserem Beispiel sind es 1.000.000 mal. Das Blinken selbst wird man aufgrund der Geschwindigkeit nicht mehr erkennen können, jedoch leuchtet die LED weiterhin deutlich sichtbar - bis das Programm nach einer Million Schleifendurchläufen beendet wird. Man wird dabei mit der Stoppuhr auf einem STM32F411RE-Nucleo-Board ungefähr 4 Sekunden messen.&lt;br /&gt;
&lt;br /&gt;
Der Messvorgang geht aber auch genauer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
    int diff&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    diff = stop - start&lt;br /&gt;
    console.println (diff)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden nun erstmals Variablen namens &amp;quot;start&amp;quot; und &amp;quot;stop&amp;quot; verwendet. Sie entsprechen der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden. Durch die Funktion [[NIC#time.millis_.28.29|time.millis()]] können wir jederzeit die interne Zeit des Mikrocontrollers abrufen und in einer Variablen speichern. Deshalb wird jemals einmal vor und nach dem Schleifendurchlauf die Zeit gestoppt. Die Differenz wird in der Variablen &amp;quot;diff&amp;quot; gespeichert und dann mittels der Funktion [[NIC#console.println_.28.29|console.println()]] in Millisekunden auf der Console ausgegeben. Die Console ist dabei die serielle UART-Schnittstelle, die bei jedem Nucleo on-board dabei ist. Bei einem STM32F103-Mini-Development-Board muss ein zusätzlicher UART-Adapter angeschlossen werden, siehe entsprechendes Kapitel weiter unten. Bei einem mit 100MHz getakteten STM32F411RE sind dies ca. 3900msec. Das Programm schafft also ungefähr 255.000 Schleifendurchläufe pro Sekunde. Bei einem mit 85MHz getakteten STM32F401RE sind es noch knapp 200.000 Schleifendurchläufe, beim STM32F103 mit 72MHz-Takt ca. 180.000 Durchläufe.&lt;br /&gt;
&lt;br /&gt;
Das Programm kann aber noch stärker vereinfacht werden. Zunächst eliminieren wir die Variable &amp;quot;diff&amp;quot;, indem wir die Differenz der Werte &amp;quot;stop&amp;quot; und &amp;quot;start&amp;quot; direkt der Funktion [[NIC#console.println_.28.29|console.println()]] übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    console.println (stop - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also: Funktionen können nicht nur einfache Werte, sondern auch algebraische Ausdrücke direkt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Aber es geht noch einfacher. Jetzt verzichten wir auch noch auf die Variable &amp;quot;stop&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    console.println (time.millis () - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Funktionsparameter können also auch Rückgabewerte anderer Funktionen oder noch komplexere Ausdrücke angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber noch das Hello-World-Programm im klassischen Sinne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, World!&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sieht jetzt - nachdem wir bereits eine LED auf mehrere Art und Weise haben blinken lassen - doch viel zu einfach aus ;-)&lt;br /&gt;
&lt;br /&gt;
= Kommentare =&lt;br /&gt;
&lt;br /&gt;
Kommentare werden durch einen doppelten Schrägstrich eingeleitet, also durch &#039;//&#039;. Alle danach aufgeführten Zeichen gelten als Kommentar und werden vom NIC-Compiler nicc ignoriert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Datentypen =&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Funktionen und Variablen müssen stets angegeben werden. Eine implizite Definition durch einfache Aufführung eines einer Funktion, eines Funktionsparameters oder einer Variablen wie in PHP oder Python ist nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Variablen und Funktionen sind Integer, Byte oder String, evtl. später auch noch &amp;quot;Float&amp;quot;. Bei Funktionen ist zusätzlich der Datentyp &amp;quot;void&amp;quot; möglich, um anzugeben, dass die Funktion &#039;&#039;&#039;keinen&#039;&#039;&#039; Funktionswert zurückliefert.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;int&#039;&#039;&#039; - Datentyp Integer, Breite 32 Bit, vorzeichenbehaftet&lt;br /&gt;
* &#039;&#039;&#039;byte&#039;&#039;&#039; - Datentyp Byte, Breite 8 Bit, vorzeichenlos&lt;br /&gt;
* &#039;&#039;&#039;string&#039;&#039;&#039; - Datentyp Zeichenkette&lt;br /&gt;
* &#039;&#039;&#039;void&#039;&#039;&#039; - kein Returnwert (nur Funktionen)&lt;br /&gt;
&lt;br /&gt;
Funktionen können als Rückgabewerte nicht nur die oben aufgeführten Typen zurückliefern, sondern auch vom Typ &#039;&#039;&#039;void&#039;&#039;&#039; sein, um anzuzeigen, dass sie &#039;&#039;&#039;keinen&#039;&#039;&#039; Rückgabewert liefern.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void errormessage (string message)&lt;br /&gt;
    console.println (&amp;quot;error: &amp;quot; : message)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei allen anderen Datentypen muss eine Funktion einen Wert per return-Befehl zurückgeben.&lt;br /&gt;
&lt;br /&gt;
= Konstanten =&lt;br /&gt;
&lt;br /&gt;
=== Integer-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
Integer-Konstanten sind einfache Zahlenfolgen wie 1234 oder -1234. Ohne entsprechendes Prefix sind dies Dezimalzahlen. Möchte man einen numerischen Wert in hexadezimal angeben, ist 0x voranzustellen, also zum Beispiel 0x1234. Zahlen können auch im Binärsystem angegeben werden. In diesem Fall ist 0b voranzustellen, z.B. 0b10011100.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* 1234 ist eine Dezimalzahl&lt;br /&gt;
* 0x23AF ist eine Hexadezimalzahl&lt;br /&gt;
* 0b01010101 ist eine Binärzahl&lt;br /&gt;
&lt;br /&gt;
=== String-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
String-Konstanten werden in Anführungszeichen angegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Das ist eine String-Konstante&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Variablen =&lt;br /&gt;
&lt;br /&gt;
Variablen werden definiert durch die Angabe des Datentyps und des Namens.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int nummer&lt;br /&gt;
    byte data&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt lediglich drei verschiedene Datentypen: &#039;&#039;&#039;int&#039;&#039;&#039; oder  &#039;&#039;&#039;byte&#039;&#039;&#039; oder &#039;&#039;&#039;string&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Der Datentyp int definiert einen 32-Bit-Integer, ist also vorzeichenbehaftet. Der Datentyp byte entspricht dem Byte, kennt also keinerlei Vorzeichen und ist 8 Bit breit. Der Typ string ist eine Zeichenkette.&lt;br /&gt;
&lt;br /&gt;
=== Globale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable außerhalb von Funktionen definiert, ist sie eine globale Variable. Auf globale Variablen kann funktionsübergreifend zugegriffen werden - und zwar ab der Zeile, wo sie definiert wird. Eine globale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang des Quelltextes geschehen, jedoch spätestens dann, wenn auch auf sie zugegegriffen werden soll.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    maxleds = 30&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Globale Variablen können auch direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
    maxleds = 40&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 40&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lokale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion definiert, dann gilt sie nur innerhalb dieser Funktion. Bei jedem Funktionsaufruf werden die lokalen Variablen neu erzeugt und (im Gegensatz z.B. zu C) neu mit 0 (für int) bzw. Leerstring &amp;quot;&amp;quot; (für string) initialisiert. Ruft die Funktion sich selbst rekursiv auf, wird jedesmal ein neuer lokaler Variablensatz erzeugt. Lokale Variablen werden nach dem Verlassen der jeweiligen Funktion wieder zerstört und sind dann nicht mehr verfügbar.&lt;br /&gt;
&lt;br /&gt;
Eine lokale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens aber unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var&lt;br /&gt;
    var = 3 * 2&lt;br /&gt;
    console.println (var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch lokale Variablen können direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 3&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind zur Zeit nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Statische Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion statisch definiert, dann gilt für sie erst einmal dasselbe wie für lokale Variablen. Der einzige Unterschied: Sie wird nur einmal beim Start des Programms erzeugt und beim Verlassen der Funktion auch nicht zerstört. Das heisst: Die Variable (und deren Inhalt) &amp;quot;lebt&amp;quot; während der ganzen Laufzeit des Programms. Außerhalb der Funktion, wo sie definiert wird, kann auf sie mit dem Namen &amp;quot;function.variable&amp;quot; zugegriffen werden, wenn es unbedingt nötig ist, siehe untenstehendes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Werden statische Variablen direkt bei der Definition initialisiert, so haben sie diesen Wert bereits beim Start des Programms.&lt;br /&gt;
&lt;br /&gt;
Eine statische Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    static int var = 4&lt;br /&gt;
    var = 3 * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 4&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Statische Variablen können auch außerhalb einer Funktion definiert werden. Da diese Definition semantisch keinen Unterschied zu der Definition einer globalen Variablen macht, werden globale statische Variaben identisch zu globalen Variablen behandelt.&lt;br /&gt;
&lt;br /&gt;
Beim Compilieren erscheint dann eine Warnung:&lt;br /&gt;
&lt;br /&gt;
  warning line 1: keyword &#039;static&#039; takes no effect here.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
static int var = 3&lt;br /&gt;
function void main ()&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Konstante Variablen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Konstante Variablen&amp;quot; sind auf den ersten Blick ein Widerspruch in sich. Wie kann eine Konstante variabel sein?&lt;br /&gt;
&lt;br /&gt;
Die Antwort: Eine konstante Variable wird von der Semantik wie eine normale Variable behandelt. Allerdings kann deren Wert nicht geändert werden. Daher sollte man direkt bei der Definition solche Variablen auch initialisieren. Unterlässt man dies, haben sie halt den Wert 0 bzw. &amp;quot;&amp;quot; (Leerstring) - je nach Typ.&lt;br /&gt;
&lt;br /&gt;
Konstante Variablen sollte man nach Konvention ausschließlich in Großbuchstaben schreiben. Sie ähneln nämlich den Preprozessor-Konstanten in C. Mit der Großschreibung deutet man an: Dies ist eine Konstante!&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der Variablen wird auch nicht erst zur Laufzeit in arithmetischen Ausdrücken ermittelt, sondern bereits während des Compilierens in die entsprechenden Ausdrücke eingesetzt.&lt;br /&gt;
&lt;br /&gt;
const-Variablen müssen vom Typ int oder string sein. byte ist hier nicht erlaubt - was aber keine Einschränkung bedeutet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 4&lt;br /&gt;
    var = MAXLEDS * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 120&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (MAXLEDS)     // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden konstante Variablen mit 0 bzw. mit &amp;quot;&amp;quot; (Leerstring) - je nach Typ - initialisiert.&lt;br /&gt;
&lt;br /&gt;
Der Versuch, einer konstante Variablen später im Programm einen anderen Wert zuzuweisen, wird bereits beim Compilieren mit einer Fehlermeldung quittiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    MAXLEDS = 40&lt;br /&gt;
    console.println (MAXLEDS)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fehlermeldung lautet dann:&lt;br /&gt;
&lt;br /&gt;
  error line 4: variable &#039;MAXLEDS&#039; is of type &#039;const&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
Variablen können auch als Arrays verwendet werden. Dabei wird bei der Definition die Größe des Arrays in eckigen Klammern angegeben. Diese Größe muss entweder durch eine Zahl oder den Inhalt einer &amp;quot;konstanten Integer-Variablen&amp;quot; (const int) angegeben werden. Arrays beginnen immer mit dem Index 0 und enden bei der Arraygröße minus 1. Zugriffe außerhalb dieses Bereichs werden zur Laufzeit abgefangen. In diesem Fall wird eine entsprechende Fehlermeldung auf der Console ausgegeben und das Programm beendet.&lt;br /&gt;
&lt;br /&gt;
Arrays können sowohl global als auch lokal angelegt werden. Auch static Arrays sind möglich. Konstante Arrays gibt es jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int SIZE = 5&lt;br /&gt;
int nummer[7]&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette[SIZE]&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7 - 1&lt;br /&gt;
        nummer[i] = 2 * i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (nummer[5])          // Ausgabe: 10&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to SIZE - 1&lt;br /&gt;
         zeichenkette[i] = &amp;quot;Hello &amp;quot; : i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (zeichenkette[3])    // Ausgabe: &amp;quot;Hello 3&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funktionen =&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Eine Funktion wird definiert durch folgenden Block:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function TYPE FUNCTIONNAME (TYP PARAMETER1, TYP PARAMETER2, ...)&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei kann TYPE &#039;&#039;&#039;int&#039;&#039;&#039;, &#039;&#039;&#039;string&#039;&#039;&#039; oder &#039;&#039;&#039;void&#039;&#039;&#039; sein. FUNCTIONNAME ist einfach der Funktionsname. PARAMETER1 bis PARAMETERn sind die optionalen Funktionsparameter.&lt;br /&gt;
&lt;br /&gt;
Der einfachste Fall ist die main-Funktion, die immer vorhanden sein muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man das oben angegebene Blink-Programm als eigene Funktion einbauen, dann wäre das folgende Programm eine Lösung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink (int factor, int delay)&lt;br /&gt;
    repeat factor&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (delay)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    blink (20, 200)&lt;br /&gt;
    blink (10, 500)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Aufruf von blink() lässt die LED 20 mal schnell den Zustand wechseln (Verzögerungszeit 200 msec), der zweite Aufruf lässt die LED lediglich 10 mal den Zustand wechseln, dafür aber langsamer (Verzögerungszeit 500 msec).&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Klassen ===&lt;br /&gt;
&lt;br /&gt;
Später.&lt;br /&gt;
&lt;br /&gt;
= Typumwandlungen =&lt;br /&gt;
&lt;br /&gt;
=== String to Integer ===&lt;br /&gt;
&lt;br /&gt;
Wird einer Integer-Variablen ein String zugewiesen, wird lediglich deren numerischer Inhalt zu Anfang des Strings als Integer-Wert übernommen. Enthält der String überhaupt keinen numerischen Wert zu Anfang, ist der Integer-Wert des Strings 0.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = &amp;quot;1234abc&amp;quot;&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable Zahl enthält nach der Zuweisung den numerischen Wert 1234.&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt für Funktionen, die einen Integer-Wert als Parameter erwarten, hier jedoch ein String übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integer to String ===&lt;br /&gt;
&lt;br /&gt;
Wird einer String-Variablen ein Integer-Wert zugewiesen, wird dieser automatisch in einen String umgewandelt. Dasselbe gilt für Funktionsparameter, wenn die Funktion einen String als Parameter erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    zeichenkette = 1234&lt;br /&gt;
    console.println (zeichenkette)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso gilt dies für den String-Operator &#039;:&#039;, welcher zwei Strings zu einem String zusammensetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    string meldung&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    meldung = &amp;quot;Das Ergebnis ist &amp;quot; : ergebnis&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dem String-Operator &#039;:&#039; können auch rein numerische Operanden zu einem String zusammengesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string meldung&lt;br /&gt;
    meldung = 123 : 456&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird dann der String &amp;quot;123456&amp;quot; auf der Console ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Kombiniert man beide Typwandlungen (Integer-&amp;gt;String und String-&amp;gt;Integer), kann man den String-Operator auch auf rein numerische Ausdrücke anwenden, wobei die Zuweisungsvariable auch wieder eine Integer-Variable ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 123 : 456&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Zahlen 123 und 456 zunächst in Strings umgewandelt, dann zu einem String zusammengesetzt und bei der Zuweisung wieder zurück in einen Integer-Wert gewandelt. Die Variable &#039;zahl&#039; enthält nach der Zuweisung den Integer-Wert 123456.&lt;br /&gt;
&lt;br /&gt;
= Kontrollstrukturen =&lt;br /&gt;
&lt;br /&gt;
=== Zuweisung ===&lt;br /&gt;
&lt;br /&gt;
Syntax: VARIABLE = AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    int ergebnis&lt;br /&gt;
&lt;br /&gt;
    zeichenkette = &amp;quot;Das Ergebnis lautet: &amp;quot;&lt;br /&gt;
    ergebnis = 1234 * 2&lt;br /&gt;
    console.println (zeichenkette : ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    if BEDINGUNG1&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG2&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG3&lt;br /&gt;
        ...&lt;br /&gt;
    else&lt;br /&gt;
        ...&lt;br /&gt;
    endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
  int zahl&lt;br /&gt;
&lt;br /&gt;
  zahl = 33&lt;br /&gt;
&lt;br /&gt;
if zahl &amp;lt; 10&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 10&amp;quot;)&lt;br /&gt;
elseif zahl &amp;lt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 100&amp;quot;)&lt;br /&gt;
elseif zahl &amp;gt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is groesser 100&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is gleich 100&amp;quot;)&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loop ===&lt;br /&gt;
&lt;br /&gt;
loop beginnt eine Endlosschleife. Diese kann lediglich mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Endlosschleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Abbruch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   break&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Sprung zum Anfang der Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   continue&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm lässt die Board-LED auf einem Nucleo-Board leuchten, bis der User-Button gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== repeat ===&lt;br /&gt;
&lt;br /&gt;
repeat beginnt eine Schleife, welche genau N-mal durchlaufen wird. Die repeat-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
repeat N&lt;br /&gt;
   ...&lt;br /&gt;
endrepeat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N kann dabei ein beliebiger arithmetischer Ausdruck sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    repeat 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Die while-Schleife wird durchlaufen, solange die angegebene Bedingung gegeben ist. Arithmeische Ausdrücke innerhalb der Bedingung werden bei jedem Schleifendurchlauf neu berechnet. Die while-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
while BEDINGUNG&lt;br /&gt;
   ...&lt;br /&gt;
endwhile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    while zahl &amp;lt; 10&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endwhile&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== for ===&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife wird für eine anzugebene Schleifenvariable solange durchlaufen, bis der angegebene Stopwert überschritten wird. Optional kann eine Schrittgröße für die Schleifenvariable angegeben werden. Standardmäßig ist diese 1, d.h. die Schleifenvariable wird mit jedem neuen Durchlauf inkrementiert. Ist der Stopwert kleiner als der Startwert, wird die Schleifenvariable mit jedem Durchlauf dekrementiert.&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
for VARIABLE = STARTWERT to STOPWERT [STEP x]&lt;br /&gt;
   ...&lt;br /&gt;
endfor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VARIABLE muss eine Integer-Variable sein, STARTWERT und STOPWERT ein beliebiger arithmetischer Ausdruck. Im Gegensatz zur while-Schleife, in welcher die Schleifen-Bedingung und damit die arithmetische Ausdrücke jeweils immer neu evaluiert werden, wird bei der for-Schleife STARTWERT und STOPWERT nur einmal berechnet, nämlich unmittelbar vor dem Betreten der Schleife.&lt;br /&gt;
&lt;br /&gt;
Wird kein Step-Wert angegeben, wird die Laufvariable nach jedem Schleifendurchlauf um 1 erhöht. Wird ein abweichender Step-Wert  angegeben, wird die Laufvariable um den angegebenen Wert erhöht. Ist der Step-Wert negativ, wird die Variable um den angegebenen Wert erniedrigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt zunächst die Zahlen 1 bis 9 auf der Console aus. Anschließend werden die Werte von 9 bis 1 rückwärts zählend ausgegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    for zahl = 1 to 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
    for zahl = 9 to 1 step -1&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== switch ===&lt;br /&gt;
&lt;br /&gt;
* switch, break&lt;br /&gt;
&lt;br /&gt;
=== return ===&lt;br /&gt;
&lt;br /&gt;
* return&lt;br /&gt;
&lt;br /&gt;
= Vergleichsoperatoren =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* gleich: =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;not equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* ungleich: !=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;less&#039; ===&lt;br /&gt;
&lt;br /&gt;
* kleiner: &amp;lt;&lt;br /&gt;
* kleiner oder gleich: &amp;lt;=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;greater&#039; ===&lt;br /&gt;
&lt;br /&gt;
* größer: &amp;gt;&lt;br /&gt;
* größer oder gleich: &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
= Operatoren =&lt;br /&gt;
&lt;br /&gt;
=== Grundrechenarten ===&lt;br /&gt;
&lt;br /&gt;
==== Addition ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK + AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 3 + 5&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK - AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 - 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Multiplikation ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK * AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 * 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Division ====&lt;br /&gt;
&lt;br /&gt;
Die Integer-Division behandelt nur den ganzzahligen Anteil der Division. Für den entstandenen Rest einer Division siehe &#039;&#039;&#039;Modulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK / AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 / 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei den Grundrechenarten gilt die Punkt-vor-Strich-Rechnung.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Modulo-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der Modulo-Operator berechnet den Rest einer Integer-Division.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK % AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 % 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der Modulo-Operator bindet (im Gegensatz zu anderen Programmiersprachen!) stärker als die Grundrechenarten.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * 5 % 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist identisch mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * (5 % 3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher ist das Ergebnis hier 2 * 2 = 4.&lt;br /&gt;
&lt;br /&gt;
=== Shift-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;lt;&amp;lt;&#039; verschiebt die Bits einer Zahl nach links.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 2&lt;br /&gt;
    ergebnis = zahl &amp;lt;&amp;lt; 4  // Verschieben der Zahl 2 um 4 Stellen nach links&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 32&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;gt;&amp;gt;&#039; verschiebt die Bits einer Zahl nach rechts.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 32&lt;br /&gt;
    ergebnis = zahl &amp;gt;&amp;gt; 4  // Verschieben der Zahl 32 um 4 Stellen nach rechts&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Shift-Operatoren binden stärker als die Grundrechenarten und der Modulo-Operator.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
3 * 1 &amp;lt;&amp;lt; 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist also 3 * 16 = 48.&lt;br /&gt;
&lt;br /&gt;
Wichtig: Beim Verschieben werden die Ausdrücke immer als unsigned-Werte angesehen, d.h. Vorzeichenbits werden nicht besonders behandelt.&lt;br /&gt;
&lt;br /&gt;
=== Bitmask-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Bitwise OR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK | AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0x0F | 0xF0, HEX, 2)      // Ausdruck ist FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise AND ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;amp; AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF &amp;amp; 0x00F0, HEX, 4)    // Ausdruck ist 00F0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise XOR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK ^ AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF ^ 0x00F0, HEX, 4)    // Ausdruck ist FF0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise Inversion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: ~AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (~0xFF00, HEX, 4)            // Ausdruck ist FFFF00FF&lt;br /&gt;
    console.println (~0xFF00 &amp;amp; 0xFFFF, HEX, 4)   // Ausdruck ist     00FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der And-Operator bindet stärker als der OR-Operator. Die Invertierung wirkt unmittelbar auf den nachfolgenden Ausdruck. Sämtliche Bitmask-Operatoren binden stärker als die vorangegangenen Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Klammern ===&lt;br /&gt;
&lt;br /&gt;
Um die obigen Prioritätenregelungen zu durchbrechen, können in den Ausdrücken Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (3 + 2 * 4)                  // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) * 4)                // Ausdruck ist 5 *  4 = 20&lt;br /&gt;
    console.println (3 + 2 &amp;lt;&amp;lt; 2)                 // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) &amp;lt;&amp;lt; 2)               // Ausdruck ist 5 &amp;lt;&amp;lt; 2 = 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der String-Operator fasst zwei Zeichenketten zu einer Zeichenkette zusammen.&lt;br /&gt;
&lt;br /&gt;
Syntax: STRING1 : STRING2&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str1&lt;br /&gt;
    string str2&lt;br /&gt;
    string str3&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    str2 = &amp;quot;World&amp;quot;&lt;br /&gt;
    str3 = str1 : str2&lt;br /&gt;
    console.println (str3)  // Ausgabe: &amp;quot;Hello, World&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    console.println (str : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder noch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, &amp;quot; : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der String-Operator wandelt numerische Ausdrücke automatisch in Strings.&lt;br /&gt;
&lt;br /&gt;
Somit führt der Programmabschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = (3 * 5) : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zu einem Ausdruck von &amp;quot;15 ist das Ergebnis.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wichtig: &#039;&#039;&#039;Der String-Operator bindet stärker als alle anderen nicht-unären Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlende Klammern in Abschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = 3 * 5 : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
führen also zum Ausdruck von lediglich &amp;quot;15&amp;quot;, da der zwischendurch entstehende Ausdruck &amp;quot;5 ist das Ergebnis&amp;quot; für die Multiplikation in einen Integer gewandelt wird. Übrig bleibt daher lediglich 3 * 5. Das Ergebnis wird wegen der Zuweisung wieder zurück in einen String gewandelt. Übrig bleibt &amp;quot;15&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Bibliotheken =&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek string ===&lt;br /&gt;
&lt;br /&gt;
==== string.length () ====&lt;br /&gt;
&lt;br /&gt;
Die length-Funktion gibt die Länge eines Strings zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int string.length (string str)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Länge des Strings&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int len&lt;br /&gt;
    len = string.length (&amp;quot;abcdef&amp;quot;);            // gibt 6 zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== string.substring () ====&lt;br /&gt;
&lt;br /&gt;
Die substring-Funktion kann beliebige Zeichenketten aus einem String extrahieren. &lt;br /&gt;
&lt;br /&gt;
Syntax: string string.substring (string str, int start [, int length ])&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
* start: Die Startposition innerhalb des Strings&lt;br /&gt;
* length: Die Länge des zu extrahierenden Strings. Der Parameter ist optional.&lt;br /&gt;
&lt;br /&gt;
Die Startposition wird ab 0 gezählt. Ist der Startwert positiv oder 0, wird die Startposition innerhalb des Eingabestrings von links gezählt, anderenfalls von rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string rest&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -1);    // gibt &amp;quot;f&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -2);    // gibt &amp;quot;ef&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, 1); // gibt &amp;quot;d&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und positiv, enthält der zurückgegebene String höchstens length Zeichen ab start (abhängig von der Länge von string).&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und negativ, werden genau so viele Zeichen vom Ende von string abgeschnitten (nachdem die Startposition ermittelt wurde, sollte start negativ sein). Gibt start die Position des abzuschneidenden Teiles oder dahinter an, wird ein leerer String zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 0, -1);  // gibt &amp;quot;abcde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 2, -1);  // gibt &amp;quot;cde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 4, -4);  // gibt &amp;quot;&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, -1); // gibt &amp;quot;de&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aus Basic bekannten Funktionen &#039;left&#039;, &#039;right&#039; und &#039;mid&#039; können alle mit der substring-Funktion abgebildet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function string left (string str, int l)&lt;br /&gt;
    return string.substring (str, 0, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string right (string str, int l)&lt;br /&gt;
    return string.substring (str, -l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string mid (string str, int s, int l)&lt;br /&gt;
    return string.substring (str, s, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string x&lt;br /&gt;
    x = &amp;quot;abcdef&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    console.println (left (x, 3))     // gibt &amp;quot;abc&amp;quot; aus&lt;br /&gt;
    console.println (right (x, 3))    // gibt &amp;quot;def&amp;quot; aus&lt;br /&gt;
    console.println (mid (x, 2, 2))   // gibt &amp;quot;cd&amp;quot; aus&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek time ===&lt;br /&gt;
&lt;br /&gt;
==== time.millis () ====&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von time.millis() entsprecht der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: int time.millis ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.reset () ====&lt;br /&gt;
&lt;br /&gt;
time.reset setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers zurück auf 0.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Reset: &amp;quot; : time)&lt;br /&gt;
    time.reset ()&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Reset: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.set () ====&lt;br /&gt;
&lt;br /&gt;
time.set setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers auf den angegebenen Wert&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset (int millis)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Set: &amp;quot; : time)&lt;br /&gt;
    time.set (1000)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Set: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.delay () ====&lt;br /&gt;
&lt;br /&gt;
time.delay() wartet die angegebene Zeit in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.delay (int msec)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Delay: &amp;quot; : time)&lt;br /&gt;
    time.delay (500)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Delay: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek console ===&lt;br /&gt;
&lt;br /&gt;
==== console.print () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.print (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Wird nur das erste Argument übergeben, wird anhand des Parameter-Typs entschieden, ob ein String oder ein Integer-Wert auf der Console ausgedruckt wird. Man kann aber auch steuern, wie der übergebene Parameter behandelt werden soll. Dabei kann TYPE die folgenden Werte haben:&lt;br /&gt;
&lt;br /&gt;
* STR - Der Parameter wird als String behandelt&lt;br /&gt;
* DEC - Der Parameter wird als Dezimalzahl gedruckt&lt;br /&gt;
* DEC0 - Der Parameter wird als Dezimalzahl gedruckt, jedoch wird das Ausgabefeld mit führenden Nullen aufgefüllt.&lt;br /&gt;
* HEX - Der Parameter wird als Hexadezimalzahl gedruckt&lt;br /&gt;
* BIN - Der Parameter wird als Binärzahl gedruckt&lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren numerischen Parameter WIDTH kann gesteuert werden, wie breit das Ausgabefeld sein soll. Dann wird der ausgegebene Text auf mindestens diese Anzahl von Zeichen tabuliert, das heißt mit Leerzeichen aufgefüllt. Ist WIDTH positiv, werden Leerzeichen von links beginnend eingefügt, ist WIDTH negativ, werden entsprechend viele Leerzeichen rechts angefügt, um auf die gewünschte Breite zu kommen. Eine Besonderheit ist das Drucken von HEX- oder BIN-Zahlen: Bei positivem Wert von WIDTH wird das Feld mit Nullen statt Leerzeichen aufgefüllt. Bei Dezimalzahlen geht dieses über den Typ DEC0.&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Anzahl der gedruckten Zeichen.&lt;br /&gt;
&lt;br /&gt;
Beispiele siehe console.println ().&lt;br /&gt;
&lt;br /&gt;
==== console.println () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.println (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Das Verhalten entspricht exakt der Funktion  console.print(). Jedoch wird noch nach dem Ausdruck ein CRNL-Paar angefügt, um eine neue Zeile zu beginnen.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    i = 4711&lt;br /&gt;
    console.println (i)                        // 4711&lt;br /&gt;
    console.println (i, DEC)                   // 4711&lt;br /&gt;
    console.println (i, HEX)                   // 1267&lt;br /&gt;
    console.println (i, BIN)                   // 1001001100111&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFFFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFFFFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX)              // 7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFF&lt;br /&gt;
    console.println (i, HEX, 8)                // 0000FFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 8)           // 7FFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFF&lt;br /&gt;
    console.println (i, HEX, 2)                // FF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 2)           // 7F&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, BIN, 16)          // 0000000001111111&lt;br /&gt;
&lt;br /&gt;
    console.println (0xAA, BIN, 8)             // 10101010&lt;br /&gt;
    console.println (1, BIN, 32)               // 00000000000000000000000000000001&lt;br /&gt;
&lt;br /&gt;
    console.println (&amp;quot;Hallo, Welt&amp;quot;)            // Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;)         // 42 Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, DEC)    // 42&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, BIN)    // 101010&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek gpio ===&lt;br /&gt;
&lt;br /&gt;
==== gpio.init () ====&lt;br /&gt;
&lt;br /&gt;
Initialisiert General Purpose I/O für einen Pin.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    void gpio.init (PORT, BIT, INPUT [, NOPULL | PULLDOWN | PULLUP ])&lt;br /&gt;
oder&lt;br /&gt;
    void gpio.init (PORT, BIT, OUTPUT [, PUSHPULL | OPENDRAIN ])&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
Für die Datenrichtung muss entweder die Konstante INPUT oder die Konstante OUTPUT vorgegeben werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als INPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NOPULL (Default):&#039;&#039;&#039; Der Eingang wird nicht durch einen internen Pullup oder Pulldown beeinflusst&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als OUTPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUSHPULL (Default):&#039;&#039;&#039; Der Ausgang wird möglichst niederohmig geschaltet.&lt;br /&gt;
* &#039;&#039;&#039;OPENDRAIN:&#039;&#039;&#039; Der Low-Pegel wird möglichst niederohmig geschaltet, der High-Pegel ist hochohmig.&lt;br /&gt;
&lt;br /&gt;
Der letzte Parameter von gpio.init() ist optional. Wird er weggelassen, wird der jeweilige Standardwert (Default) eingestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // C13 als Input, kein Pulldown/Pullup&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT, PULLUP)    // C13 als Input mit Pullup&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.set () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf High-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.set (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.set (GPIOA, 5)                    // Pin auf HIGH&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.reset () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf Low-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.reset (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                  // Pin auf Low&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.toggle () ====&lt;br /&gt;
&lt;br /&gt;
Invertiert den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.toggle (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)             // A5 invertieren&lt;br /&gt;
        time.delay (500)                   // eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.get () ====&lt;br /&gt;
&lt;br /&gt;
Liest den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: int gpio.get (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert ist entweder LOW oder HIGH.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek bit ===&lt;br /&gt;
&lt;br /&gt;
==== bit.set () ====&lt;br /&gt;
&lt;br /&gt;
bit.set() setzt ein Bit.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.set (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.set (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;|&#039; nutzen, um ein Bit zu setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = zahl | (1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== bit.reset () ====&lt;br /&gt;
&lt;br /&gt;
bit.reset() setzt ein Bit zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.reset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = bit.reset (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;&amp;amp;&#039; zusammen mit &#039;~&#039; nutzen, um ein Bit zu zurückzusetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = zahl &amp;amp; ~(1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.toggle () ====&lt;br /&gt;
&lt;br /&gt;
bit.toggle() wechselt den Zustand eines Bits.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.toggle (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00000000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.isset () ====&lt;br /&gt;
&lt;br /&gt;
bit.isset() gibt den Zustand eines Bits zurück&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.isset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: TRUE, wenn das Bit gesetzt ist, sonst FALSE.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int bit&lt;br /&gt;
    bit = bit.isset (0b11111111, 5)&lt;br /&gt;
    if bit = TRUE&lt;br /&gt;
    else&lt;br /&gt;
        console.println (&amp;quot;bit is set&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
        console.println (&amp;quot;bit is not set&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek button ===&lt;br /&gt;
&lt;br /&gt;
==== button.init () ====&lt;br /&gt;
&lt;br /&gt;
Definiert einen GPIO-Pin als Tastereingang. Der Taster wird automatisch vom NIC-Laufzeitsystem per Software entprellt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.init (PORT, BIT, MODE)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Tastereingangs können folgende Alternativen für MODE eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLDOWN:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pulldowns nicht notwendig, Taster ist active high.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLUP:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pullups nicht notwendig, Taster ist active high.&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich, dass bei Einstellung PULLDOWN der Schalter gegen Vcc, bei Einstellung PULLUP der Schalter gegen GND schalten muss. Dasselbe gibt für NOPULLDOWN bzw. NOPULLUP. Hier muss die externe Beschaltung selbst für einen definierten Pegel sorgen, zum Beispiel bei NOPULLUP durch Anschluss eines &#039;&#039;&#039;externen&#039;&#039;&#039; Pullups.&lt;br /&gt;
&lt;br /&gt;
Das NIC-Laufzeitsystem vergibt eine interne Tastennummer größer Null, die bei Abfragen durch button.pressed() dann angegeben werden muss. Bis zu 8 solcher Tasten können mittels button.init() definiert werden. Wenn button.init() eine 0 zurückliefert, sind bereits alle 8 Tasten definiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo hängt der blaue User-Taster an PC13 und schaltet gegen GND. Da hier bereits ein externer Pullup-Widerstand vorgesehen ist, muss &#039;&#039;&#039;kein interner Pullup-Widerstand&#039;&#039;&#039; aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es bis auf den RESET-Taster keinen weiteren Taster auf dem Board. Wir können aber zum Beispiel einen Taster an PA6 anschließen, so dass er gegen GND schaltet. Den externen Pullup sparen wir uns und verwenden dafür den internen Pullup am Pin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)   // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== button.pressed () ====&lt;br /&gt;
&lt;br /&gt;
Abfrage des Tasters.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.pressed (int button)&lt;br /&gt;
&lt;br /&gt;
button ist dabei die Taster-Nummer, die von button.init() zurückgegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
&lt;br /&gt;
    TRUE: Taste ist gedrückt&lt;br /&gt;
    FALSE: Taste wurde nicht gedrückt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Einschalten der Board-LED, sobald die blaue User-Taste gedrückt wird, sonst ausschalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)                 // LED als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                        // Pegel low: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.set (GPIOA, 5)                  // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.reset (GPIOA, 5)                // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es eine blaue LED auf dem Board. Sie ist an PC13 angeschlossen. Allerdings muss diese gegen GND geschaltet werden, damit sie leuchtet. Sie ist also &amp;quot;active low&amp;quot; - im Gegensatz zur Nucleo-LED. Die Set- und Reset-Befehl werden hier daher ausgetauscht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOC, 13, OUTPUT)                // LED als Output&lt;br /&gt;
    gpio.set (GPIOC, 13)                         // Pegel high: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)      // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.reset (GPIOC, 13)               // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.set (GPIOC, 13)                 // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ws2812 ===&lt;br /&gt;
&lt;br /&gt;
==== ws2812.init () ====&lt;br /&gt;
&lt;br /&gt;
Mit ws2812.init() wird die WS2812-LED-Bibliothek initialisiert.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.init (int nleds)&lt;br /&gt;
&lt;br /&gt;
Als Argument ist die maximale Anzahl der verwendeten LEDs in der Kette anzugeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (30)   // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.set () ====&lt;br /&gt;
&lt;br /&gt;
Damit wird die Farbe einer oder aller WS2812-LEDs gesetzt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.set (int led, int red, int green, int blue)&lt;br /&gt;
&lt;br /&gt;
led gibt die Nummer der LED an - beginnend mit 0. Wird als Nummer die Anzahl der verwendeten LEDs angegeben, werden die Farben sämtlicher verwendeter LEDs gesetzt. Die Farben können Werte zwischen 0 (aus) und 255 (volle Helligkeit) haben.&lt;br /&gt;
&lt;br /&gt;
Der Set-Befehl setzt die angebenen Farben erst einmal nur im RAM. Erst mit dem ws2812.refresh()-Befehl werden dann sämtliche gesetzten Farben an die LEDs übertragen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ws2812.set (MAXLEDS, 128, 128, 128)   // Alle LEDs auf weiß, halbe Helligkeit&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to MAXLEDS&lt;br /&gt;
        ws2812.set (i, 0, 128, 128)       // Eine LEDs auf türkis, halbe Helligkeit&lt;br /&gt;
        ws2812.refresh (MAXLEDS)          // Ausgabe&lt;br /&gt;
        delay (200)                       // 0,2 Sekunden warten&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.refresh () ====&lt;br /&gt;
&lt;br /&gt;
ws2812.refresh() überträgt sämtliche zuvor gesetzte Farben an die LEDs.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.refresh (nleds)&lt;br /&gt;
&lt;br /&gt;
Das Argument nleds bestimmt, wieviele der LEDs aktualisiert werden sollen. Der Maximalwert ist derjenige, der bei ws2812.init() angegeben wurde. Dann werden alle LEDs aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
    ws2812.refresh (MAXLEDS)              // Ausgabe: Alle LEDs aktualisieren&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konkreteres Beispiel siehe oben: [[NIC#ws2812.set_.28.29|ws2812.set()]].&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irmp ===&lt;br /&gt;
&lt;br /&gt;
==== irmp.init () ====&lt;br /&gt;
==== irmp.get () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irsnd ===&lt;br /&gt;
&lt;br /&gt;
==== irsnd.init () ====&lt;br /&gt;
==== irsnd.send () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek i2c ===&lt;br /&gt;
&lt;br /&gt;
==== i2c.init () ====&lt;br /&gt;
&lt;br /&gt;
i2c.init () initialisiert die jeweils gewünschte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
  void i2c.init (int channel, int alternate, int clockspeed)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
*  channel: I2C-Channel. Erlaubte Werte: I2C1, I2C2 oder I2C3. Welche Werte davon möglich sind, ist prozessorabhängig.&lt;br /&gt;
*  alternate: Flag, ob die alternative Pinkonfiguration verwendet werden soll, siehe Tabelle.&lt;br /&gt;
*  clockspeed: Taktgeschwindigkeit. Standard ist 100000 (100k), möglich ist aber auch 400000 (400k) für schnelle Peripherie&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Mögliche I2C-Channel&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Channel || ALT || STM32F4x1 Nucleo || STM32F103C8T6&lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  0  || SCL=PB6,  SDA=PB7|| SCL=PB6,  SDA=PB7 &lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  0  || SCL=PB10, SDA=PB3 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  0  || SCL=PA8,  SDA=PB4 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  1  || SCL=PB8,  SDA=PB9 || SCL=PB8,  SDA=PB9&lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  1  ||                   ||                   &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  1  || SCL=PA8,  SDA=PC9 ||                   &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)          // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== i2c.write () ====&lt;br /&gt;
&lt;br /&gt;
i2c.write() schreibt einen Datenpuffer auf die gewählte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.write (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Schreiben des Datums &amp;quot;2017-06-10 16:32:12&amp;quot; in eine DS3231 Real Time Clock:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// write date/time to DS3231&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year = 2017&lt;br /&gt;
int mon  = 6&lt;br /&gt;
int mday = 10&lt;br /&gt;
int hour = 16&lt;br /&gt;
int min  = 32&lt;br /&gt;
int sec  = 12&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert decimal number into BCD format&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int dec2bcd (int i)&lt;br /&gt;
    i = ((i / 10) &amp;lt;&amp;lt; 4) | (i  % 10)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: set date/time to 2017-06-10 16:32:12&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    year = year % 100                                   // 2000 - 2099 -&amp;gt; 00 - 99&lt;br /&gt;
&lt;br /&gt;
    buf[0] = dec2bcd (sec)                              // seconds (0-59)&lt;br /&gt;
    buf[1] = dec2bcd (min)                              // minutes (0-59)&lt;br /&gt;
    buf[2] = dec2bcd (hour)                             // hours (0-24)&lt;br /&gt;
    buf[3] = 0                                          // wday (unknown) (0-6)&lt;br /&gt;
    buf[4] = dec2bcd (mday)                             // day of month (0-31)&lt;br /&gt;
    buf[5] = dec2bcd (mon)                              // month (1-12)&lt;br /&gt;
    buf[6] = dec2bcd (year)                         	// year (00-99)&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, RTC, 0x00, FALSE, buf, 7)    // write to RTC&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag beim Aufruf von i2c.write() auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== i2c.read () ====&lt;br /&gt;
&lt;br /&gt;
i2c.read() liest Daten von der gewählten I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.read (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Lesen von Datum/Uhrzeit aus DS3231 Real Time Clock und Ausgabe auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// read date/time from DS3231 RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year&lt;br /&gt;
int mon&lt;br /&gt;
int mday&lt;br /&gt;
int hour&lt;br /&gt;
int min&lt;br /&gt;
int sec&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert BCD format into decimal number&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int bcd2dec (byte i)&lt;br /&gt;
    i = 10 * ((i &amp;amp; 0xF0) &amp;gt;&amp;gt; 4) + (i &amp;amp; 0x0F)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: get date/time from RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
    int     rtc&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, RTC, 0x00, FALSE, buf, 7)     // read from RTC&lt;br /&gt;
&lt;br /&gt;
    if rtc = TRUE&lt;br /&gt;
        sec  = bcd2dec (buf[0])                     	// seconds (0-59)&lt;br /&gt;
        min  = bcd2dec (buf[1])                     	// minutes (0-59)&lt;br /&gt;
        hour = bcd2dec (buf[2])                     	// hours (0-24)&lt;br /&gt;
        mday = bcd2dec (buf[4])                     	// day of month (0-31)&lt;br /&gt;
        mon  = bcd2dec (buf[5])                     	// month (1-12)&lt;br /&gt;
        year = bcd2dec (buf[6])                     	// year (00-99)&lt;br /&gt;
        year = year + 2000                          	// 00 - 99 -&amp;gt; 2000 - 2099&lt;br /&gt;
&lt;br /&gt;
        console.print (year, DEC0, 4)                   // print YYYY-DD-MM hh:mm:ss&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mon, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mday, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot; &amp;quot;)&lt;br /&gt;
        console.print (hour, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (min, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (sec, DEC0, 2)&lt;br /&gt;
        console.println (&amp;quot;&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiteres Beispiel: Lesen/Schreiben eines EEPROMs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: write some values into EEPROM, read them from EEPROM again&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buffer1[8]&lt;br /&gt;
    byte    buffer2[8]&lt;br /&gt;
    int     rtc&lt;br /&gt;
    int     i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        buffer1[i] = i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, EEPROM, 0x0000, TRUE, buffer1, 8)    // write buffer1 to EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c write error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, EEPROM, 0x0000, TRUE, buffer2, 8)     // read buffer2 from EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c read error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        console.println (buffer2[i])&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da das EEPROM 16-Bit-Startadressen erwartet, wird hier das Flag auf TRUE gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek rtc ===&lt;br /&gt;
&lt;br /&gt;
==== rtc.read () ====&lt;br /&gt;
==== rtc.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek eeprom ===&lt;br /&gt;
&lt;br /&gt;
==== eeprom.read () ====&lt;br /&gt;
==== eeprom.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek onewire ===&lt;br /&gt;
&lt;br /&gt;
==== onewire.init () ====&lt;br /&gt;
==== onewire.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ds1820 ===&lt;br /&gt;
&lt;br /&gt;
==== ds1820.init () ====&lt;br /&gt;
==== ds1820.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek lcd ===&lt;br /&gt;
&lt;br /&gt;
==== lcd.init () ====&lt;br /&gt;
==== lcd.move () ====&lt;br /&gt;
==== lcd.print () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek spi ===&lt;br /&gt;
&lt;br /&gt;
==== spi.init () ====&lt;br /&gt;
==== spi.read () ====&lt;br /&gt;
==== spi.write () ====&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Lauflicht mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird ein Lauflicht mit 30 WS2812-LEDs realisiert. Die erste Variante läuft noch mit der delay-Funktion, welche keinen Spielraum mehr lässt für andere Sachen, die eventuell auch noch abgearbeitet werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante ist da schon wesentlich eleganter. Sie wird nur aktiv, wenn auch Änderungen auf unserem LED-Streifen vonnöten sind.&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante dagegen überlässt dem NIC-Laufzeitsystem die Zeitmessung bis zum nächsten LED-Update, so dass man sich darum nicht mehr kümmern muss. Desweiteren kann man bis zu 8 solcher Alarm-Timer gleichzeitig aktivieren, so dass man hier auch ganz verschiedene Aufgaben mit unterschiedlichen Aktivierungszeiten implementieren kann. Hier wird der Alarm-Timer noch gepollt, d.h. explizit abgefragt.&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird auch dieses noch dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche automatisch aufgerufen werden soll, wenn der Alarm eintrifft.&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Delay ===&lt;br /&gt;
&lt;br /&gt;
Die erste Variante arbeitet mit einem Delay, welches den Prozessor warten lässt. Währenddessen kann man keine anderen Aktionen im Programm ausführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                           // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                       // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                        // Gruen aus&lt;br /&gt;
    int blue    =  0                        // Blau aus&lt;br /&gt;
    int led                                 // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                  // Initialisierung&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        ws2812.set (MAX_LEDS, 0, 0, 0)      // Alle LEDs aus&lt;br /&gt;
        ws2812.set (led, red, green, blue)  // Eine LED leuchten lassen&lt;br /&gt;
        ws2812.refresh (MAX_LEDS)           // Zustand aktualisieren&lt;br /&gt;
        led = led + 1                       // Naechste LED&lt;br /&gt;
        if led &amp;gt;= MAX_LEDS                  // Ende erreicht?&lt;br /&gt;
            led = 0                         // Ja, zurueck zum Anfang&lt;br /&gt;
        endif&lt;br /&gt;
        time.delay (500)                    // Eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Millis-Timer ===&lt;br /&gt;
&lt;br /&gt;
Diese Variante ermittelt mittels time.millis(), wann es aktiv werden soll und kann währenddessen noch andere Aufgaben erledigen. Allerdings wird hier der millis-Timer verwendet, so dass dieser nicht mehr für andere Dinge zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    time.reset ()                                   // Setze &amp;quot;Uhrzeit&amp;quot; zurueck&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if time.millis() &amp;gt; 500                      // Eine halbe Sekunde erreicht?&lt;br /&gt;
            time.reset ()                           // Ja, Zeit wieder zuruecksetzen&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm ===&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante verwendet einen von acht Alarm-Timern. Das ist damit die Luxusversion. Der millis-Timer wird nicht verwendet. Neben diesem können noch sieben weitere Alarm-Timer für andere Aufgaben benutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
    int timer1                                      // alarm-timer&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    timer1 = alarm.set (500)                        // Alarm initialisieren&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if alarm (timer1) = TRUE                    // Alarm gesetzt?&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm als Interrupt ===&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird das Pollen des Alarm-Timers dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche aufgerufen werden soll, wenn der Alarm eintrifft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void lauflicht ()&lt;br /&gt;
    static int red      = 128                       // Rot&lt;br /&gt;
    static int green    = 0                         // Gruen&lt;br /&gt;
    static int blue     = 0                         // Blau&lt;br /&gt;
    static int led                                  // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.set (MAX_LEDS, 0, 0, 0)                  // Alle LEDs aus&lt;br /&gt;
    ws2812.set (led, red, green, blue)              // Eine LED leuchten lassen&lt;br /&gt;
    ws2812.refresh (MAX_LEDS)                       // Zustand aktualisieren&lt;br /&gt;
    led = led + 1                                   // Naechste LED&lt;br /&gt;
    if led &amp;gt;= MAX_LEDS                              // Ende erreicht?&lt;br /&gt;
        led = 0                                     // Ja, zurueck zum Anfang&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    alarm.set (500, function.lauflicht)             // lauflicht() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variablen led, red, green und blue sind nun alle in die Funktion lauflicht() gewandert. Die Definition als static-Variable lassen sie über die ganze Laufzeit des Programms &amp;quot;leben&amp;quot;, d.h. sie verlieren nicht ihren Wert, wenn die Funktion wieder verlassen wird. Alternativ können sie auch einfach als globale Variablen definiert werden. Der Vorteil der static-Definition ist jedoch, dass sie ausschließlich in der Funktion lauflicht() manipuliert werden können.&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Knight Rider mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Equinox-Uhr mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Erstellung eigener NIC-Bibliotheksfunktionen =&lt;br /&gt;
&lt;br /&gt;
= Benchmarks =&lt;br /&gt;
&lt;br /&gt;
=== Sieb des Eratosthenes ===&lt;br /&gt;
&lt;br /&gt;
Es geht um die Ermittlung sämtlicher Primzahlen bis 100.000.&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in NIC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int limit = 100000&lt;br /&gt;
    int zahl&lt;br /&gt;
    int zaehler&lt;br /&gt;
    int primzahl&lt;br /&gt;
    int letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
    for zahl = 2 to limit&lt;br /&gt;
        primzahl = TRUE&lt;br /&gt;
&lt;br /&gt;
        for zaehler = 2 to zahl / 2&lt;br /&gt;
            if zahl % zaehler = 0&lt;br /&gt;
                primzahl = FALSE&lt;br /&gt;
                break&lt;br /&gt;
            endif&lt;br /&gt;
        endfor&lt;br /&gt;
&lt;br /&gt;
        if primzahl = TRUE&lt;br /&gt;
            // console.println (zahl : &amp;quot; ist eine Primzahl&amp;quot;)&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
        endif&lt;br /&gt;
    endfor&lt;br /&gt;
    console.println (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; : letzte_primzahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in PHP:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$limit = 100000;&lt;br /&gt;
&lt;br /&gt;
for ($zahl = 2; $zahl &amp;lt;= $limit; $zahl++)&lt;br /&gt;
{&lt;br /&gt;
    $primzahl = true;&lt;br /&gt;
&lt;br /&gt;
    for ($zaehler = 2; $zaehler &amp;lt;= $zahl / 2; $zaehler++)&lt;br /&gt;
    {&lt;br /&gt;
        if ($zahl % $zaehler == 0)&lt;br /&gt;
        {&lt;br /&gt;
            $primzahl = false;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ($primzahl)&lt;br /&gt;
    {&lt;br /&gt;
        // print (&amp;quot;&amp;quot; . $zahl . &amp;quot; ist eine Primzahl\n&amp;quot;);&lt;br /&gt;
        $letzte_primzahl = $zahl;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; . $letzte_primzahl . &amp;quot;\n&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Python:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    limit = 100000&lt;br /&gt;
&lt;br /&gt;
    for zahl in range (2, limit):&lt;br /&gt;
        primzahl = True&lt;br /&gt;
&lt;br /&gt;
        for zaehler in range (2, zahl / 2):&lt;br /&gt;
            if zahl % zaehler == 0:&lt;br /&gt;
                primzahl = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if primzahl == True:&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
    print &amp;quot;Die hoechste ermittelte Primzahl ist %d&amp;quot; % (letzte_primzahl)&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Lua:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
local limit = 100000&lt;br /&gt;
local zahl&lt;br /&gt;
local zaehler&lt;br /&gt;
local primzahl&lt;br /&gt;
local letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
for zahl = 2, limit do&lt;br /&gt;
    primzahl = true&lt;br /&gt;
&lt;br /&gt;
    for zaehler = 2, zahl / 2 do&lt;br /&gt;
        if zahl % zaehler == 0 then&lt;br /&gt;
            primzahl = false&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if primzahl == true then&lt;br /&gt;
        -- print (zahl, &amp;quot;ist eine Primzahl&amp;quot;)&lt;br /&gt;
        letzte_primzahl = zahl&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot;, letzte_primzahl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Umsetzung in PHP, Python und Lua wurde durch 1:1-Ersetzung jeder Zeile durch die adäquate Formulierung in der jeweiligen Programmiersprache vorgenommen. Die Programme sind damit direkt vergleichbar.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeiten:&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ergebnisse: Sieb des Eratosthenes&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Programmiersprache || Version || i7-2600 CPU @ 3.40GHz || Intel T6500 @ 2.10GHz&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NIC&#039;&#039;&#039; || 0.9 || 5,3 sec || 17,3 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PHP&#039;&#039;&#039; || 5.6.23 || 10,4 sec ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Python&#039;&#039;&#039; || 2.7 || 25,6 sec || 118 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Lua&#039;&#039;&#039; || 5.2 || 6,1 sec ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich nicht, obiges Programm auf dem STM32 mit dem oben verwendeten Startwert 100000 laufen zu lassen. Dabei muss man schon seeeehr lange warten, da der STM32 doch um einiges langsamer ist als ein moderner Intel-Prozessor. Für eigene Messungen auf dem STM32 empfiehlt sich ein Startwert von 10000, also eine Größenordnung geringer.&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Warnungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens foo ist zwar definiert, wird aber nicht aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar definiert, aber nicht verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; set but not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar zwischenzeitlich gesetzt, aber sonst nicht weiter verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;local variable &#039;foo&#039; shadows global variable &#039;foo&#039; defined in line NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die lokale Variable &#039;foo&#039; überdeckt die globale gleichnamige Variable. Dies kann je nach Kontext zu unerwünschten Effekten führen: In der Funktion, wo die lokale Variable definiert wurde, wird dann der Wert dieser lokalen Variablen verwendet, in allen anderen Funktionen jedoch der Wert der globalen Variablen.&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Fehlermeldungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with a value, in function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte void-Funktion liefert unzulässigerweise einen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with no value, in function returning non-void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte Funktion mit Datentyp als Rückgabewert liefert unzulässigerweise keinen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;keyword &#039;foo&#039; unexpected.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &#039;foo&#039; ist an der angegebenen Stelle unerwartet und damit falsch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;break stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Break-Befehl unterbrochen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;continue stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Continue-Befehl am Anfang der Schleife fortgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;double negation not allowed.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine doppelte Negation eines numerischen Wertes ist nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;empty expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der erwartete arithmetische Ausdruck ist leer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;invalid argument type &#039;foo&#039; in function &#039;bar&#039;, argument #NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der angegebene Parameter an NN-ter Stelle hat einen ungültigen Datentyp.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;main must be defined as function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die main-Funktion muss stets vom Datentyp void definiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no main function found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein NIC-Programm muss immer eine main-Funktion als Startpunkt enthalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; returns void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, den Rückgabewert einer Funktion &#039;foo&#039; weiterzuverwenden, obwohl der Datentyp dieser Funktion &#039;void&#039; ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; undefined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die aufgerufene Funktion &#039;foo&#039; ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;unterminated string.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebene Zeichenkette wurde nicht mit dem Anführungszeichen terminiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing &#039;endfoo&#039; at end of file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein geöffneter Kontrollblock wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurden keine Parameter für die Funktion foo angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing closing bracket.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine geöffnete Klammer wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no matching &#039;)&#039; found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu einer geschlossenen Klammer wurde die dazugehörende geöffnete Klammer nicht gefunden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing return before &#039;endfunction&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Return-Statement unmittelbar vor dem Ende der Funktion fehlt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no compare operator found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurde kein Vergleichsoperator im Ausdruck angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;number of arguments wrong for call of function &#039;foo&#039;, expected NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Parameter für den Aufruf der Funktion &#039;foo&#039; ist falsch, richtig ist NN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;syntax error. Use brackets around negative expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein Ausdruck mit einem negativen Operanden (wie z.B. &amp;quot;3 * -2&amp;quot;) bedeutet einen Syntax-Error. In diesem Fall muss der zu negierende Operand geklammert werden, also: &amp;quot;3 * (-2)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu viele Parameter für den Aufruf der Funktion namens &#039;foo&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many closing brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geschlossene Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many open brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geöffnete Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many expressions.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck ist zu komplex.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde vorher nicht definiert.&lt;/div&gt;</summary>
		<author><name>Klause</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96669</id>
		<title>NIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96669"/>
		<updated>2017-06-20T13:33:33Z</updated>

		<summary type="html">&lt;p&gt;Klause: Lang lebe Easy AVR&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dies ist eine vorläufige und höchst unvollständige Beschreibung einer Software, die noch in Entwicklung, d.h. im Alpha-Stadium ist. Ein entsprechender Thread über NIC wird im Forum &amp;quot;Projekte &amp;amp; Code&amp;quot; eröffnet, sobald eine Beta-Version des NIC-Interpreters verfügbar ist. Details können sich durchaus noch ändern, daher ist diese Dokumentation zur Zeit noch rein als PRELIMINARY zu sehen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NIC ist eine einfache strukturierte Programmiersprache, welche speziell für die Mikrocontroller-Familie STM32 entwickelt wurde. Da der NIC-Interpreter in C geschrieben ist, kann dieser auch auf andere 32-Bit-Mikrocontroller portiert werden. &lt;br /&gt;
&lt;br /&gt;
Ebenso sind NIC-Programme auch unter Linux und Windows lauffähig, wobei dies eher der Entwicklung und des Debuggings des NIC-Interpreters dient. Ein in NIC geschriebenes Programm wird zunächst von dem NIC-Compiler &amp;quot;nicc&amp;quot; auf dem Host in einen Metacode übersetzt, welcher durch den NIC-Interpreter &amp;quot;nici&amp;quot; auf dem Mikrocontroller-System sehr effizient abgearbeitet werden kann. Die üblichen Übersetzungsdauern liegen meist unter einer Sekunde, die Geschwindigkeit, mit der die Befehle dann von nici ausgeführt werden, liegen bei ca. 100.000 bis 250.000 Befehlen pro Sekunde - je nach verwendetem STM32. Als Host zum Compilieren von NIC-Programmen dient zur Zeit ein PC-System mit Linux oder Windows, später wird dies auch ein vorgeschalteter µC wie ein ESP8266 sein, der gleichzeitig ein Filesystem (SPIFFS) bietet, um die Compilate zu speichern und damit permanent vorzuhalten. Zudem erweitert dieser dann das NIC-Laufzeitsystem um Netzwerkfunktionalitäten.&lt;br /&gt;
&lt;br /&gt;
Motivationen zur Entwicklung eines solchen Interpreters gibt es einige: Zum einen wird Einsteigern ein sehr einfaches System geboten, sich in die Welt von 32-Bit-Mikrocontrollern einzuarbeiten, zum anderen schrecken viele Umsteiger von 8-Bit-Systemen auf 32-Bit-Systeme vor der Komplexität der 32-Bitter zurück. Genau diese Komplexität wird in die NIC-Bibliotheksfunktionen verlegt, so dass man sich als NIC-Programmierer nicht damit im Detail befassen muss. Ein erfahrener Programmierer jedoch kann die NIC-Laufzeitbibliothek durch eigene C-Module erweitern, um diese dann im NIC-Programm unter Nutzung der NIC-API zu nutzen. So ist es dann zum Beispiel auf einfache Art und Weise möglich, eine Kette von WS2812-LEDs per DMA zu steuern, ohne sich im Detail mit der Programmierung einer DMA auseinandersetzen zu müssen.&lt;br /&gt;
&lt;br /&gt;
NIC als strukturierte Programmiersprache ähnelt in manchen Teilen C, PHP, Pascal oder auch Basic. Datentypen müssen jedoch zum Beispiel im Gegensatz zu PHP stets angegeben werden. Trotzdem ist stets eine implizite Typumwandlung (zum Beispiel von Integer-Werten in Strings oder umgekehrt) möglich, die klaren Regeln unterworfen ist. Casts wie in C sind dabei nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist NIC als Interpretersprache nicht so schnell wie ein C-Programm, kann sich aber trotzdem bezüglich Ausführungsgeschwindigkeit durchaus sehen lassen. Ein erfahrener C-Programmierer kann zeitkritische Programmteile in C erstellen, um sie dann als NIC-Bibliotheksfunktionen komfortabel zu nutzen. Der NIC-Interpreter ist ca. doppelt so schnell wie ein adäquates PHP-Programm und meist 3-5 mal schneller als vergleichbare Python-Programme, siehe auch [[NIC#Benchmarks|Benchmarks]].&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und diese Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und eine Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
= Compiler nicc =&lt;br /&gt;
&lt;br /&gt;
Der Compiler nicc ist für Windows und Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Windows ===&lt;br /&gt;
    nicc [-v] [-u COMx] datei.nic&lt;br /&gt;
&lt;br /&gt;
Die in eckigen Klammern angegebenen Parameter sind optional.&lt;br /&gt;
&lt;br /&gt;
Optionen:&lt;br /&gt;
    -v : Verbose, gibt Statistiken, wie zum Beispiel Optimierungen von Ausdrücken aus&lt;br /&gt;
    -u COMx: Upload der compilierten Datei über die seriellen Schnittstelle COMx&lt;br /&gt;
&lt;br /&gt;
Der NIC-Quelltext wird dabei in einen optimierten, maschinenunabhängigen Objekt-Code übersetzt. Das Kompilat legt nicc in der Datei datei.nico ab, welche (zur Zeit noch) eine ASCII-Datei ist. Gibt man per Upload-Parameter die serielle Schnittstelle an, wird das Kompilat direkt auf den µC geladen. Der Interpreter legt den Objekt-Code dann als binäre Datenstrukturen im RAM ab, um diese dann effizient abzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
    nicc -u com5 lauflicht1.nic&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Linux ===&lt;br /&gt;
    nicc [-v] datei.nic&lt;br /&gt;
&lt;br /&gt;
Hier fehlt (noch) die Upload-Funktion. Dafür ist es aber möglich, das Kompilat direkt unter Linux zu starten, siehe nächstes [[NIC#Interpreter_nici|Kapitel]].&lt;br /&gt;
&lt;br /&gt;
=== Optimierungen ===&lt;br /&gt;
&lt;br /&gt;
Der NIC-Compiler bringt sämtliche arithmetische Ausdrücke wie &amp;quot;3 * 4 + x + 1 &amp;lt;&amp;lt; 6&amp;quot; nach den Prioritätenregeln (Punkt- vor Strichrechnung usw.) in die UPN-Notation - auch Postfix genannt. Dabei werden konstante Teilausdrücke wie &amp;quot;3 * 4&amp;quot; direkt durch das Ergebnis &amp;quot;12&amp;quot; zur Compilezeit ersetzt. Dadurch muss der Interpreter sich nicht mehr um solche Regeln kümmern, sondern braucht nur noch einen Stack abzuarbeiten, auf dem alle Operanden und Operatoren schon fix und fertig in der richtigen Reihenfolge vorliegen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren werden zur Compilezeit sämtliche Sprungadressen, die durch Schleifen wie loop, repeat, for, while, break und continue entstehen, vorher ausgerechnet, so dass der Interpreter je nach Bedingung nur noch Sprungadressen laden muss. Desweiteren sind bei Aufruf von Bibliotheksfunktion (wie zum Beispiel [[NIC#Bibliothek_gpio|GPIO]]) die zu übergebenden Daten direkt zum Bedienen der API für Bibliotheksfunktionen vorbereitet. Diese können damit schnell und effektiv bedient werden.&lt;br /&gt;
&lt;br /&gt;
Häufig vorkommende Konstrukte wie &amp;quot;n = n + 1&amp;quot; werden in spezielle Increment- und Decrement-Befehle gewandelt, die vom NIC-Interpreter ohne Evaluierung des arithmetischen Ausdrucks rechts vom Gleichheitszeichen direkt intern auf den Variableninhalt wirken.&lt;br /&gt;
&lt;br /&gt;
= Interpreter nici =&lt;br /&gt;
&lt;br /&gt;
Der NIC-Interpreter nici wird im Flash des STM32 installiert (HEX-Datei). Dieser wartet dann auf dem UARTx auf das übersetzte NIC-Programm, um es direkt nach dem Upload auszuführen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler:&lt;br /&gt;
&lt;br /&gt;
Man kann den Interpreter unter Linux und Windows direkt von der Kommandozeile aus starten.&lt;br /&gt;
&lt;br /&gt;
Übersetzen:&lt;br /&gt;
    nicc datei.nic&lt;br /&gt;
Ausführen:&lt;br /&gt;
    nici datei.nico&lt;br /&gt;
&lt;br /&gt;
STM32-spezifische Funktionen wie gpio.toggle() laufen dabei auf eine Stub-Funktion geleitet, welche die Laufzeitparameter als Info ausgeben. Alle anderen Funktionen werden jedoch ordnungsgemäß ausgeführt. Trotzdem ist der Interpreter nicc unter Linux bzw. Windows eher zur Weiterentwicklung und Debugging des Compilers und des Interpreters gedacht und nicht dafür, Programme für Linux/Windows in der Programmiersprache NIC zu entwickeln - auch wenn das so möglich wäre.&lt;br /&gt;
&lt;br /&gt;
= main-Funktion =&lt;br /&gt;
&lt;br /&gt;
Jedes NIC-Programm muss eine Funktion namens &amp;quot;main()&amp;quot; definieren. Das ist der Startpunkt eines jeden NIC-Programms. Die Funktion main() liefert stets keinen Rückgabewert zurück und muss daher immer mit dem Funktionstyp &amp;quot;void&amp;quot; angegeben werden. Außerdem erhält sie keine Parameter, daher ist der Inhalt zwischen den Klammern &amp;quot;(&amp;quot; und &amp;quot;)&amp;quot; leer.&lt;br /&gt;
&lt;br /&gt;
Damit ergibt sich als Funktionsrumpf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
Ale Einstiegsprogramm einer Programmiersprache wird oft ein einfaches Hello-World-Programm angegeben, welches die Zeichenkette &amp;quot;Hello, World&amp;quot; ausgibt. Für Mikrocontroller jedoch ist es oft das Blinken einer an den Mikrocontroller angeschlossenen LED.&lt;br /&gt;
&lt;br /&gt;
Das folgende NIC-Programm lässt die LED auf einem Nucleo-Board blinken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.set (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
        gpio.reset (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die LED wird dabei für 500msec ein- und dann für 500msec wieder abgeschaltet. Durch die Kontrollstruktur &amp;quot;loop&amp;quot; läuft das Programm in einer Endlosschleife und kann nur durch Drücken der RESET-Taste gestoppt werden. Hier werden drei interne Bibliotheksfunktionen der Familie &#039;&#039;&#039;[[NIC#Bibliothek_gpio|gpio]]&#039;&#039;&#039; aufgerufen, nämlich [[NIC#gpio.init_.28.29|gpio.init()]], [[NIC#gpio.set_.28.29|gpio.set()]] und [[NIC#gpio.reset_.28.29|gpio.reset()]]. Die erste Funktion [[NIC#gpio.init_.28.29|gpio.init()]] initialisiert den Pin A5 des STM32 als Ausgabe-Pin durch Angabe des Schlüsselwortes &amp;quot;OUTPUT&amp;quot;, die Funktion [[NIC#gpio.set_.28.29|gpio.set()]] setzt dann den Pin auf HIGH-Pegel, die Funktion [[NIC#gpio.reset_.28.29|gpio.reset()]] wieder auf LOW-Pegel. Die Bibliotheksfunktion time.delay() lässt den Mikrocontroller eine bestimmte Anzahl von Millisekunden warten - hier 500msec.&lt;br /&gt;
&lt;br /&gt;
Am Pin A5 ist bei den Nucleo-Boards eine board-interne grüne LED angeschlossen. Diese blinkt dann bei der Ausführung des Programms. Um die board-interne blaue LED eines STM32F103-Mini-Development-Boards anzusprechen, muss der Port GPIOA durch GPIOC ersetzt und die Pinnummer auf 13 geändert werden, denn hier ist die LED an Pin C13 angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Durch Anwendung der Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] kann der Code noch vereinfacht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wechselt die Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] automatisch den jeweiligen LOW- bzw. HIGH-Pegel und lässt die LED mit einer Frequenz von einem Hertz blinken.&lt;br /&gt;
&lt;br /&gt;
Wie wir später noch sehen werden, kann das Blinken der LED auch timergesteuert ausgeführt werden. Dann macht der NIC-Interpreter das &amp;quot;nebenbei&amp;quot;, d.h. wir haben in der Hauptschleife Zeit für andere Dinge.&lt;br /&gt;
&lt;br /&gt;
Hier schon mal das Programm, erklärt wird es dann später unten (alarm-Funktionen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink ()&lt;br /&gt;
    gpio.toggle (GPIOA, 5)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    alarm.set (500, function.blink)                 // blink() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie schnell ist nun der NIC-Interpreter? Wir können nun durch Entfernen des delay-Aufrufs die LED mit maximaler Geschwindigkeit blinken lassen und dann die Zeiten messen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103-Mini-Board: LED=C13&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Endlosschleife &#039;&#039;&#039;[[NIC#loop|loop]]&#039;&#039;&#039; wurde hier durch ein &#039;&#039;&#039;[[NIC#repeat|repeat]]&#039;&#039;&#039; ersetzt. Hier können wir angeben, wie oft eine Schleife durchlaufen wird. In unserem Beispiel sind es 1.000.000 mal. Das Blinken selbst wird man aufgrund der Geschwindigkeit nicht mehr erkennen können, jedoch leuchtet die LED weiterhin deutlich sichtbar - bis das Programm nach einer Million Schleifendurchläufen beendet wird. Man wird dabei mit der Stoppuhr auf einem STM32F411RE-Nucleo-Board ungefähr 4 Sekunden messen.&lt;br /&gt;
&lt;br /&gt;
Der Messvorgang geht aber auch genauer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
    int diff&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    diff = stop - start&lt;br /&gt;
    console.println (diff)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden nun erstmals Variablen namens &amp;quot;start&amp;quot; und &amp;quot;stop&amp;quot; verwendet. Sie entsprechen der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden. Durch die Funktion [[NIC#time.millis_.28.29|time.millis()]] können wir jederzeit die interne Zeit des Mikrocontrollers abrufen und in einer Variablen speichern. Deshalb wird jemals einmal vor und nach dem Schleifendurchlauf die Zeit gestoppt. Die Differenz wird in der Variablen &amp;quot;diff&amp;quot; gespeichert und dann mittels der Funktion [[NIC#console.println_.28.29|console.println()]] in Millisekunden auf der Console ausgegeben. Die Console ist dabei die serielle UART-Schnittstelle, die bei jedem Nucleo on-board dabei ist. Bei einem STM32F103-Mini-Development-Board muss ein zusätzlicher UART-Adapter angeschlossen werden, siehe entsprechendes Kapitel weiter unten. Bei einem mit 100MHz getakteten STM32F411RE sind dies ca. 3900msec. Das Programm schafft also ungefähr 255.000 Schleifendurchläufe pro Sekunde. Bei einem mit 85MHz getakteten STM32F401RE sind es noch knapp 200.000 Schleifendurchläufe, beim STM32F103 mit 72MHz-Takt ca. 180.000 Durchläufe.&lt;br /&gt;
&lt;br /&gt;
Das Programm kann aber noch stärker vereinfacht werden. Zunächst eliminieren wir die Variable &amp;quot;diff&amp;quot;, indem wir die Differenz der Werte &amp;quot;stop&amp;quot; und &amp;quot;start&amp;quot; direkt der Funktion [[NIC#console.println_.28.29|console.println()]] übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    console.println (stop - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also: Funktionen können nicht nur einfache Werte, sondern auch algebraische Ausdrücke direkt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Aber es geht noch einfacher. Jetzt verzichten wir auch noch auf die Variable &amp;quot;stop&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    console.println (time.millis () - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Funktionsparameter können also auch Rückgabewerte anderer Funktionen oder noch komplexere Ausdrücke angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber noch das Hello-World-Programm im klassischen Sinne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, World!&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sieht jetzt - nachdem wir bereits eine LED auf mehrere Art und Weise haben blinken lassen - doch viel zu einfach aus ;-)&lt;br /&gt;
&lt;br /&gt;
= Kommentare =&lt;br /&gt;
&lt;br /&gt;
Kommentare werden durch einen doppelten Schrägstrich eingeleitet, also durch &#039;//&#039;. Alle danach aufgeführten Zeichen gelten als Kommentar und werden vom NIC-Compiler nicc ignoriert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Datentypen =&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Funktionen und Variablen müssen stets angegeben werden. Eine implizite Definition durch einfache Aufführung eines einer Funktion, eines Funktionsparameters oder einer Variablen wie in PHP oder Python ist nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Variablen und Funktionen sind Integer, Byte oder String, evtl. später auch noch &amp;quot;Float&amp;quot;. Bei Funktionen ist zusätzlich der Datentyp &amp;quot;void&amp;quot; möglich, um anzugeben, dass die Funktion &#039;&#039;&#039;keinen&#039;&#039;&#039; Funktionswert zurückliefert.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;int&#039;&#039;&#039; - Datentyp Integer, Breite 32 Bit, vorzeichenbehaftet&lt;br /&gt;
* &#039;&#039;&#039;byte&#039;&#039;&#039; - Datentyp Byte, Breite 8 Bit, vorzeichenlos&lt;br /&gt;
* &#039;&#039;&#039;string&#039;&#039;&#039; - Datentyp Zeichenkette&lt;br /&gt;
* &#039;&#039;&#039;void&#039;&#039;&#039; - kein Returnwert (nur Funktionen)&lt;br /&gt;
&lt;br /&gt;
Funktionen können als Rückgabewerte nicht nur die oben aufgeführten Typen zurückliefern, sondern auch vom Typ &#039;&#039;&#039;void&#039;&#039;&#039; sein, um anzuzeigen, dass sie &#039;&#039;&#039;keinen&#039;&#039;&#039; Rückgabewert liefern.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void errormessage (string message)&lt;br /&gt;
    console.println (&amp;quot;error: &amp;quot; : message)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei allen anderen Datentypen muss eine Funktion einen Wert per return-Befehl zurückgeben.&lt;br /&gt;
&lt;br /&gt;
= Konstanten =&lt;br /&gt;
&lt;br /&gt;
=== Integer-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
Integer-Konstanten sind einfache Zahlenfolgen wie 1234 oder -1234. Ohne entsprechendes Prefix sind dies Dezimalzahlen. Möchte man einen numerischen Wert in hexadezimal angeben, ist 0x voranzustellen, also zum Beispiel 0x1234. Zahlen können auch im Binärsystem angegeben werden. In diesem Fall ist 0b voranzustellen, z.B. 0b10011100.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* 1234 ist eine Dezimalzahl&lt;br /&gt;
* 0x23AF ist eine Hexadezimalzahl&lt;br /&gt;
* 0b01010101 ist eine Binärzahl&lt;br /&gt;
&lt;br /&gt;
=== String-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
String-Konstanten werden in Anführungszeichen angegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Das ist eine String-Konstante&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Variablen =&lt;br /&gt;
&lt;br /&gt;
Variablen werden definiert durch die Angabe des Datentyps und des Namens.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int nummer&lt;br /&gt;
    byte data&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt lediglich drei verschiedene Datentypen: &#039;&#039;&#039;int&#039;&#039;&#039; oder  &#039;&#039;&#039;byte&#039;&#039;&#039; oder &#039;&#039;&#039;string&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Der Datentyp int definiert einen 32-Bit-Integer, ist also vorzeichenbehaftet. Der Datentyp byte entspricht dem Byte, kennt also keinerlei Vorzeichen und ist 8 Bit breit. Der Typ string ist eine Zeichenkette.&lt;br /&gt;
&lt;br /&gt;
=== Globale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable außerhalb von Funktionen definiert, ist sie eine globale Variable. Auf globale Variablen kann funktionsübergreifend zugegriffen werden - und zwar ab der Zeile, wo sie definiert wird. Eine globale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang des Quelltextes geschehen, jedoch spätestens dann, wenn auch auf sie zugegegriffen werden soll.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    maxleds = 30&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Globale Variablen können auch direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
    maxleds = 40&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 40&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lokale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion definiert, dann gilt sie nur innerhalb dieser Funktion. Bei jedem Funktionsaufruf werden die lokalen Variablen neu erzeugt und (im Gegensatz z.B. zu C) neu mit 0 (für int) bzw. Leerstring &amp;quot;&amp;quot; (für string) initialisiert. Ruft die Funktion sich selbst rekursiv auf, wird jedesmal ein neuer lokaler Variablensatz erzeugt. Lokale Variablen werden nach dem Verlassen der jeweiligen Funktion wieder zerstört und sind dann nicht mehr verfügbar.&lt;br /&gt;
&lt;br /&gt;
Eine lokale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens aber unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var&lt;br /&gt;
    var = 3 * 2&lt;br /&gt;
    console.println (var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch lokale Variablen können direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 3&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind zur Zeit nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Statische Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion statisch definiert, dann gilt für sie erst einmal dasselbe wie für lokale Variablen. Der einzige Unterschied: Sie wird nur einmal beim Start des Programms erzeugt und beim Verlassen der Funktion auch nicht zerstört. Das heisst: Die Variable (und deren Inhalt) &amp;quot;lebt&amp;quot; während der ganzen Laufzeit des Programms. Außerhalb der Funktion, wo sie definiert wird, kann auf sie mit dem Namen &amp;quot;function.variable&amp;quot; zugegriffen werden, wenn es unbedingt nötig ist, siehe untenstehendes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Werden statische Variablen direkt bei der Definition initialisiert, so haben sie diesen Wert bereits beim Start des Programms.&lt;br /&gt;
&lt;br /&gt;
Eine statische Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    static int var = 4&lt;br /&gt;
    var = 3 * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 4&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Statische Variablen können auch außerhalb einer Funktion definiert werden. Da diese Definition semantisch keinen Unterschied zu der Definition einer globalen Variablen macht, werden globale statische Variaben identisch zu globalen Variablen behandelt.&lt;br /&gt;
&lt;br /&gt;
Beim Compilieren erscheint dann eine Warnung:&lt;br /&gt;
&lt;br /&gt;
  warning line 1: keyword &#039;static&#039; takes no effect here.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
static int var = 3&lt;br /&gt;
function void main ()&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Konstante Variablen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Konstante Variablen&amp;quot; sind auf den ersten Blick ein Widerspruch in sich. Wie kann eine Konstante variabel sein?&lt;br /&gt;
&lt;br /&gt;
Die Antwort: Eine konstante Variable wird von der Semantik wie eine normale Variable behandelt. Allerdings kann deren Wert nicht geändert werden. Daher sollte man direkt bei der Definition solche Variablen auch initialisieren. Unterlässt man dies, haben sie halt den Wert 0 bzw. &amp;quot;&amp;quot; (Leerstring) - je nach Typ.&lt;br /&gt;
&lt;br /&gt;
Konstante Variablen sollte man nach Konvention ausschließlich in Großbuchstaben schreiben. Sie ähneln nämlich den Preprozessor-Konstanten in C. Mit der Großschreibung deutet man an: Dies ist eine Konstante!&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der Variablen wird auch nicht erst zur Laufzeit in arithmetischen Ausdrücken ermittelt, sondern bereits während des Compilierens in die entsprechenden Ausdrücke eingesetzt.&lt;br /&gt;
&lt;br /&gt;
const-Variablen müssen vom Typ int oder string sein. byte ist hier nicht erlaubt - was aber keine Einschränkung bedeutet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 4&lt;br /&gt;
    var = MAXLEDS * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 120&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (MAXLEDS)     // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden konstante Variablen mit 0 bzw. mit &amp;quot;&amp;quot; (Leerstring) - je nach Typ - initialisiert.&lt;br /&gt;
&lt;br /&gt;
Der Versuch, einer konstante Variablen später im Programm einen anderen Wert zuzuweisen, wird bereits beim Compilieren mit einer Fehlermeldung quittiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    MAXLEDS = 40&lt;br /&gt;
    console.println (MAXLEDS)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fehlermeldung lautet dann:&lt;br /&gt;
&lt;br /&gt;
  error line 4: variable &#039;MAXLEDS&#039; is of type &#039;const&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
Variablen können auch als Arrays verwendet werden. Dabei wird bei der Definition die Größe des Arrays in eckigen Klammern angegeben. Diese Größe muss entweder durch eine Zahl oder den Inhalt einer &amp;quot;konstanten Integer-Variablen&amp;quot; (const int) angegeben werden. Arrays beginnen immer mit dem Index 0 und enden bei der Arraygröße minus 1. Zugriffe außerhalb dieses Bereichs werden zur Laufzeit abgefangen. In diesem Fall wird eine entsprechende Fehlermeldung auf der Console ausgegeben und das Programm beendet.&lt;br /&gt;
&lt;br /&gt;
Arrays können sowohl global als auch lokal angelegt werden. Auch static Arrays sind möglich. Konstante Arrays gibt es jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int SIZE = 5&lt;br /&gt;
int nummer[7]&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette[SIZE]&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7 - 1&lt;br /&gt;
        nummer[i] = 2 * i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (nummer[5])          // Ausgabe: 10&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to SIZE - 1&lt;br /&gt;
         zeichenkette[i] = &amp;quot;Hello &amp;quot; : i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (zeichenkette[3])    // Ausgabe: &amp;quot;Hello 3&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funktionen =&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Eine Funktion wird definiert durch folgenden Block:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function TYPE FUNCTIONNAME (TYP PARAMETER1, TYP PARAMETER2, ...)&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei kann TYPE &#039;&#039;&#039;int&#039;&#039;&#039;, &#039;&#039;&#039;string&#039;&#039;&#039; oder &#039;&#039;&#039;void&#039;&#039;&#039; sein. FUNCTIONNAME ist einfach der Funktionsname. PARAMETER1 bis PARAMETERn sind die optionalen Funktionsparameter.&lt;br /&gt;
&lt;br /&gt;
Der einfachste Fall ist die main-Funktion, die immer vorhanden sein muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man das oben angegebene Blink-Programm als eigene Funktion einbauen, dann wäre das folgende Programm eine Lösung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink (int factor, int delay)&lt;br /&gt;
    repeat factor&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (delay)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    blink (20, 200)&lt;br /&gt;
    blink (10, 500)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Aufruf von blink() lässt die LED 20 mal schnell den Zustand wechseln (Verzögerungszeit 200 msec), der zweite Aufruf lässt die LED lediglich 10 mal den Zustand wechseln, dafür aber langsamer (Verzögerungszeit 500 msec).&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Klassen ===&lt;br /&gt;
&lt;br /&gt;
Später.&lt;br /&gt;
&lt;br /&gt;
= Typumwandlungen =&lt;br /&gt;
&lt;br /&gt;
=== String to Integer ===&lt;br /&gt;
&lt;br /&gt;
Wird einer Integer-Variablen ein String zugewiesen, wird lediglich deren numerischer Inhalt zu Anfang des Strings als Integer-Wert übernommen. Enthält der String überhaupt keinen numerischen Wert zu Anfang, ist der Integer-Wert des Strings 0.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = &amp;quot;1234abc&amp;quot;&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable Zahl enthält nach der Zuweisung den numerischen Wert 1234.&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt für Funktionen, die einen Integer-Wert als Parameter erwarten, hier jedoch ein String übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integer to String ===&lt;br /&gt;
&lt;br /&gt;
Wird einer String-Variablen ein Integer-Wert zugewiesen, wird dieser automatisch in einen String umgewandelt. Dasselbe gilt für Funktionsparameter, wenn die Funktion einen String als Parameter erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    zeichenkette = 1234&lt;br /&gt;
    console.println (zeichenkette)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso gilt dies für den String-Operator &#039;:&#039;, welcher zwei Strings zu einem String zusammensetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    string meldung&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    meldung = &amp;quot;Das Ergebnis ist &amp;quot; : ergebnis&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dem String-Operator &#039;:&#039; können auch rein numerische Operanden zu einem String zusammengesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string meldung&lt;br /&gt;
    meldung = 123 : 456&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird dann der String &amp;quot;123456&amp;quot; auf der Console ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Kombiniert man beide Typwandlungen (Integer-&amp;gt;String und String-&amp;gt;Integer), kann man den String-Operator auch auf rein numerische Ausdrücke anwenden, wobei die Zuweisungsvariable auch wieder eine Integer-Variable ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 123 : 456&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Zahlen 123 und 456 zunächst in Strings umgewandelt, dann zu einem String zusammengesetzt und bei der Zuweisung wieder zurück in einen Integer-Wert gewandelt. Die Variable &#039;zahl&#039; enthält nach der Zuweisung den Integer-Wert 123456.&lt;br /&gt;
&lt;br /&gt;
= Kontrollstrukturen =&lt;br /&gt;
&lt;br /&gt;
=== Zuweisung ===&lt;br /&gt;
&lt;br /&gt;
Syntax: VARIABLE = AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    int ergebnis&lt;br /&gt;
&lt;br /&gt;
    zeichenkette = &amp;quot;Das Ergebnis lautet: &amp;quot;&lt;br /&gt;
    ergebnis = 1234 * 2&lt;br /&gt;
    console.println (zeichenkette : ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    if BEDINGUNG1&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG2&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG3&lt;br /&gt;
        ...&lt;br /&gt;
    else&lt;br /&gt;
        ...&lt;br /&gt;
    endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
  int zahl&lt;br /&gt;
&lt;br /&gt;
  zahl = 33&lt;br /&gt;
&lt;br /&gt;
if zahl &amp;lt; 10&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 10&amp;quot;)&lt;br /&gt;
elseif zahl &amp;lt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 100&amp;quot;)&lt;br /&gt;
elseif zahl &amp;gt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is groesser 100&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is gleich 100&amp;quot;)&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loop ===&lt;br /&gt;
&lt;br /&gt;
loop beginnt eine Endlosschleife. Diese kann lediglich mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Endlosschleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Abbruch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   break&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Sprung zum Anfang der Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   continue&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm lässt die Board-LED auf einem Nucleo-Board leuchten, bis der User-Button gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== repeat ===&lt;br /&gt;
&lt;br /&gt;
repeat beginnt eine Schleife, welche genau N-mal durchlaufen wird. Die repeat-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
repeat N&lt;br /&gt;
   ...&lt;br /&gt;
endrepeat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N kann dabei ein beliebiger arithmetischer Ausdruck sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    repeat 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Die while-Schleife wird durchlaufen, solange die angegebene Bedingung gegeben ist. Arithmeische Ausdrücke innerhalb der Bedingung werden bei jedem Schleifendurchlauf neu berechnet. Die while-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
while BEDINGUNG&lt;br /&gt;
   ...&lt;br /&gt;
endwhile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    while zahl &amp;lt; 10&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endwhile&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== for ===&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife wird für eine anzugebene Schleifenvariable solange durchlaufen, bis der angegebene Stopwert überschritten wird. Optional kann eine Schrittgröße für die Schleifenvariable angegeben werden. Standardmäßig ist diese 1, d.h. die Schleifenvariable wird mit jedem neuen Durchlauf inkrementiert. Ist der Stopwert kleiner als der Startwert, wird die Schleifenvariable mit jedem Durchlauf dekrementiert.&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
for VARIABLE = STARTWERT to STOPWERT [STEP x]&lt;br /&gt;
   ...&lt;br /&gt;
endfor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VARIABLE muss eine Integer-Variable sein, STARTWERT und STOPWERT ein beliebiger arithmetischer Ausdruck. Im Gegensatz zur while-Schleife, in welcher die Schleifen-Bedingung und damit die arithmetische Ausdrücke jeweils immer neu evaluiert werden, wird bei der for-Schleife STARTWERT und STOPWERT nur einmal berechnet, nämlich unmittelbar vor dem Betreten der Schleife.&lt;br /&gt;
&lt;br /&gt;
Wird kein Step-Wert angegeben, wird die Laufvariable nach jedem Schleifendurchlauf um 1 erhöht. Wird ein abweichender Step-Wert  angegeben, wird die Laufvariable um den angegebenen Wert erhöht. Ist der Step-Wert negativ, wird die Variable um den angegebenen Wert erniedrigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt zunächst die Zahlen 1 bis 9 auf der Console aus. Anschließend werden die Werte von 9 bis 1 rückwärts zählend ausgegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    for zahl = 1 to 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
    for zahl = 9 to 1 step -1&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== switch ===&lt;br /&gt;
&lt;br /&gt;
* switch, break&lt;br /&gt;
&lt;br /&gt;
=== return ===&lt;br /&gt;
&lt;br /&gt;
* return&lt;br /&gt;
&lt;br /&gt;
= Vergleichsoperatoren =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* gleich: =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;not equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* ungleich: !=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;less&#039; ===&lt;br /&gt;
&lt;br /&gt;
* kleiner: &amp;lt;&lt;br /&gt;
* kleiner oder gleich: &amp;lt;=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;greater&#039; ===&lt;br /&gt;
&lt;br /&gt;
* größer: &amp;gt;&lt;br /&gt;
* größer oder gleich: &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
= Operatoren =&lt;br /&gt;
&lt;br /&gt;
=== Grundrechenarten ===&lt;br /&gt;
&lt;br /&gt;
==== Addition ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK + AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 3 + 5&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK - AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 - 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Multiplikation ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK * AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 * 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Division ====&lt;br /&gt;
&lt;br /&gt;
Die Integer-Division behandelt nur den ganzzahligen Anteil der Division. Für den entstandenen Rest einer Division siehe &#039;&#039;&#039;Modulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK / AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 / 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei den Grundrechenarten gilt die Punkt-vor-Strich-Rechnung.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Modulo-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der Modulo-Operator berechnet den Rest einer Integer-Division.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK % AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 % 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der Modulo-Operator bindet (im Gegensatz zu anderen Programmiersprachen!) stärker als die Grundrechenarten.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * 5 % 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist identisch mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * (5 % 3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher ist das Ergebnis hier 2 * 2 = 4.&lt;br /&gt;
&lt;br /&gt;
=== Shift-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;lt;&amp;lt;&#039; verschiebt die Bits einer Zahl nach links.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 2&lt;br /&gt;
    ergebnis = zahl &amp;lt;&amp;lt; 4  // Verschieben der Zahl 2 um 4 Stellen nach links&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 32&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;gt;&amp;gt;&#039; verschiebt die Bits einer Zahl nach rechts.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 32&lt;br /&gt;
    ergebnis = zahl &amp;gt;&amp;gt; 4  // Verschieben der Zahl 32 um 4 Stellen nach rechts&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Shift-Operatoren binden stärker als die Grundrechenarten und der Modulo-Operator.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
3 * 1 &amp;lt;&amp;lt; 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist also 3 * 16 = 48.&lt;br /&gt;
&lt;br /&gt;
Wichtig: Beim Verschieben werden die Ausdrücke immer als unsigned-Werte angesehen, d.h. Vorzeichenbits werden nicht besonders behandelt.&lt;br /&gt;
&lt;br /&gt;
=== Bitmask-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Bitwise OR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK | AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0x0F | 0xF0, HEX, 2)      // Ausdruck ist FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise AND ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;amp; AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF &amp;amp; 0x00F0, HEX, 4)    // Ausdruck ist 00F0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise XOR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK ^ AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF ^ 0x00F0, HEX, 4)    // Ausdruck ist FF0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise Inversion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: ~AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (~0xFF00, HEX, 4)            // Ausdruck ist FFFF00FF&lt;br /&gt;
    console.println (~0xFF00 &amp;amp; 0xFFFF, HEX, 4)   // Ausdruck ist     00FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der And-Operator bindet stärker als der OR-Operator. Die Invertierung wirkt unmittelbar auf den nachfolgenden Ausdruck. Sämtliche Bitmask-Operatoren binden stärker als die vorangegangenen Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Klammern ===&lt;br /&gt;
&lt;br /&gt;
Um die obigen Prioritätenregelungen zu durchbrechen, können in den Ausdrücken Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (3 + 2 * 4)                  // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) * 4)                // Ausdruck ist 5 *  4 = 20&lt;br /&gt;
    console.println (3 + 2 &amp;lt;&amp;lt; 2)                 // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) &amp;lt;&amp;lt; 2)               // Ausdruck ist 5 &amp;lt;&amp;lt; 2 = 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der String-Operator fasst zwei Zeichenketten zu einer Zeichenkette zusammen.&lt;br /&gt;
&lt;br /&gt;
Syntax: STRING1 : STRING2&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str1&lt;br /&gt;
    string str2&lt;br /&gt;
    string str3&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    str2 = &amp;quot;World&amp;quot;&lt;br /&gt;
    str3 = str1 : str2&lt;br /&gt;
    console.println (str3)  // Ausgabe: &amp;quot;Hello, World&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    console.println (str : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder noch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, &amp;quot; : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der String-Operator wandelt numerische Ausdrücke automatisch in Strings.&lt;br /&gt;
&lt;br /&gt;
Somit führt der Programmabschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = (3 * 5) : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zu einem Ausdruck von &amp;quot;15 ist das Ergebnis.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wichtig: &#039;&#039;&#039;Der String-Operator bindet stärker als alle anderen nicht-unären Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlende Klammern in Abschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = 3 * 5 : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
führen also zum Ausdruck von lediglich &amp;quot;15&amp;quot;, da der zwischendurch entstehende Ausdruck &amp;quot;5 ist das Ergebnis&amp;quot; für die Multiplikation in einen Integer gewandelt wird. Übrig bleibt daher lediglich 3 * 5. Das Ergebnis wird wegen der Zuweisung wieder zurück in einen String gewandelt. Übrig bleibt &amp;quot;15&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Bibliotheken =&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek string ===&lt;br /&gt;
&lt;br /&gt;
==== string.length () ====&lt;br /&gt;
&lt;br /&gt;
Die length-Funktion gibt die Länge eines Strings zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int string.length (string str)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Länge des Strings&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int len&lt;br /&gt;
    len = string.length (&amp;quot;abcdef&amp;quot;);            // gibt 6 zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== string.substring () ====&lt;br /&gt;
&lt;br /&gt;
Die substring-Funktion kann beliebige Zeichenketten aus einem String extrahieren. &lt;br /&gt;
&lt;br /&gt;
Syntax: string string.substring (string str, int start [, int length ])&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
* start: Die Startposition innerhalb des Strings&lt;br /&gt;
* length: Die Länge des zu extrahierenden Strings. Der Parameter ist optional.&lt;br /&gt;
&lt;br /&gt;
Die Startposition wird ab 0 gezählt. Ist der Startwert positiv oder 0, wird die Startposition innerhalb des Eingabestrings von links gezählt, anderenfalls von rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string rest&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -1);    // gibt &amp;quot;f&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -2);    // gibt &amp;quot;ef&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, 1); // gibt &amp;quot;d&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und positiv, enthält der zurückgegebene String höchstens length Zeichen ab start (abhängig von der Länge von string).&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und negativ, werden genau so viele Zeichen vom Ende von string abgeschnitten (nachdem die Startposition ermittelt wurde, sollte start negativ sein). Gibt start die Position des abzuschneidenden Teiles oder dahinter an, wird ein leerer String zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 0, -1);  // gibt &amp;quot;abcde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 2, -1);  // gibt &amp;quot;cde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 4, -4);  // gibt &amp;quot;&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, -1); // gibt &amp;quot;de&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aus Basic bekannten Funktionen &#039;left&#039;, &#039;right&#039; und &#039;mid&#039; können alle mit der substring-Funktion abgebildet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function string left (string str, int l)&lt;br /&gt;
    return string.substring (str, 0, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string right (string str, int l)&lt;br /&gt;
    return string.substring (str, -l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string mid (string str, int s, int l)&lt;br /&gt;
    return string.substring (str, s, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string x&lt;br /&gt;
    x = &amp;quot;abcdef&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    console.println (left (x, 3))     // gibt &amp;quot;abc&amp;quot; aus&lt;br /&gt;
    console.println (right (x, 3))    // gibt &amp;quot;def&amp;quot; aus&lt;br /&gt;
    console.println (mid (x, 2, 2))   // gibt &amp;quot;cd&amp;quot; aus&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek time ===&lt;br /&gt;
&lt;br /&gt;
==== time.millis () ====&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von time.millis() entsprecht der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: int time.millis ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.reset () ====&lt;br /&gt;
&lt;br /&gt;
time.reset setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers zurück auf 0.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Reset: &amp;quot; : time)&lt;br /&gt;
    time.reset ()&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Reset: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.set () ====&lt;br /&gt;
&lt;br /&gt;
time.set setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers auf den angegebenen Wert&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset (int millis)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Set: &amp;quot; : time)&lt;br /&gt;
    time.set (1000)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Set: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.delay () ====&lt;br /&gt;
&lt;br /&gt;
time.delay() wartet die angegebene Zeit in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.delay (int msec)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Delay: &amp;quot; : time)&lt;br /&gt;
    time.delay (500)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Delay: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek console ===&lt;br /&gt;
&lt;br /&gt;
==== console.print () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.print (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Wird nur das erste Argument übergeben, wird anhand des Parameter-Typs entschieden, ob ein String oder ein Integer-Wert auf der Console ausgedruckt wird. Man kann aber auch steuern, wie der übergebene Parameter behandelt werden soll. Dabei kann TYPE die folgenden Werte haben:&lt;br /&gt;
&lt;br /&gt;
* STR - Der Parameter wird als String behandelt&lt;br /&gt;
* DEC - Der Parameter wird als Dezimalzahl gedruckt&lt;br /&gt;
* DEC0 - Der Parameter wird als Dezimalzahl gedruckt, jedoch wird das Ausgabefeld mit führenden Nullen aufgefüllt.&lt;br /&gt;
* HEX - Der Parameter wird als Hexadezimalzahl gedruckt&lt;br /&gt;
* BIN - Der Parameter wird als Binärzahl gedruckt&lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren numerischen Parameter WIDTH kann gesteuert werden, wie breit das Ausgabefeld sein soll. Dann wird der ausgegebene Text auf mindestens diese Anzahl von Zeichen tabuliert, das heißt mit Leerzeichen aufgefüllt. Ist WIDTH positiv, werden Leerzeichen von links beginnend eingefügt, ist WIDTH negativ, werden entsprechend viele Leerzeichen rechts angefügt, um auf die gewünschte Breite zu kommen. Eine Besonderheit ist das Drucken von HEX- oder BIN-Zahlen: Bei positivem Wert von WIDTH wird das Feld mit Nullen statt Leerzeichen aufgefüllt. Bei Dezimalzahlen geht dieses über den Typ DEC0.&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Anzahl der gedruckten Zeichen.&lt;br /&gt;
&lt;br /&gt;
Beispiele siehe console.println ().&lt;br /&gt;
&lt;br /&gt;
==== console.println () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.println (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Das Verhalten entspricht exakt der Funktion  console.print(). Jedoch wird noch nach dem Ausdruck ein CRNL-Paar angefügt, um eine neue Zeile zu beginnen.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    i = 4711&lt;br /&gt;
    console.println (i)                        // 4711&lt;br /&gt;
    console.println (i, DEC)                   // 4711&lt;br /&gt;
    console.println (i, HEX)                   // 1267&lt;br /&gt;
    console.println (i, BIN)                   // 1001001100111&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFFFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFFFFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX)              // 7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFF&lt;br /&gt;
    console.println (i, HEX, 8)                // 0000FFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 8)           // 7FFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFF&lt;br /&gt;
    console.println (i, HEX, 2)                // FF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 2)           // 7F&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, BIN, 16)          // 0000000001111111&lt;br /&gt;
&lt;br /&gt;
    console.println (0xAA, BIN, 8)             // 10101010&lt;br /&gt;
    console.println (1, BIN, 32)               // 00000000000000000000000000000001&lt;br /&gt;
&lt;br /&gt;
    console.println (&amp;quot;Hallo, Welt&amp;quot;)            // Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;)         // 42 Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, DEC)    // 42&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, BIN)    // 101010&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek gpio ===&lt;br /&gt;
&lt;br /&gt;
==== gpio.init () ====&lt;br /&gt;
&lt;br /&gt;
Initialisiert General Purpose I/O für einen Pin.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    void gpio.init (PORT, BIT, INPUT [, NOPULL | PULLDOWN | PULLUP ])&lt;br /&gt;
oder&lt;br /&gt;
    void gpio.init (PORT, BIT, OUTPUT [, PUSHPULL | OPENDRAIN ])&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
Für die Datenrichtung muss entweder die Konstante INPUT oder die Konstante OUTPUT vorgegeben werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als INPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NOPULL (Default):&#039;&#039;&#039; Der Eingang wird nicht durch einen internen Pullup oder Pulldown beeinflusst&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als OUTPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUSHPULL (Default):&#039;&#039;&#039; Der Ausgang wird möglichst niederohmig geschaltet.&lt;br /&gt;
* &#039;&#039;&#039;OPENDRAIN:&#039;&#039;&#039; Der Low-Pegel wird möglichst niederohmig geschaltet, der High-Pegel ist hochohmig.&lt;br /&gt;
&lt;br /&gt;
Der letzte Parameter von gpio.init() ist optional. Wird er weggelassen, wird der jeweilige Standardwert (Default) eingestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // C13 als Input, kein Pulldown/Pullup&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT, PULLUP)    // C13 als Input mit Pullup&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.set () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf High-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.set (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.set (GPIOA, 5)                    // Pin auf HIGH&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.reset () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf Low-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.reset (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                  // Pin auf Low&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.toggle () ====&lt;br /&gt;
&lt;br /&gt;
Invertiert den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.toggle (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)             // A5 invertieren&lt;br /&gt;
        time.delay (500)                   // eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.get () ====&lt;br /&gt;
&lt;br /&gt;
Liest den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: int gpio.get (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert ist entweder LOW oder HIGH.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek bit ===&lt;br /&gt;
&lt;br /&gt;
==== bit.set () ====&lt;br /&gt;
&lt;br /&gt;
bit.set() setzt ein Bit.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.set (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.set (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;|&#039; nutzen, um ein Bit zu setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = zahl | (1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== bit.reset () ====&lt;br /&gt;
&lt;br /&gt;
bit.reset() setzt ein Bit zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.reset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = bit.reset (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;&amp;amp;&#039; zusammen mit &#039;~&#039; nutzen, um ein Bit zu zurückzusetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = zahl &amp;amp; ~(1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.toggle () ====&lt;br /&gt;
&lt;br /&gt;
bit.toggle() wechselt den Zustand eines Bits.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.toggle (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00000000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.isset () ====&lt;br /&gt;
&lt;br /&gt;
bit.isset() gibt den Zustand eines Bits zurück&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.isset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: TRUE, wenn das Bit gesetzt ist, sonst FALSE.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int bit&lt;br /&gt;
    bit = bit.isset (0b11111111, 5)&lt;br /&gt;
    if bit = TRUE&lt;br /&gt;
    else&lt;br /&gt;
        console.println (&amp;quot;bit is set&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
        console.println (&amp;quot;bit is not set&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek button ===&lt;br /&gt;
&lt;br /&gt;
==== button.init () ====&lt;br /&gt;
&lt;br /&gt;
Definiert einen GPIO-Pin als Tastereingang. Der Taster wird automatisch vom NIC-Laufzeitsystem per Software entprellt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.init (PORT, BIT, MODE)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Tastereingangs können folgende Alternativen für MODE eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLDOWN:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pulldowns nicht notwendig, Taster ist active high.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLUP:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pullups nicht notwendig, Taster ist active high.&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich, dass bei Einstellung PULLDOWN der Schalter gegen Vcc, bei Einstellung PULLUP der Schalter gegen GND schalten muss. Dasselbe gibt für NOPULLDOWN bzw. NOPULLUP. Hier muss die externe Beschaltung selbst für einen definierten Pegel sorgen, zum Beispiel bei NOPULLUP durch Anschluss eines &#039;&#039;&#039;externen&#039;&#039;&#039; Pullups.&lt;br /&gt;
&lt;br /&gt;
Das NIC-Laufzeitsystem vergibt eine interne Tastennummer größer Null, die bei Abfragen durch button.pressed() dann angegeben werden muss. Bis zu 8 solcher Tasten können mittels button.init() definiert werden. Wenn button.init() eine 0 zurückliefert, sind bereits alle 8 Tasten definiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo hängt der blaue User-Taster an PC13 und schaltet gegen GND. Da hier bereits ein externer Pullup-Widerstand vorgesehen ist, muss &#039;&#039;&#039;kein interner Pullup-Widerstand&#039;&#039;&#039; aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es bis auf den RESET-Taster keinen weiteren Taster auf dem Board. Wir können aber zum Beispiel einen Taster an PA6 anschließen, so dass er gegen GND schaltet. Den externen Pullup sparen wir uns und verwenden dafür den internen Pullup am Pin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)   // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== button.pressed () ====&lt;br /&gt;
&lt;br /&gt;
Abfrage des Tasters.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.pressed (int button)&lt;br /&gt;
&lt;br /&gt;
button ist dabei die Taster-Nummer, die von button.init() zurückgegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
&lt;br /&gt;
    TRUE: Taste ist gedrückt&lt;br /&gt;
    FALSE: Taste wurde nicht gedrückt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Einschalten der Board-LED, sobald die blaue User-Taste gedrückt wird, sonst ausschalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)                 // LED als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                        // Pegel low: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.set (GPIOA, 5)                  // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.reset (GPIOA, 5)                // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es eine blaue LED auf dem Board. Sie ist an PC13 angeschlossen. Allerdings muss diese gegen GND geschaltet werden, damit sie leuchtet. Sie ist also &amp;quot;active low&amp;quot; - im Gegensatz zur Nucleo-LED. Die Set- und Reset-Befehl werden hier daher ausgetauscht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOC, 13, OUTPUT)                // LED als Output&lt;br /&gt;
    gpio.set (GPIOC, 13)                         // Pegel high: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)      // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.reset (GPIOC, 13)               // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.set (GPIOC, 13)                 // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ws2812 ===&lt;br /&gt;
&lt;br /&gt;
==== ws2812.init () ====&lt;br /&gt;
&lt;br /&gt;
Mit ws2812.init() wird die WS2812-LED-Bibliothek initialisiert.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.init (int nleds)&lt;br /&gt;
&lt;br /&gt;
Als Argument ist die maximale Anzahl der verwendeten LEDs in der Kette anzugeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (30)   // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.set () ====&lt;br /&gt;
&lt;br /&gt;
Damit wird die Farbe einer oder aller WS2812-LEDs gesetzt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.set (int led, int red, int green, int blue)&lt;br /&gt;
&lt;br /&gt;
led gibt die Nummer der LED an - beginnend mit 0. Wird als Nummer die Anzahl der verwendeten LEDs angegeben, werden die Farben sämtlicher verwendeter LEDs gesetzt. Die Farben können Werte zwischen 0 (aus) und 255 (volle Helligkeit) haben.&lt;br /&gt;
&lt;br /&gt;
Der Set-Befehl setzt die angebenen Farben erst einmal nur im RAM. Erst mit dem ws2812.refresh()-Befehl werden dann sämtliche gesetzten Farben an die LEDs übertragen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ws2812.set (MAXLEDS, 128, 128, 128)   // Alle LEDs auf weiß, halbe Helligkeit&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to MAXLEDS&lt;br /&gt;
        ws2812.set (i, 0, 128, 128)       // Eine LEDs auf türkis, halbe Helligkeit&lt;br /&gt;
        ws2812.refresh (MAXLEDS)          // Ausgabe&lt;br /&gt;
        delay (200)                       // 0,2 Sekunden warten&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.refresh () ====&lt;br /&gt;
&lt;br /&gt;
ws2812.refresh() überträgt sämtliche zuvor gesetzte Farben an die LEDs.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.refresh (nleds)&lt;br /&gt;
&lt;br /&gt;
Das Argument nleds bestimmt, wieviele der LEDs aktualisiert werden sollen. Der Maximalwert ist derjenige, der bei ws2812.init() angegeben wurde. Dann werden alle LEDs aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
    ws2812.refresh (MAXLEDS)              // Ausgabe: Alle LEDs aktualisieren&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konkreteres Beispiel siehe oben: [[NIC#ws2812.set_.28.29|ws2812.set()]].&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irmp ===&lt;br /&gt;
&lt;br /&gt;
==== irmp.init () ====&lt;br /&gt;
==== irmp.get () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irsnd ===&lt;br /&gt;
&lt;br /&gt;
==== irsnd.init () ====&lt;br /&gt;
==== irsnd.send () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek i2c ===&lt;br /&gt;
&lt;br /&gt;
==== i2c.init () ====&lt;br /&gt;
&lt;br /&gt;
i2c.init () initialisiert die jeweils gewünschte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
  void i2c.init (int channel, int alternate, int clockspeed)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
*  channel: I2C-Channel. Erlaubte Werte: I2C1, I2C2 oder I2C3. Welche Werte davon möglich sind, ist prozessorabhängig.&lt;br /&gt;
*  alternate: Flag, ob die alternative Pinkonfiguration verwendet werden soll, siehe Tabelle.&lt;br /&gt;
*  clockspeed: Taktgeschwindigkeit. Standard ist 100000 (100k), möglich ist aber auch 400000 (400k) für schnelle Peripherie&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Mögliche I2C-Channel&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Channel || ALT || STM32F4x1 Nucleo || STM32F103C8T6&lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  0  || SCL=PB6,  SDA=PB7|| SCL=PB6,  SDA=PB7 &lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  0  || SCL=PB10, SDA=PB3 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  0  || SCL=PA8,  SDA=PB4 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  1  || SCL=PB8,  SDA=PB9 || SCL=PB8,  SDA=PB9&lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  1  ||                   ||                   &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  1  || SCL=PA8,  SDA=PC9 ||                   &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)          // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== i2c.write () ====&lt;br /&gt;
&lt;br /&gt;
i2c.write() schreibt einen Datenpuffer auf die gewählte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.write (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Schreiben des Datums &amp;quot;2017-06-10 16:32:12&amp;quot; in eine DS3231 Real Time Clock:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// write date/time to DS3231&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year = 2017&lt;br /&gt;
int mon  = 6&lt;br /&gt;
int mday = 10&lt;br /&gt;
int hour = 16&lt;br /&gt;
int min  = 32&lt;br /&gt;
int sec  = 12&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert decimal number into BCD format&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int dec2bcd (int i)&lt;br /&gt;
    i = ((i / 10) &amp;lt;&amp;lt; 4) | (i  % 10)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: set date/time to 2017-06-10 16:32:12&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    year = year % 100                                   // 2000 - 2099 -&amp;gt; 00 - 99&lt;br /&gt;
&lt;br /&gt;
    buf[0] = dec2bcd (sec)                              // seconds (0-59)&lt;br /&gt;
    buf[1] = dec2bcd (min)                              // minutes (0-59)&lt;br /&gt;
    buf[2] = dec2bcd (hour)                             // hours (0-24)&lt;br /&gt;
    buf[3] = 0                                          // wday (unknown) (0-6)&lt;br /&gt;
    buf[4] = dec2bcd (mday)                             // day of month (0-31)&lt;br /&gt;
    buf[5] = dec2bcd (mon)                              // month (1-12)&lt;br /&gt;
    buf[6] = dec2bcd (year)                         	// year (00-99)&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, RTC, 0x00, FALSE, buf, 7)    // write to RTC&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag beim Aufruf von i2c.write() auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== i2c.read () ====&lt;br /&gt;
&lt;br /&gt;
i2c.read() liest Daten von der gewählten I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.read (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Lesen von Datum/Uhrzeit aus DS3231 Real Time Clock und Ausgabe auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// read date/time from DS3231 RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year&lt;br /&gt;
int mon&lt;br /&gt;
int mday&lt;br /&gt;
int hour&lt;br /&gt;
int min&lt;br /&gt;
int sec&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert BCD format into decimal number&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int bcd2dec (byte i)&lt;br /&gt;
    i = 10 * ((i &amp;amp; 0xF0) &amp;gt;&amp;gt; 4) + (i &amp;amp; 0x0F)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: get date/time from RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
    int     rtc&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, RTC, 0x00, FALSE, buf, 7)     // read from RTC&lt;br /&gt;
&lt;br /&gt;
    if rtc = TRUE&lt;br /&gt;
        sec  = bcd2dec (buf[0])                     	// seconds (0-59)&lt;br /&gt;
        min  = bcd2dec (buf[1])                     	// minutes (0-59)&lt;br /&gt;
        hour = bcd2dec (buf[2])                     	// hours (0-24)&lt;br /&gt;
        mday = bcd2dec (buf[4])                     	// day of month (0-31)&lt;br /&gt;
        mon  = bcd2dec (buf[5])                     	// month (1-12)&lt;br /&gt;
        year = bcd2dec (buf[6])                     	// year (00-99)&lt;br /&gt;
        year = year + 2000                          	// 00 - 99 -&amp;gt; 2000 - 2099&lt;br /&gt;
&lt;br /&gt;
        console.print (year, DEC0, 4)                   // print YYYY-DD-MM hh:mm:ss&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mon, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mday, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot; &amp;quot;)&lt;br /&gt;
        console.print (hour, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (min, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (sec, DEC0, 2)&lt;br /&gt;
        console.println (&amp;quot;&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiteres Beispiel: Lesen/Schreiben eines EEPROMs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: write some values into EEPROM, read them from EEPROM again&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buffer1[8]&lt;br /&gt;
    byte    buffer2[8]&lt;br /&gt;
    int     rtc&lt;br /&gt;
    int     i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        buffer1[i] = i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, EEPROM, 0x0000, TRUE, buffer1, 8)    // write buffer1 to EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c write error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, EEPROM, 0x0000, TRUE, buffer2, 8)     // read buffer2 from EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c read error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        console.println (buffer2[i])&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da das EEPROM 16-Bit-Startadressen erwartet, wird hier das Flag auf TRUE gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek rtc ===&lt;br /&gt;
&lt;br /&gt;
==== rtc.read () ====&lt;br /&gt;
==== rtc.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek eeprom ===&lt;br /&gt;
&lt;br /&gt;
==== eeprom.read () ====&lt;br /&gt;
==== eeprom.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek onewire ===&lt;br /&gt;
&lt;br /&gt;
==== onewire.init () ====&lt;br /&gt;
==== onewire.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ds1820 ===&lt;br /&gt;
&lt;br /&gt;
==== ds1820.init () ====&lt;br /&gt;
==== ds1820.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek lcd ===&lt;br /&gt;
&lt;br /&gt;
==== lcd.init () ====&lt;br /&gt;
==== lcd.move () ====&lt;br /&gt;
==== lcd.print () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek spi ===&lt;br /&gt;
&lt;br /&gt;
==== spi.init () ====&lt;br /&gt;
==== spi.read () ====&lt;br /&gt;
==== spi.write () ====&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Lauflicht mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird ein Lauflicht mit 30 WS2812-LEDs realisiert. Die erste Variante läuft noch mit der delay-Funktion, welche keinen Spielraum mehr lässt für andere Sachen, die eventuell auch noch abgearbeitet werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante ist da schon wesentlich eleganter. Sie wird nur aktiv, wenn auch Änderungen auf unserem LED-Streifen vonnöten sind.&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante dagegen überlässt dem NIC-Laufzeitsystem die Zeitmessung bis zum nächsten LED-Update, so dass man sich darum nicht mehr kümmern muss. Desweiteren kann man bis zu 8 solcher Alarm-Timer gleichzeitig aktivieren, so dass man hier auch ganz verschiedene Aufgaben mit unterschiedlichen Aktivierungszeiten implementieren kann. Hier wird der Alarm-Timer noch gepollt, d.h. explizit abgefragt.&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird auch dieses noch dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche automatisch aufgerufen werden soll, wenn der Alarm eintrifft.&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Delay ===&lt;br /&gt;
&lt;br /&gt;
Die erste Variante arbeitet mit einem Delay, welches den Prozessor warten lässt. Währenddessen kann man keine anderen Aktionen im Programm ausführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                           // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                       // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                        // Gruen aus&lt;br /&gt;
    int blue    =  0                        // Blau aus&lt;br /&gt;
    int led                                 // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                  // Initialisierung&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        ws2812.set (MAX_LEDS, 0, 0, 0)      // Alle LEDs aus&lt;br /&gt;
        ws2812.set (led, red, green, blue)  // Eine LED leuchten lassen&lt;br /&gt;
        ws2812.refresh (MAX_LEDS)           // Zustand aktualisieren&lt;br /&gt;
        led = led + 1                       // Naechste LED&lt;br /&gt;
        if led &amp;gt;= MAX_LEDS                  // Ende erreicht?&lt;br /&gt;
            led = 0                         // Ja, zurueck zum Anfang&lt;br /&gt;
        endif&lt;br /&gt;
        time.delay (500)                    // Eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Millis-Timer ===&lt;br /&gt;
&lt;br /&gt;
Diese Variante ermittelt mittels time.millis(), wann es aktiv werden soll und kann währenddessen noch andere Aufgaben erledigen. Allerdings wird hier der millis-Timer verwendet, so dass dieser nicht mehr für andere Dinge zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    time.reset ()                                   // Setze &amp;quot;Uhrzeit&amp;quot; zurueck&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if time.millis() &amp;gt; 500                      // Eine halbe Sekunde erreicht?&lt;br /&gt;
            time.reset ()                           // Ja, Zeit wieder zuruecksetzen&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm ===&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante verwendet einen von acht Alarm-Timern. Das ist damit die Luxusversion. Der millis-Timer wird nicht verwendet. Neben diesem können noch sieben weitere Alarm-Timer für andere Aufgaben benutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
    int timer1                                      // alarm-timer&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    timer1 = alarm.set (500)                        // Alarm initialisieren&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if alarm (timer1) = TRUE                    // Alarm gesetzt?&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm als Interrupt ===&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird das Pollen des Alarm-Timers dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche aufgerufen werden soll, wenn der Alarm eintrifft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void lauflicht ()&lt;br /&gt;
    static int red      = 128                       // Rot&lt;br /&gt;
    static int green    = 0                         // Gruen&lt;br /&gt;
    static int blue     = 0                         // Blau&lt;br /&gt;
    static int led                                  // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.set (MAX_LEDS, 0, 0, 0)                  // Alle LEDs aus&lt;br /&gt;
    ws2812.set (led, red, green, blue)              // Eine LED leuchten lassen&lt;br /&gt;
    ws2812.refresh (MAX_LEDS)                       // Zustand aktualisieren&lt;br /&gt;
    led = led + 1                                   // Naechste LED&lt;br /&gt;
    if led &amp;gt;= MAX_LEDS                              // Ende erreicht?&lt;br /&gt;
        led = 0                                     // Ja, zurueck zum Anfang&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    alarm.set (500, function.lauflicht)             // lauflicht() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variablen led, red, green und blue sind nun alle in die Funktion lauflicht() gewandert. Die Definition als static-Variable lassen sie über die ganze Laufzeit des Programms &amp;quot;leben&amp;quot;, d.h. sie verlieren nicht ihren Wert, wenn die Funktion wieder verlassen wird. Alternativ können sie auch einfach als globale Variablen definiert werden. Der Vorteil der static-Definition ist jedoch, dass sie ausschließlich in der Funktion lauflicht() manipuliert werden können.&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Knight Rider mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Equinox-Uhr mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Erstellung eigener NIC-Bibliotheksfunktionen =&lt;br /&gt;
&lt;br /&gt;
= Benchmarks =&lt;br /&gt;
&lt;br /&gt;
=== Sieb des Eratosthenes ===&lt;br /&gt;
&lt;br /&gt;
Es geht um die Ermittlung sämtlicher Primzahlen bis 100.000.&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in NIC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int limit = 100000&lt;br /&gt;
    int zahl&lt;br /&gt;
    int zaehler&lt;br /&gt;
    int primzahl&lt;br /&gt;
    int letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
    for zahl = 2 to limit&lt;br /&gt;
        primzahl = TRUE&lt;br /&gt;
&lt;br /&gt;
        for zaehler = 2 to zahl / 2&lt;br /&gt;
            if zahl % zaehler = 0&lt;br /&gt;
                primzahl = FALSE&lt;br /&gt;
                break&lt;br /&gt;
            endif&lt;br /&gt;
        endfor&lt;br /&gt;
&lt;br /&gt;
        if primzahl = TRUE&lt;br /&gt;
            // console.println (zahl : &amp;quot; ist eine Primzahl&amp;quot;)&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
        endif&lt;br /&gt;
    endfor&lt;br /&gt;
    console.println (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; : letzte_primzahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in PHP:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$limit = 100000;&lt;br /&gt;
&lt;br /&gt;
for ($zahl = 2; $zahl &amp;lt;= $limit; $zahl++)&lt;br /&gt;
{&lt;br /&gt;
    $primzahl = true;&lt;br /&gt;
&lt;br /&gt;
    for ($zaehler = 2; $zaehler &amp;lt;= $zahl / 2; $zaehler++)&lt;br /&gt;
    {&lt;br /&gt;
        if ($zahl % $zaehler == 0)&lt;br /&gt;
        {&lt;br /&gt;
            $primzahl = false;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ($primzahl)&lt;br /&gt;
    {&lt;br /&gt;
        // print (&amp;quot;&amp;quot; . $zahl . &amp;quot; ist eine Primzahl\n&amp;quot;);&lt;br /&gt;
        $letzte_primzahl = $zahl;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; . $letzte_primzahl . &amp;quot;\n&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Python:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    limit = 100000&lt;br /&gt;
&lt;br /&gt;
    for zahl in range (2, limit):&lt;br /&gt;
        primzahl = True&lt;br /&gt;
&lt;br /&gt;
        for zaehler in range (2, zahl / 2):&lt;br /&gt;
            if zahl % zaehler == 0:&lt;br /&gt;
                primzahl = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if primzahl == True:&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
    print &amp;quot;Die hoechste ermittelte Primzahl ist %d&amp;quot; % (letzte_primzahl)&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Lua:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
local limit = 100000&lt;br /&gt;
local zahl&lt;br /&gt;
local zaehler&lt;br /&gt;
local primzahl&lt;br /&gt;
local letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
for zahl = 2, limit do&lt;br /&gt;
    primzahl = true&lt;br /&gt;
&lt;br /&gt;
    for zaehler = 2, zahl / 2 do&lt;br /&gt;
        if zahl % zaehler == 0 then&lt;br /&gt;
            primzahl = false&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if primzahl == true then&lt;br /&gt;
        -- print (zahl, &amp;quot;ist eine Primzahl&amp;quot;)&lt;br /&gt;
        letzte_primzahl = zahl&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot;, letzte_primzahl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Umsetzung in PHP, Python und Lua wurde durch 1:1-Ersetzung jeder Zeile durch die adäquate Formulierung in der jeweiligen Programmiersprache vorgenommen. Die Programme sind damit direkt vergleichbar.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeiten:&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ergebnisse: Sieb des Eratosthenes&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Programmiersprache || Version || i7-2600 CPU @ 3.40GHz || Intel T6500 @ 2.10GHz&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NIC&#039;&#039;&#039; || 0.9 || 5,3 sec || 17,3 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PHP&#039;&#039;&#039; || 5.6.23 || 10,4 sec ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Python&#039;&#039;&#039; || 2.7 || 25,6 sec || 118 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Lua&#039;&#039;&#039; || 5.2 || 6,1 sec ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich nicht, obiges Programm auf dem STM32 mit dem oben verwendeten Startwert 100000 laufen zu lassen. Dabei muss man schon seeeehr lange warten, da der STM32 doch um einiges langsamer ist als ein moderner Intel-Prozessor. Für eigene Messungen auf dem STM32 empfiehlt sich ein Startwert von 10000, also eine Größenordnung geringer.&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Warnungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens foo ist zwar definiert, wird aber nicht aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar definiert, aber nicht verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; set but not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar zwischenzeitlich gesetzt, aber sonst nicht weiter verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;local variable &#039;foo&#039; shadows global variable &#039;foo&#039; defined in line NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die lokale Variable &#039;foo&#039; überdeckt die globale gleichnamige Variable. Dies kann je nach Kontext zu unerwünschten Effekten führen: In der Funktion, wo die lokale Variable definiert wurde, wird dann der Wert dieser lokalen Variablen verwendet, in allen anderen Funktionen jedoch der Wert der globalen Variablen.&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Fehlermeldungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with a value, in function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte void-Funktion liefert unzulässigerweise einen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with no value, in function returning non-void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte Funktion mit Datentyp als Rückgabewert liefert unzulässigerweise keinen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;keyword &#039;foo&#039; unexpected.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &#039;foo&#039; ist an der angegebenen Stelle unerwartet und damit falsch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;break stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Break-Befehl unterbrochen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;continue stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Continue-Befehl am Anfang der Schleife fortgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;double negation not allowed.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine doppelte Negation eines numerischen Wertes ist nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;empty expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der erwartete arithmetische Ausdruck ist leer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;invalid argument type &#039;foo&#039; in function &#039;bar&#039;, argument #NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der angegebene Parameter an NN-ter Stelle hat einen ungültigen Datentyp.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;main must be defined as function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die main-Funktion muss stets vom Datentyp void definiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no main function found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein NIC-Programm muss immer eine main-Funktion als Startpunkt enthalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; returns void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, den Rückgabewert einer Funktion &#039;foo&#039; weiterzuverwenden, obwohl der Datentyp dieser Funktion &#039;void&#039; ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; undefined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die aufgerufene Funktion &#039;foo&#039; ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;unterminated string.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebene Zeichenkette wurde nicht mit dem Anführungszeichen terminiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing &#039;endfoo&#039; at end of file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein geöffneter Kontrollblock wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurden keine Parameter für die Funktion foo angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing closing bracket.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine geöffnete Klammer wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no matching &#039;)&#039; found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu einer geschlossenen Klammer wurde die dazugehörende geöffnete Klammer nicht gefunden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing return before &#039;endfunction&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Return-Statement unmittelbar vor dem Ende der Funktion fehlt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no compare operator found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurde kein Vergleichsoperator im Ausdruck angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;number of arguments wrong for call of function &#039;foo&#039;, expected NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Parameter für den Aufruf der Funktion &#039;foo&#039; ist falsch, richtig ist NN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;syntax error. Use brackets around negative expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein Ausdruck mit einem negativen Operanden (wie z.B. &amp;quot;3 * -2&amp;quot;) bedeutet einen Syntax-Error. In diesem Fall muss der zu negierende Operand geklammert werden, also: &amp;quot;3 * (-2)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu viele Parameter für den Aufruf der Funktion namens &#039;foo&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many closing brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geschlossene Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many open brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geöffnete Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many expressions.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck ist zu komplex.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde vorher nicht definiert.&lt;/div&gt;</summary>
		<author><name>Klause</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96668</id>
		<title>NIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=NIC&amp;diff=96668"/>
		<updated>2017-06-20T13:28:45Z</updated>

		<summary type="html">&lt;p&gt;Klause: /* Compiler nicc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dies ist eine vorläufige und höchst unvollständige Beschreibung einer Software, die noch in Entwicklung, d.h. im Alpha-Stadium ist. Ein entsprechender Thread über NIC wird im Forum &amp;quot;Projekte &amp;amp; Code&amp;quot; eröffnet, sobald eine Beta-Version des NIC-Interpreters verfügbar ist. Details können sich durchaus noch ändern, daher ist diese Dokumentation zur Zeit noch rein als PRELIMINARY zu sehen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NIC ist eine einfache strukturierte Programmiersprache, welche speziell für die Mikrocontroller-Familie STM32 entwickelt wurde. Da der NIC-Interpreter in C geschrieben ist, kann dieser auch auf andere 32-Bit-Mikrocontroller portiert werden. &lt;br /&gt;
&lt;br /&gt;
Ebenso sind NIC-Programme auch unter Linux und Windows lauffähig, wobei dies eher der Entwicklung und des Debuggings des NIC-Interpreters dient. Ein in NIC geschriebenes Programm wird zunächst von dem NIC-Compiler &amp;quot;nicc&amp;quot; auf dem Host in einen Metacode übersetzt, welcher durch den NIC-Interpreter &amp;quot;nici&amp;quot; auf dem Mikrocontroller-System sehr effizient abgearbeitet werden kann. Die üblichen Übersetzungsdauern liegen meist unter einer Sekunde, die Geschwindigkeit, mit der die Befehle dann von nici ausgeführt werden, liegen bei ca. 100.000 bis 250.000 Befehlen pro Sekunde - je nach verwendetem STM32. Als Host zum Compilieren von NIC-Programmen dient zur Zeit ein PC-System mit Linux oder Windows, später wird dies auch ein vorgeschalteter µC wie ein ESP8266 sein, der gleichzeitig ein Filesystem (SPIFFS) bietet, um die Compilate zu speichern und damit permanent vorzuhalten. Zudem erweitert dieser dann das NIC-Laufzeitsystem um Netzwerkfunktionalitäten.&lt;br /&gt;
&lt;br /&gt;
Motivationen zur Entwicklung eines solchen Interpreters gibt es einige: Zum einen wird Einsteigern ein sehr einfaches System geboten, sich in die Welt von 32-Bit-Mikrocontrollern einzuarbeiten, zum anderen schrecken viele Umsteiger von 8-Bit-Systemen auf 32-Bit-Systeme vor der Komplexität der 32-Bitter zurück. Genau diese Komplexität wird in die NIC-Bibliotheksfunktionen verlegt, so dass man sich als NIC-Programmierer nicht damit im Detail befassen muss. Ein erfahrener Programmierer jedoch kann die NIC-Laufzeitbibliothek durch eigene C-Module erweitern, um diese dann im NIC-Programm unter Nutzung der NIC-API zu nutzen. So ist es dann zum Beispiel auf einfache Art und Weise möglich, eine Kette von WS2812-LEDs per DMA zu steuern, ohne sich im Detail mit der Programmierung einer DMA auseinandersetzen zu müssen.&lt;br /&gt;
&lt;br /&gt;
NIC als strukturierte Programmiersprache ähnelt in manchen Teilen C, PHP, Pascal oder auch Basic. Datentypen müssen jedoch zum Beispiel im Gegensatz zu PHP stets angegeben werden. Trotzdem ist stets eine implizite Typumwandlung (zum Beispiel von Integer-Werten in Strings oder umgekehrt) möglich, die klaren Regeln unterworfen ist. Casts wie in C sind dabei nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
Natürlich ist NIC als Interpretersprache nicht so schnell wie ein C-Programm, kann sich aber trotzdem bezüglich Ausführungsgeschwindigkeit durchaus sehen lassen. Ein erfahrener C-Programmierer kann zeitkritische Programmteile in C erstellen, um sie dann als NIC-Bibliotheksfunktionen komfortabel zu nutzen. Der NIC-Interpreter ist ca. doppelt so schnell wie ein adäquates PHP-Programm und meist 3-5 mal schneller als vergleichbare Python-Programme, siehe auch [[NIC#Benchmarks|Benchmarks]].&lt;br /&gt;
&lt;br /&gt;
Wozu einen schnellen ARM erst programmier-freundlich abbremsen wenn man dann gleich einen AVR verwenden kann! Die Einarbeitung in ARM und diese Xte neue Programmier-Sprache ist damit auch gespart!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Compiler nicc =&lt;br /&gt;
&lt;br /&gt;
Der Compiler nicc ist für Windows und Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Windows ===&lt;br /&gt;
    nicc [-v] [-u COMx] datei.nic&lt;br /&gt;
&lt;br /&gt;
Die in eckigen Klammern angegebenen Parameter sind optional.&lt;br /&gt;
&lt;br /&gt;
Optionen:&lt;br /&gt;
    -v : Verbose, gibt Statistiken, wie zum Beispiel Optimierungen von Ausdrücken aus&lt;br /&gt;
    -u COMx: Upload der compilierten Datei über die seriellen Schnittstelle COMx&lt;br /&gt;
&lt;br /&gt;
Der NIC-Quelltext wird dabei in einen optimierten, maschinenunabhängigen Objekt-Code übersetzt. Das Kompilat legt nicc in der Datei datei.nico ab, welche (zur Zeit noch) eine ASCII-Datei ist. Gibt man per Upload-Parameter die serielle Schnittstelle an, wird das Kompilat direkt auf den µC geladen. Der Interpreter legt den Objekt-Code dann als binäre Datenstrukturen im RAM ab, um diese dann effizient abzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
    nicc -u com5 lauflicht1.nic&lt;br /&gt;
&lt;br /&gt;
=== Aufruf unter Linux ===&lt;br /&gt;
    nicc [-v] datei.nic&lt;br /&gt;
&lt;br /&gt;
Hier fehlt (noch) die Upload-Funktion. Dafür ist es aber möglich, das Kompilat direkt unter Linux zu starten, siehe nächstes [[NIC#Interpreter_nici|Kapitel]].&lt;br /&gt;
&lt;br /&gt;
=== Optimierungen ===&lt;br /&gt;
&lt;br /&gt;
Der NIC-Compiler bringt sämtliche arithmetische Ausdrücke wie &amp;quot;3 * 4 + x + 1 &amp;lt;&amp;lt; 6&amp;quot; nach den Prioritätenregeln (Punkt- vor Strichrechnung usw.) in die UPN-Notation - auch Postfix genannt. Dabei werden konstante Teilausdrücke wie &amp;quot;3 * 4&amp;quot; direkt durch das Ergebnis &amp;quot;12&amp;quot; zur Compilezeit ersetzt. Dadurch muss der Interpreter sich nicht mehr um solche Regeln kümmern, sondern braucht nur noch einen Stack abzuarbeiten, auf dem alle Operanden und Operatoren schon fix und fertig in der richtigen Reihenfolge vorliegen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren werden zur Compilezeit sämtliche Sprungadressen, die durch Schleifen wie loop, repeat, for, while, break und continue entstehen, vorher ausgerechnet, so dass der Interpreter je nach Bedingung nur noch Sprungadressen laden muss. Desweiteren sind bei Aufruf von Bibliotheksfunktion (wie zum Beispiel [[NIC#Bibliothek_gpio|GPIO]]) die zu übergebenden Daten direkt zum Bedienen der API für Bibliotheksfunktionen vorbereitet. Diese können damit schnell und effektiv bedient werden.&lt;br /&gt;
&lt;br /&gt;
Häufig vorkommende Konstrukte wie &amp;quot;n = n + 1&amp;quot; werden in spezielle Increment- und Decrement-Befehle gewandelt, die vom NIC-Interpreter ohne Evaluierung des arithmetischen Ausdrucks rechts vom Gleichheitszeichen direkt intern auf den Variableninhalt wirken.&lt;br /&gt;
&lt;br /&gt;
= Interpreter nici =&lt;br /&gt;
&lt;br /&gt;
Der NIC-Interpreter nici wird im Flash des STM32 installiert (HEX-Datei). Dieser wartet dann auf dem UARTx auf das übersetzte NIC-Programm, um es direkt nach dem Upload auszuführen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler:&lt;br /&gt;
&lt;br /&gt;
Man kann den Interpreter unter Linux und Windows direkt von der Kommandozeile aus starten.&lt;br /&gt;
&lt;br /&gt;
Übersetzen:&lt;br /&gt;
    nicc datei.nic&lt;br /&gt;
Ausführen:&lt;br /&gt;
    nici datei.nico&lt;br /&gt;
&lt;br /&gt;
STM32-spezifische Funktionen wie gpio.toggle() laufen dabei auf eine Stub-Funktion geleitet, welche die Laufzeitparameter als Info ausgeben. Alle anderen Funktionen werden jedoch ordnungsgemäß ausgeführt. Trotzdem ist der Interpreter nicc unter Linux bzw. Windows eher zur Weiterentwicklung und Debugging des Compilers und des Interpreters gedacht und nicht dafür, Programme für Linux/Windows in der Programmiersprache NIC zu entwickeln - auch wenn das so möglich wäre.&lt;br /&gt;
&lt;br /&gt;
= main-Funktion =&lt;br /&gt;
&lt;br /&gt;
Jedes NIC-Programm muss eine Funktion namens &amp;quot;main()&amp;quot; definieren. Das ist der Startpunkt eines jeden NIC-Programms. Die Funktion main() liefert stets keinen Rückgabewert zurück und muss daher immer mit dem Funktionstyp &amp;quot;void&amp;quot; angegeben werden. Außerdem erhält sie keine Parameter, daher ist der Inhalt zwischen den Klammern &amp;quot;(&amp;quot; und &amp;quot;)&amp;quot; leer.&lt;br /&gt;
&lt;br /&gt;
Damit ergibt sich als Funktionsrumpf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
Ale Einstiegsprogramm einer Programmiersprache wird oft ein einfaches Hello-World-Programm angegeben, welches die Zeichenkette &amp;quot;Hello, World&amp;quot; ausgibt. Für Mikrocontroller jedoch ist es oft das Blinken einer an den Mikrocontroller angeschlossenen LED.&lt;br /&gt;
&lt;br /&gt;
Das folgende NIC-Programm lässt die LED auf einem Nucleo-Board blinken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.set (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
        gpio.reset (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die LED wird dabei für 500msec ein- und dann für 500msec wieder abgeschaltet. Durch die Kontrollstruktur &amp;quot;loop&amp;quot; läuft das Programm in einer Endlosschleife und kann nur durch Drücken der RESET-Taste gestoppt werden. Hier werden drei interne Bibliotheksfunktionen der Familie &#039;&#039;&#039;[[NIC#Bibliothek_gpio|gpio]]&#039;&#039;&#039; aufgerufen, nämlich [[NIC#gpio.init_.28.29|gpio.init()]], [[NIC#gpio.set_.28.29|gpio.set()]] und [[NIC#gpio.reset_.28.29|gpio.reset()]]. Die erste Funktion [[NIC#gpio.init_.28.29|gpio.init()]] initialisiert den Pin A5 des STM32 als Ausgabe-Pin durch Angabe des Schlüsselwortes &amp;quot;OUTPUT&amp;quot;, die Funktion [[NIC#gpio.set_.28.29|gpio.set()]] setzt dann den Pin auf HIGH-Pegel, die Funktion [[NIC#gpio.reset_.28.29|gpio.reset()]] wieder auf LOW-Pegel. Die Bibliotheksfunktion time.delay() lässt den Mikrocontroller eine bestimmte Anzahl von Millisekunden warten - hier 500msec.&lt;br /&gt;
&lt;br /&gt;
Am Pin A5 ist bei den Nucleo-Boards eine board-interne grüne LED angeschlossen. Diese blinkt dann bei der Ausführung des Programms. Um die board-interne blaue LED eines STM32F103-Mini-Development-Boards anzusprechen, muss der Port GPIOA durch GPIOC ersetzt und die Pinnummer auf 13 geändert werden, denn hier ist die LED an Pin C13 angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Durch Anwendung der Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] kann der Code noch vereinfacht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (500)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wechselt die Funktion [[NIC#gpio.toggle_.28.29|gpio.toggle()]] automatisch den jeweiligen LOW- bzw. HIGH-Pegel und lässt die LED mit einer Frequenz von einem Hertz blinken.&lt;br /&gt;
&lt;br /&gt;
Wie wir später noch sehen werden, kann das Blinken der LED auch timergesteuert ausgeführt werden. Dann macht der NIC-Interpreter das &amp;quot;nebenbei&amp;quot;, d.h. wir haben in der Hauptschleife Zeit für andere Dinge.&lt;br /&gt;
&lt;br /&gt;
Hier schon mal das Programm, erklärt wird es dann später unten (alarm-Funktionen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink ()&lt;br /&gt;
    gpio.toggle (GPIOA, 5)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    alarm.set (500, function.blink)                 // blink() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie schnell ist nun der NIC-Interpreter? Wir können nun durch Entfernen des delay-Aufrufs die LED mit maximaler Geschwindigkeit blinken lassen und dann die Zeiten messen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103-Mini-Board: LED=C13&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Endlosschleife &#039;&#039;&#039;[[NIC#loop|loop]]&#039;&#039;&#039; wurde hier durch ein &#039;&#039;&#039;[[NIC#repeat|repeat]]&#039;&#039;&#039; ersetzt. Hier können wir angeben, wie oft eine Schleife durchlaufen wird. In unserem Beispiel sind es 1.000.000 mal. Das Blinken selbst wird man aufgrund der Geschwindigkeit nicht mehr erkennen können, jedoch leuchtet die LED weiterhin deutlich sichtbar - bis das Programm nach einer Million Schleifendurchläufen beendet wird. Man wird dabei mit der Stoppuhr auf einem STM32F411RE-Nucleo-Board ungefähr 4 Sekunden messen.&lt;br /&gt;
&lt;br /&gt;
Der Messvorgang geht aber auch genauer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
    int diff&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    diff = stop - start&lt;br /&gt;
    console.println (diff)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden nun erstmals Variablen namens &amp;quot;start&amp;quot; und &amp;quot;stop&amp;quot; verwendet. Sie entsprechen der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden. Durch die Funktion [[NIC#time.millis_.28.29|time.millis()]] können wir jederzeit die interne Zeit des Mikrocontrollers abrufen und in einer Variablen speichern. Deshalb wird jemals einmal vor und nach dem Schleifendurchlauf die Zeit gestoppt. Die Differenz wird in der Variablen &amp;quot;diff&amp;quot; gespeichert und dann mittels der Funktion [[NIC#console.println_.28.29|console.println()]] in Millisekunden auf der Console ausgegeben. Die Console ist dabei die serielle UART-Schnittstelle, die bei jedem Nucleo on-board dabei ist. Bei einem STM32F103-Mini-Development-Board muss ein zusätzlicher UART-Adapter angeschlossen werden, siehe entsprechendes Kapitel weiter unten. Bei einem mit 100MHz getakteten STM32F411RE sind dies ca. 3900msec. Das Programm schafft also ungefähr 255.000 Schleifendurchläufe pro Sekunde. Bei einem mit 85MHz getakteten STM32F401RE sind es noch knapp 200.000 Schleifendurchläufe, beim STM32F103 mit 72MHz-Takt ca. 180.000 Durchläufe.&lt;br /&gt;
&lt;br /&gt;
Das Programm kann aber noch stärker vereinfacht werden. Zunächst eliminieren wir die Variable &amp;quot;diff&amp;quot;, indem wir die Differenz der Werte &amp;quot;stop&amp;quot; und &amp;quot;start&amp;quot; direkt der Funktion [[NIC#console.println_.28.29|console.println()]] übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
    int stop&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    stop = time.millis ()&lt;br /&gt;
    console.println (stop - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also: Funktionen können nicht nur einfache Werte, sondern auch algebraische Ausdrücke direkt übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Aber es geht noch einfacher. Jetzt verzichten wir auch noch auf die Variable &amp;quot;stop&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int start&lt;br /&gt;
&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
    start = time.millis ()&lt;br /&gt;
&lt;br /&gt;
    repeat 1000000&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
    endrepeat&lt;br /&gt;
&lt;br /&gt;
    console.println (time.millis () - start)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Funktionsparameter können also auch Rückgabewerte anderer Funktionen oder noch komplexere Ausdrücke angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber noch das Hello-World-Programm im klassischen Sinne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, World!&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das sieht jetzt - nachdem wir bereits eine LED auf mehrere Art und Weise haben blinken lassen - doch viel zu einfach aus ;-)&lt;br /&gt;
&lt;br /&gt;
= Kommentare =&lt;br /&gt;
&lt;br /&gt;
Kommentare werden durch einen doppelten Schrägstrich eingeleitet, also durch &#039;//&#039;. Alle danach aufgeführten Zeichen gelten als Kommentar und werden vom NIC-Compiler nicc ignoriert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // Nucleo STM32F4xx: LED=A5, STM32F103 Mini-Dev-Board: LED=C13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Datentypen =&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Funktionen und Variablen müssen stets angegeben werden. Eine implizite Definition durch einfache Aufführung eines einer Funktion, eines Funktionsparameters oder einer Variablen wie in PHP oder Python ist nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Die Datentypen von Variablen und Funktionen sind Integer, Byte oder String, evtl. später auch noch &amp;quot;Float&amp;quot;. Bei Funktionen ist zusätzlich der Datentyp &amp;quot;void&amp;quot; möglich, um anzugeben, dass die Funktion &#039;&#039;&#039;keinen&#039;&#039;&#039; Funktionswert zurückliefert.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;int&#039;&#039;&#039; - Datentyp Integer, Breite 32 Bit, vorzeichenbehaftet&lt;br /&gt;
* &#039;&#039;&#039;byte&#039;&#039;&#039; - Datentyp Byte, Breite 8 Bit, vorzeichenlos&lt;br /&gt;
* &#039;&#039;&#039;string&#039;&#039;&#039; - Datentyp Zeichenkette&lt;br /&gt;
* &#039;&#039;&#039;void&#039;&#039;&#039; - kein Returnwert (nur Funktionen)&lt;br /&gt;
&lt;br /&gt;
Funktionen können als Rückgabewerte nicht nur die oben aufgeführten Typen zurückliefern, sondern auch vom Typ &#039;&#039;&#039;void&#039;&#039;&#039; sein, um anzuzeigen, dass sie &#039;&#039;&#039;keinen&#039;&#039;&#039; Rückgabewert liefern.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void errormessage (string message)&lt;br /&gt;
    console.println (&amp;quot;error: &amp;quot; : message)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei allen anderen Datentypen muss eine Funktion einen Wert per return-Befehl zurückgeben.&lt;br /&gt;
&lt;br /&gt;
= Konstanten =&lt;br /&gt;
&lt;br /&gt;
=== Integer-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
Integer-Konstanten sind einfache Zahlenfolgen wie 1234 oder -1234. Ohne entsprechendes Prefix sind dies Dezimalzahlen. Möchte man einen numerischen Wert in hexadezimal angeben, ist 0x voranzustellen, also zum Beispiel 0x1234. Zahlen können auch im Binärsystem angegeben werden. In diesem Fall ist 0b voranzustellen, z.B. 0b10011100.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* 1234 ist eine Dezimalzahl&lt;br /&gt;
* 0x23AF ist eine Hexadezimalzahl&lt;br /&gt;
* 0b01010101 ist eine Binärzahl&lt;br /&gt;
&lt;br /&gt;
=== String-Konstanten ===&lt;br /&gt;
&lt;br /&gt;
String-Konstanten werden in Anführungszeichen angegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Das ist eine String-Konstante&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Variablen =&lt;br /&gt;
&lt;br /&gt;
Variablen werden definiert durch die Angabe des Datentyps und des Namens.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int nummer&lt;br /&gt;
    byte data&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt lediglich drei verschiedene Datentypen: &#039;&#039;&#039;int&#039;&#039;&#039; oder  &#039;&#039;&#039;byte&#039;&#039;&#039; oder &#039;&#039;&#039;string&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Der Datentyp int definiert einen 32-Bit-Integer, ist also vorzeichenbehaftet. Der Datentyp byte entspricht dem Byte, kennt also keinerlei Vorzeichen und ist 8 Bit breit. Der Typ string ist eine Zeichenkette.&lt;br /&gt;
&lt;br /&gt;
=== Globale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable außerhalb von Funktionen definiert, ist sie eine globale Variable. Auf globale Variablen kann funktionsübergreifend zugegriffen werden - und zwar ab der Zeile, wo sie definiert wird. Eine globale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang des Quelltextes geschehen, jedoch spätestens dann, wenn auch auf sie zugegegriffen werden soll.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    maxleds = 30&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Globale Variablen können auch direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int maxleds = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 30&lt;br /&gt;
    maxleds = 40&lt;br /&gt;
    console.println (maxleds)   // Ausgabe: 40&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lokale Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion definiert, dann gilt sie nur innerhalb dieser Funktion. Bei jedem Funktionsaufruf werden die lokalen Variablen neu erzeugt und (im Gegensatz z.B. zu C) neu mit 0 (für int) bzw. Leerstring &amp;quot;&amp;quot; (für string) initialisiert. Ruft die Funktion sich selbst rekursiv auf, wird jedesmal ein neuer lokaler Variablensatz erzeugt. Lokale Variablen werden nach dem Verlassen der jeweiligen Funktion wieder zerstört und sind dann nicht mehr verfügbar.&lt;br /&gt;
&lt;br /&gt;
Eine lokale Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens aber unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var&lt;br /&gt;
    var = 3 * 2&lt;br /&gt;
    console.println (var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch lokale Variablen können direkt bei der Definition initialisiert werden. Dies muss dann - je nach Typ - eine numerische Konstante oder eine Stringkonstante sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 3&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind zur Zeit nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Statische Variablen ===&lt;br /&gt;
&lt;br /&gt;
Wird eine Variable innerhalb einer Funktion statisch definiert, dann gilt für sie erst einmal dasselbe wie für lokale Variablen. Der einzige Unterschied: Sie wird nur einmal beim Start des Programms erzeugt und beim Verlassen der Funktion auch nicht zerstört. Das heisst: Die Variable (und deren Inhalt) &amp;quot;lebt&amp;quot; während der ganzen Laufzeit des Programms. Außerhalb der Funktion, wo sie definiert wird, kann auf sie mit dem Namen &amp;quot;function.variable&amp;quot; zugegriffen werden, wenn es unbedingt nötig ist, siehe untenstehendes Beispiel.&lt;br /&gt;
&lt;br /&gt;
Werden statische Variablen direkt bei der Definition initialisiert, so haben sie diesen Wert bereits beim Start des Programms.&lt;br /&gt;
&lt;br /&gt;
Eine statische Variable kann jederzeit definiert werden, d.h. die Definition muss keinesfalls am Anfang einer Funktion stehen. Jedoch kann sie überall innerhalb der Funktion verwendet werden - frühestens unterhalb der erfolgen Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void foo ()&lt;br /&gt;
    static int var = 4&lt;br /&gt;
    var = 3 * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 4&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (foo.var)     // Ausgabe: 12&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Statische Variablen können auch außerhalb einer Funktion definiert werden. Da diese Definition semantisch keinen Unterschied zu der Definition einer globalen Variablen macht, werden globale statische Variaben identisch zu globalen Variablen behandelt.&lt;br /&gt;
&lt;br /&gt;
Beim Compilieren erscheint dann eine Warnung:&lt;br /&gt;
&lt;br /&gt;
  warning line 1: keyword &#039;static&#039; takes no effect here.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
static int var = 3&lt;br /&gt;
function void main ()&lt;br /&gt;
    string message = &amp;quot;Die Variable hat den Inhalt &amp;quot;&lt;br /&gt;
    console.println (message : var)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden Integer-Variablen mit 0, String-Variablen mit &amp;quot;&amp;quot; (Leerstring) initialisiert.&lt;br /&gt;
&lt;br /&gt;
=== Konstante Variablen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Konstante Variablen&amp;quot; sind auf den ersten Blick ein Widerspruch in sich. Wie kann eine Konstante variabel sein?&lt;br /&gt;
&lt;br /&gt;
Die Antwort: Eine konstante Variable wird von der Semantik wie eine normale Variable behandelt. Allerdings kann deren Wert nicht geändert werden. Daher sollte man direkt bei der Definition solche Variablen auch initialisieren. Unterlässt man dies, haben sie halt den Wert 0 bzw. &amp;quot;&amp;quot; (Leerstring) - je nach Typ.&lt;br /&gt;
&lt;br /&gt;
Konstante Variablen sollte man nach Konvention ausschließlich in Großbuchstaben schreiben. Sie ähneln nämlich den Preprozessor-Konstanten in C. Mit der Großschreibung deutet man an: Dies ist eine Konstante!&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der Variablen wird auch nicht erst zur Laufzeit in arithmetischen Ausdrücken ermittelt, sondern bereits während des Compilierens in die entsprechenden Ausdrücke eingesetzt.&lt;br /&gt;
&lt;br /&gt;
const-Variablen müssen vom Typ int oder string sein. byte ist hier nicht erlaubt - was aber keine Einschränkung bedeutet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void foo ()&lt;br /&gt;
    int var = 4&lt;br /&gt;
    var = MAXLEDS * var&lt;br /&gt;
    console.println (var)         // Ausgabe: 120&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    foo ()&lt;br /&gt;
    console.println (MAXLEDS)     // Ausgabe: 30&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arithmetische Ausdrücke sind ebenso wie bei den nicht-statischen Variaben nicht erlaubt, die Initialisierungen müssen mit Konstanten vorgenommen werden. Wird die Initialisierung weggelassen, werden konstante Variablen mit 0 bzw. mit &amp;quot;&amp;quot; (Leerstring) - je nach Typ - initialisiert.&lt;br /&gt;
&lt;br /&gt;
Der Versuch, einer konstante Variablen später im Programm einen anderen Wert zuzuweisen, wird bereits beim Compilieren mit einer Fehlermeldung quittiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30            // 30 LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    MAXLEDS = 40&lt;br /&gt;
    console.println (MAXLEDS)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fehlermeldung lautet dann:&lt;br /&gt;
&lt;br /&gt;
  error line 4: variable &#039;MAXLEDS&#039; is of type &#039;const&#039;.&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
Variablen können auch als Arrays verwendet werden. Dabei wird bei der Definition die Größe des Arrays in eckigen Klammern angegeben. Diese Größe muss entweder durch eine Zahl oder den Inhalt einer &amp;quot;konstanten Integer-Variablen&amp;quot; (const int) angegeben werden. Arrays beginnen immer mit dem Index 0 und enden bei der Arraygröße minus 1. Zugriffe außerhalb dieses Bereichs werden zur Laufzeit abgefangen. In diesem Fall wird eine entsprechende Fehlermeldung auf der Console ausgegeben und das Programm beendet.&lt;br /&gt;
&lt;br /&gt;
Arrays können sowohl global als auch lokal angelegt werden. Auch static Arrays sind möglich. Konstante Arrays gibt es jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int SIZE = 5&lt;br /&gt;
int nummer[7]&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette[SIZE]&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7 - 1&lt;br /&gt;
        nummer[i] = 2 * i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (nummer[5])          // Ausgabe: 10&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to SIZE - 1&lt;br /&gt;
         zeichenkette[i] = &amp;quot;Hello &amp;quot; : i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    console.println (zeichenkette[3])    // Ausgabe: &amp;quot;Hello 3&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funktionen =&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Eine Funktion wird definiert durch folgenden Block:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function TYPE FUNCTIONNAME (TYP PARAMETER1, TYP PARAMETER2, ...)&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei kann TYPE &#039;&#039;&#039;int&#039;&#039;&#039;, &#039;&#039;&#039;string&#039;&#039;&#039; oder &#039;&#039;&#039;void&#039;&#039;&#039; sein. FUNCTIONNAME ist einfach der Funktionsname. PARAMETER1 bis PARAMETERn sind die optionalen Funktionsparameter.&lt;br /&gt;
&lt;br /&gt;
Der einfachste Fall ist die main-Funktion, die immer vorhanden sein muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
   ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man das oben angegebene Blink-Programm als eigene Funktion einbauen, dann wäre das folgende Programm eine Lösung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void blink (int factor, int delay)&lt;br /&gt;
    repeat factor&lt;br /&gt;
        gpio.toggle (GPIOA, 5)&lt;br /&gt;
        time.delay (delay)&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)&lt;br /&gt;
    blink (20, 200)&lt;br /&gt;
    blink (10, 500)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Aufruf von blink() lässt die LED 20 mal schnell den Zustand wechseln (Verzögerungszeit 200 msec), der zweite Aufruf lässt die LED lediglich 10 mal den Zustand wechseln, dafür aber langsamer (Verzögerungszeit 500 msec).&lt;br /&gt;
&lt;br /&gt;
=== Eigene NIC-Klassen ===&lt;br /&gt;
&lt;br /&gt;
Später.&lt;br /&gt;
&lt;br /&gt;
= Typumwandlungen =&lt;br /&gt;
&lt;br /&gt;
=== String to Integer ===&lt;br /&gt;
&lt;br /&gt;
Wird einer Integer-Variablen ein String zugewiesen, wird lediglich deren numerischer Inhalt zu Anfang des Strings als Integer-Wert übernommen. Enthält der String überhaupt keinen numerischen Wert zu Anfang, ist der Integer-Wert des Strings 0.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = &amp;quot;1234abc&amp;quot;&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable Zahl enthält nach der Zuweisung den numerischen Wert 1234.&lt;br /&gt;
&lt;br /&gt;
Dasselbe gilt für Funktionen, die einen Integer-Wert als Parameter erwarten, hier jedoch ein String übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integer to String ===&lt;br /&gt;
&lt;br /&gt;
Wird einer String-Variablen ein Integer-Wert zugewiesen, wird dieser automatisch in einen String umgewandelt. Dasselbe gilt für Funktionsparameter, wenn die Funktion einen String als Parameter erwartet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    zeichenkette = 1234&lt;br /&gt;
    console.println (zeichenkette)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso gilt dies für den String-Operator &#039;:&#039;, welcher zwei Strings zu einem String zusammensetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function int mult (int a, int b)&lt;br /&gt;
    return a * b&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    string meldung&lt;br /&gt;
    ergebnis = mult (&amp;quot;2&amp;quot;, 3)&lt;br /&gt;
    meldung = &amp;quot;Das Ergebnis ist &amp;quot; : ergebnis&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dem String-Operator &#039;:&#039; können auch rein numerische Operanden zu einem String zusammengesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string meldung&lt;br /&gt;
    meldung = 123 : 456&lt;br /&gt;
    console.println (meldung)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird dann der String &amp;quot;123456&amp;quot; auf der Console ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Kombiniert man beide Typwandlungen (Integer-&amp;gt;String und String-&amp;gt;Integer), kann man den String-Operator auch auf rein numerische Ausdrücke anwenden, wobei die Zuweisungsvariable auch wieder eine Integer-Variable ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 123 : 456&lt;br /&gt;
    console.println (zahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Zahlen 123 und 456 zunächst in Strings umgewandelt, dann zu einem String zusammengesetzt und bei der Zuweisung wieder zurück in einen Integer-Wert gewandelt. Die Variable &#039;zahl&#039; enthält nach der Zuweisung den Integer-Wert 123456.&lt;br /&gt;
&lt;br /&gt;
= Kontrollstrukturen =&lt;br /&gt;
&lt;br /&gt;
=== Zuweisung ===&lt;br /&gt;
&lt;br /&gt;
Syntax: VARIABLE = AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string zeichenkette&lt;br /&gt;
    int ergebnis&lt;br /&gt;
&lt;br /&gt;
    zeichenkette = &amp;quot;Das Ergebnis lautet: &amp;quot;&lt;br /&gt;
    ergebnis = 1234 * 2&lt;br /&gt;
    console.println (zeichenkette : ergebnis)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== if ===&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    if BEDINGUNG1&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG2&lt;br /&gt;
        ...&lt;br /&gt;
    elseif BEDINGUNG3&lt;br /&gt;
        ...&lt;br /&gt;
    else&lt;br /&gt;
        ...&lt;br /&gt;
    endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
  int zahl&lt;br /&gt;
&lt;br /&gt;
  zahl = 33&lt;br /&gt;
&lt;br /&gt;
if zahl &amp;lt; 10&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 10&amp;quot;)&lt;br /&gt;
elseif zahl &amp;lt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is kleiner 100&amp;quot;)&lt;br /&gt;
elseif zahl &amp;gt; 100&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is groesser 100&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    console.println (&amp;quot;Die Zahl is gleich 100&amp;quot;)&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== loop ===&lt;br /&gt;
&lt;br /&gt;
loop beginnt eine Endlosschleife. Diese kann lediglich mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Endlosschleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Abbruch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   break&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorzeitiger Sprung zum Anfang der Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
loop&lt;br /&gt;
   ...&lt;br /&gt;
   continue&lt;br /&gt;
   ...&lt;br /&gt;
endloop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm lässt die Board-LED auf einem Nucleo-Board leuchten, bis der User-Button gedrückt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== repeat ===&lt;br /&gt;
&lt;br /&gt;
repeat beginnt eine Schleife, welche genau N-mal durchlaufen wird. Die repeat-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
repeat N&lt;br /&gt;
   ...&lt;br /&gt;
endrepeat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N kann dabei ein beliebiger arithmetischer Ausdruck sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    repeat 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endrepeat&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Die while-Schleife wird durchlaufen, solange die angegebene Bedingung gegeben ist. Arithmeische Ausdrücke innerhalb der Bedingung werden bei jedem Schleifendurchlauf neu berechnet. Die while-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
while BEDINGUNG&lt;br /&gt;
   ...&lt;br /&gt;
endwhile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt die Zahlen 1 bis 9 auf der Console aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 1&lt;br /&gt;
    while zahl &amp;lt; 10&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
        zahl = zahl + 1&lt;br /&gt;
    endwhile&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== for ===&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife wird für eine anzugebene Schleifenvariable solange durchlaufen, bis der angegebene Stopwert überschritten wird. Optional kann eine Schrittgröße für die Schleifenvariable angegeben werden. Standardmäßig ist diese 1, d.h. die Schleifenvariable wird mit jedem neuen Durchlauf inkrementiert. Ist der Stopwert kleiner als der Startwert, wird die Schleifenvariable mit jedem Durchlauf dekrementiert.&lt;br /&gt;
&lt;br /&gt;
Die for-Schleife kann vorzeitig mit dem Befehl &#039;break&#039; abgebrochen werden. Der Befehl &#039;continue&#039; innerhalb der Schleife führt zu einem vorzeitigem Sprung zum Anfang der Schleife.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
for VARIABLE = STARTWERT to STOPWERT [STEP x]&lt;br /&gt;
   ...&lt;br /&gt;
endfor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VARIABLE muss eine Integer-Variable sein, STARTWERT und STOPWERT ein beliebiger arithmetischer Ausdruck. Im Gegensatz zur while-Schleife, in welcher die Schleifen-Bedingung und damit die arithmetische Ausdrücke jeweils immer neu evaluiert werden, wird bei der for-Schleife STARTWERT und STOPWERT nur einmal berechnet, nämlich unmittelbar vor dem Betreten der Schleife.&lt;br /&gt;
&lt;br /&gt;
Wird kein Step-Wert angegeben, wird die Laufvariable nach jedem Schleifendurchlauf um 1 erhöht. Wird ein abweichender Step-Wert  angegeben, wird die Laufvariable um den angegebenen Wert erhöht. Ist der Step-Wert negativ, wird die Variable um den angegebenen Wert erniedrigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt zunächst die Zahlen 1 bis 9 auf der Console aus. Anschließend werden die Werte von 9 bis 1 rückwärts zählend ausgegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    for zahl = 1 to 9&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
    for zahl = 9 to 1 step -1&lt;br /&gt;
        console.println (zahl)&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== switch ===&lt;br /&gt;
&lt;br /&gt;
* switch, break&lt;br /&gt;
&lt;br /&gt;
=== return ===&lt;br /&gt;
&lt;br /&gt;
* return&lt;br /&gt;
&lt;br /&gt;
= Vergleichsoperatoren =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* gleich: =&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;not equal&#039; ===&lt;br /&gt;
&lt;br /&gt;
* ungleich: !=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;less&#039; ===&lt;br /&gt;
&lt;br /&gt;
* kleiner: &amp;lt;&lt;br /&gt;
* kleiner oder gleich: &amp;lt;=&lt;br /&gt;
&lt;br /&gt;
=== Vergleichsoperator &#039;greater&#039; ===&lt;br /&gt;
&lt;br /&gt;
* größer: &amp;gt;&lt;br /&gt;
* größer oder gleich: &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
= Operatoren =&lt;br /&gt;
&lt;br /&gt;
=== Grundrechenarten ===&lt;br /&gt;
&lt;br /&gt;
==== Addition ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK + AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 3 + 5&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Subtraktion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK - AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 - 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Multiplikation ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK * AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 * 3&lt;br /&gt;
    console.println (ergebnis)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Division ====&lt;br /&gt;
&lt;br /&gt;
Die Integer-Division behandelt nur den ganzzahligen Anteil der Division. Für den entstandenen Rest einer Division siehe &#039;&#039;&#039;Modulo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK / AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 / 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei den Grundrechenarten gilt die Punkt-vor-Strich-Rechnung.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Modulo-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der Modulo-Operator berechnet den Rest einer Integer-Division.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK % AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    ergebnis = 5 % 3&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der Modulo-Operator bindet (im Gegensatz zu anderen Programmiersprachen!) stärker als die Grundrechenarten.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * 5 % 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist identisch mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    ergebnis = 2 * (5 % 3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher ist das Ergebnis hier 2 * 2 = 4.&lt;br /&gt;
&lt;br /&gt;
=== Shift-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;lt;&amp;lt;&#039; verschiebt die Bits einer Zahl nach links.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 2&lt;br /&gt;
    ergebnis = zahl &amp;lt;&amp;lt; 4  // Verschieben der Zahl 2 um 4 Stellen nach links&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 32&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Shift Left ====&lt;br /&gt;
&lt;br /&gt;
Der Shift-Operator &#039;&amp;gt;&amp;gt;&#039; verschiebt die Bits einer Zahl nach rechts.&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;lt;&amp;lt; ANZAHL_BITS&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int zahl&lt;br /&gt;
    int ergebnis&lt;br /&gt;
    zahl = 32&lt;br /&gt;
    ergebnis = zahl &amp;gt;&amp;gt; 4  // Verschieben der Zahl 32 um 4 Stellen nach rechts&lt;br /&gt;
    console.println (ergebnis)    // Ausdruck ist 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Shift-Operatoren binden stärker als die Grundrechenarten und der Modulo-Operator.&#039;&#039;&#039; Das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
3 * 1 &amp;lt;&amp;lt; 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist also 3 * 16 = 48.&lt;br /&gt;
&lt;br /&gt;
Wichtig: Beim Verschieben werden die Ausdrücke immer als unsigned-Werte angesehen, d.h. Vorzeichenbits werden nicht besonders behandelt.&lt;br /&gt;
&lt;br /&gt;
=== Bitmask-Operatoren ===&lt;br /&gt;
&lt;br /&gt;
==== Bitwise OR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK | AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0x0F | 0xF0, HEX, 2)      // Ausdruck ist FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise AND ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK &amp;amp; AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF &amp;amp; 0x00F0, HEX, 4)    // Ausdruck ist 00F0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise XOR ====&lt;br /&gt;
&lt;br /&gt;
Syntax: AUSDRUCK ^ AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (0xFFFF ^ 0x00F0, HEX, 4)    // Ausdruck ist FF0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bitwise Inversion ====&lt;br /&gt;
&lt;br /&gt;
Syntax: ~AUSDRUCK&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (~0xFF00, HEX, 4)            // Ausdruck ist FFFF00FF&lt;br /&gt;
    console.println (~0xFF00 &amp;amp; 0xFFFF, HEX, 4)   // Ausdruck ist     00FF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der And-Operator bindet stärker als der OR-Operator. Die Invertierung wirkt unmittelbar auf den nachfolgenden Ausdruck. Sämtliche Bitmask-Operatoren binden stärker als die vorangegangenen Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Klammern ===&lt;br /&gt;
&lt;br /&gt;
Um die obigen Prioritätenregelungen zu durchbrechen, können in den Ausdrücken Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    console.println (3 + 2 * 4)                  // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) * 4)                // Ausdruck ist 5 *  4 = 20&lt;br /&gt;
    console.println (3 + 2 &amp;lt;&amp;lt; 2)                 // Ausdruck ist 3 +  8 = 11&lt;br /&gt;
    console.println ((3 + 2) &amp;lt;&amp;lt; 2)               // Ausdruck ist 5 &amp;lt;&amp;lt; 2 = 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String-Operator ===&lt;br /&gt;
&lt;br /&gt;
Der String-Operator fasst zwei Zeichenketten zu einer Zeichenkette zusammen.&lt;br /&gt;
&lt;br /&gt;
Syntax: STRING1 : STRING2&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str1&lt;br /&gt;
    string str2&lt;br /&gt;
    string str3&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    str2 = &amp;quot;World&amp;quot;&lt;br /&gt;
    str3 = str1 : str2&lt;br /&gt;
    console.println (str3)  // Ausgabe: &amp;quot;Hello, World&amp;quot;&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    string str&lt;br /&gt;
    str1 = &amp;quot;Hello, &amp;quot;&lt;br /&gt;
    console.println (str : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder noch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    console.println (&amp;quot;Hello, &amp;quot; : &amp;quot;World&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der String-Operator wandelt numerische Ausdrücke automatisch in Strings.&lt;br /&gt;
&lt;br /&gt;
Somit führt der Programmabschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = (3 * 5) : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zu einem Ausdruck von &amp;quot;15 ist das Ergebnis.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wichtig: &#039;&#039;&#039;Der String-Operator bindet stärker als alle anderen nicht-unären Operatoren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fehlende Klammern in Abschnitt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string str&lt;br /&gt;
    str = 3 * 5 : &amp;quot; ist das Ergebnis.&amp;quot;&lt;br /&gt;
    console.println (str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
führen also zum Ausdruck von lediglich &amp;quot;15&amp;quot;, da der zwischendurch entstehende Ausdruck &amp;quot;5 ist das Ergebnis&amp;quot; für die Multiplikation in einen Integer gewandelt wird. Übrig bleibt daher lediglich 3 * 5. Das Ergebnis wird wegen der Zuweisung wieder zurück in einen String gewandelt. Übrig bleibt &amp;quot;15&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Bibliotheken =&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek string ===&lt;br /&gt;
&lt;br /&gt;
==== string.length () ====&lt;br /&gt;
&lt;br /&gt;
Die length-Funktion gibt die Länge eines Strings zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int string.length (string str)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Länge des Strings&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    int len&lt;br /&gt;
    len = string.length (&amp;quot;abcdef&amp;quot;);            // gibt 6 zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== string.substring () ====&lt;br /&gt;
&lt;br /&gt;
Die substring-Funktion kann beliebige Zeichenketten aus einem String extrahieren. &lt;br /&gt;
&lt;br /&gt;
Syntax: string string.substring (string str, int start [, int length ])&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* string: Die Eingabezeichenkette&lt;br /&gt;
* start: Die Startposition innerhalb des Strings&lt;br /&gt;
* length: Die Länge des zu extrahierenden Strings. Der Parameter ist optional.&lt;br /&gt;
&lt;br /&gt;
Die Startposition wird ab 0 gezählt. Ist der Startwert positiv oder 0, wird die Startposition innerhalb des Eingabestrings von links gezählt, anderenfalls von rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    string rest&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -1);    // gibt &amp;quot;f&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -2);    // gibt &amp;quot;ef&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, 1); // gibt &amp;quot;d&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und positiv, enthält der zurückgegebene String höchstens length Zeichen ab start (abhängig von der Länge von string).&lt;br /&gt;
&lt;br /&gt;
Ist length angegeben und negativ, werden genau so viele Zeichen vom Ende von string abgeschnitten (nachdem die Startposition ermittelt wurde, sollte start negativ sein). Gibt start die Position des abzuschneidenden Teiles oder dahinter an, wird ein leerer String zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 0, -1);  // gibt &amp;quot;abcde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 2, -1);  // gibt &amp;quot;cde&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, 4, -4);  // gibt &amp;quot;&amp;quot; zurück&lt;br /&gt;
    rest = string.substring (&amp;quot;abcdef&amp;quot;, -3, -1); // gibt &amp;quot;de&amp;quot; zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aus Basic bekannten Funktionen &#039;left&#039;, &#039;right&#039; und &#039;mid&#039; können alle mit der substring-Funktion abgebildet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function string left (string str, int l)&lt;br /&gt;
    return string.substring (str, 0, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string right (string str, int l)&lt;br /&gt;
    return string.substring (str, -l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function string mid (string str, int s, int l)&lt;br /&gt;
    return string.substring (str, s, l)&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    string x&lt;br /&gt;
    x = &amp;quot;abcdef&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    console.println (left (x, 3))     // gibt &amp;quot;abc&amp;quot; aus&lt;br /&gt;
    console.println (right (x, 3))    // gibt &amp;quot;def&amp;quot; aus&lt;br /&gt;
    console.println (mid (x, 2, 2))   // gibt &amp;quot;cd&amp;quot; aus&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek time ===&lt;br /&gt;
&lt;br /&gt;
==== time.millis () ====&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von time.millis() entsprecht der internen &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers seit dem letzten Boot in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: int time.millis ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.reset () ====&lt;br /&gt;
&lt;br /&gt;
time.reset setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers zurück auf 0.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset ()&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Reset: &amp;quot; : time)&lt;br /&gt;
    time.reset ()&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Reset: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.set () ====&lt;br /&gt;
&lt;br /&gt;
time.set setzt die interne &amp;quot;Uhrzeit&amp;quot; des Mikrocontrollers auf den angegebenen Wert&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.reset (int millis)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Set: &amp;quot; : time)&lt;br /&gt;
    time.set (1000)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Set: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== time.delay () ====&lt;br /&gt;
&lt;br /&gt;
time.delay() wartet die angegebene Zeit in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
Syntax: void time.delay (int msec)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int time&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit vor Delay: &amp;quot; : time)&lt;br /&gt;
    time.delay (500)&lt;br /&gt;
    time = time.millis ()&lt;br /&gt;
    console.println (&amp;quot;Zeit nach Delay: &amp;quot; : time)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek console ===&lt;br /&gt;
&lt;br /&gt;
==== console.print () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.print (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.print (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Wird nur das erste Argument übergeben, wird anhand des Parameter-Typs entschieden, ob ein String oder ein Integer-Wert auf der Console ausgedruckt wird. Man kann aber auch steuern, wie der übergebene Parameter behandelt werden soll. Dabei kann TYPE die folgenden Werte haben:&lt;br /&gt;
&lt;br /&gt;
* STR - Der Parameter wird als String behandelt&lt;br /&gt;
* DEC - Der Parameter wird als Dezimalzahl gedruckt&lt;br /&gt;
* DEC0 - Der Parameter wird als Dezimalzahl gedruckt, jedoch wird das Ausgabefeld mit führenden Nullen aufgefüllt.&lt;br /&gt;
* HEX - Der Parameter wird als Hexadezimalzahl gedruckt&lt;br /&gt;
* BIN - Der Parameter wird als Binärzahl gedruckt&lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren numerischen Parameter WIDTH kann gesteuert werden, wie breit das Ausgabefeld sein soll. Dann wird der ausgegebene Text auf mindestens diese Anzahl von Zeichen tabuliert, das heißt mit Leerzeichen aufgefüllt. Ist WIDTH positiv, werden Leerzeichen von links beginnend eingefügt, ist WIDTH negativ, werden entsprechend viele Leerzeichen rechts angefügt, um auf die gewünschte Breite zu kommen. Eine Besonderheit ist das Drucken von HEX- oder BIN-Zahlen: Bei positivem Wert von WIDTH wird das Feld mit Nullen statt Leerzeichen aufgefüllt. Bei Dezimalzahlen geht dieses über den Typ DEC0.&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: Anzahl der gedruckten Zeichen.&lt;br /&gt;
&lt;br /&gt;
Beispiele siehe console.println ().&lt;br /&gt;
&lt;br /&gt;
==== console.println () ====&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int console.println (int/string EXPRESSION)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE)&lt;br /&gt;
oder:&lt;br /&gt;
    int console.println (int/string EXPRESSION, const TYPE, int WIDTH)&lt;br /&gt;
&lt;br /&gt;
Das Verhalten entspricht exakt der Funktion  console.print(). Jedoch wird noch nach dem Ausdruck ein CRNL-Paar angefügt, um eine neue Zeile zu beginnen.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    i = 4711&lt;br /&gt;
    console.println (i)                        // 4711&lt;br /&gt;
    console.println (i, DEC)                   // 4711&lt;br /&gt;
    console.println (i, HEX)                   // 1267&lt;br /&gt;
    console.println (i, BIN)                   // 1001001100111&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFFFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFFFFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX)              // 7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFFFF&lt;br /&gt;
    console.println (i, HEX)                   // FFFF&lt;br /&gt;
    console.println (i, HEX, 8)                // 0000FFFF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 8)           // 7FFF&lt;br /&gt;
&lt;br /&gt;
    i = 0xFF&lt;br /&gt;
    console.println (i, HEX, 2)                // FF&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, HEX, 2)           // 7F&lt;br /&gt;
    console.println (i &amp;gt;&amp;gt; 1, BIN, 16)          // 0000000001111111&lt;br /&gt;
&lt;br /&gt;
    console.println (0xAA, BIN, 8)             // 10101010&lt;br /&gt;
    console.println (1, BIN, 32)               // 00000000000000000000000000000001&lt;br /&gt;
&lt;br /&gt;
    console.println (&amp;quot;Hallo, Welt&amp;quot;)            // Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;)         // 42 Hallo, Welt&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, DEC)    // 42&lt;br /&gt;
    console.println (&amp;quot;42 Hallo, Welt&amp;quot;, BIN)    // 101010&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek gpio ===&lt;br /&gt;
&lt;br /&gt;
==== gpio.init () ====&lt;br /&gt;
&lt;br /&gt;
Initialisiert General Purpose I/O für einen Pin.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    void gpio.init (PORT, BIT, INPUT [, NOPULL | PULLDOWN | PULLUP ])&lt;br /&gt;
oder&lt;br /&gt;
    void gpio.init (PORT, BIT, OUTPUT [, PUSHPULL | OPENDRAIN ])&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
Für die Datenrichtung muss entweder die Konstante INPUT oder die Konstante OUTPUT vorgegeben werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als INPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NOPULL (Default):&#039;&#039;&#039; Der Eingang wird nicht durch einen internen Pullup oder Pulldown beeinflusst&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Pins als OUTPUT können folgende Alternativen eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUSHPULL (Default):&#039;&#039;&#039; Der Ausgang wird möglichst niederohmig geschaltet.&lt;br /&gt;
* &#039;&#039;&#039;OPENDRAIN:&#039;&#039;&#039; Der Low-Pegel wird möglichst niederohmig geschaltet, der High-Pegel ist hochohmig.&lt;br /&gt;
&lt;br /&gt;
Der letzte Parameter von gpio.init() ist optional. Wird er weggelassen, wird der jeweilige Standardwert (Default) eingestellt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // C13 als Input, kein Pulldown/Pullup&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT, PULLUP)    // C13 als Input mit Pullup&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.set () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf High-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.set (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.set (GPIOA, 5)                    // Pin auf HIGH&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.reset () ====&lt;br /&gt;
&lt;br /&gt;
Setzt den ausgewählten Pin auf Low-Pegel.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.reset (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                  // Pin auf Low&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.toggle () ====&lt;br /&gt;
&lt;br /&gt;
Invertiert den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: void gpio.toggle (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)           // A5 als Output&lt;br /&gt;
    loop&lt;br /&gt;
        gpio.toggle (GPIOA, 5)             // A5 invertieren&lt;br /&gt;
        time.delay (500)                   // eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== gpio.get () ====&lt;br /&gt;
&lt;br /&gt;
Liest den Zustand des ausgewählten Pins.&lt;br /&gt;
&lt;br /&gt;
Syntax: int gpio.get (PORT, BIT)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert ist entweder LOW oder HIGH.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    gpio.init (GPIOC, 13, INPUT)            // set pin C13 (user button) to input, has extern pullup&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)            // board LED = A5&lt;br /&gt;
    gpio.set (GPIOA, 5)                     // switch LED on&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if gpio.get (GPIOC, 13) = LOW       // button pressed?&lt;br /&gt;
            gpio.set (GPIOA, 5)             // switch LED off&lt;br /&gt;
            break                           // break loop&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek bit ===&lt;br /&gt;
&lt;br /&gt;
==== bit.set () ====&lt;br /&gt;
&lt;br /&gt;
bit.set() setzt ein Bit.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.set (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.set (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;|&#039; nutzen, um ein Bit zu setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = zahl | (1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== bit.reset () ====&lt;br /&gt;
&lt;br /&gt;
bit.reset() setzt ein Bit zurück.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.reset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = bit.reset (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch den Operator &#039;&amp;amp;&#039; zusammen mit &#039;~&#039; nutzen, um ein Bit zu zurückzusetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b11111111&lt;br /&gt;
    zahl = zahl &amp;amp; ~(1&amp;lt;&amp;lt;5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 11011111&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.toggle () ====&lt;br /&gt;
&lt;br /&gt;
bit.toggle() wechselt den Zustand eines Bits.&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.toggle (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int zahl&lt;br /&gt;
    zahl = 0b00000000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00100000&lt;br /&gt;
    zahl = bit.toggle (zahl, 5)&lt;br /&gt;
    console.println (zahl, BIN)     // Ausgabe: 00000000&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bit.isset () ====&lt;br /&gt;
&lt;br /&gt;
bit.isset() gibt den Zustand eines Bits zurück&lt;br /&gt;
&lt;br /&gt;
Syntax: int bit.isset (int value, int bit)&lt;br /&gt;
&lt;br /&gt;
Rückgabewert: TRUE, wenn das Bit gesetzt ist, sonst FALSE.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int bit&lt;br /&gt;
    bit = bit.isset (0b11111111, 5)&lt;br /&gt;
    if bit = TRUE&lt;br /&gt;
    else&lt;br /&gt;
        console.println (&amp;quot;bit is set&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
        console.println (&amp;quot;bit is not set&amp;quot;)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek button ===&lt;br /&gt;
&lt;br /&gt;
==== button.init () ====&lt;br /&gt;
&lt;br /&gt;
Definiert einen GPIO-Pin als Tastereingang. Der Taster wird automatisch vom NIC-Laufzeitsystem per Software entprellt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.init (PORT, BIT, MODE)&lt;br /&gt;
&lt;br /&gt;
Als PORT kann GPIOA, GPIOB, GPIOC usw. gewählt werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
BIT ist das jeweilige Bit am I/O-Port, beim STM32 also ein Wert von 0 bis 15.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Tastereingangs können folgende Alternativen für MODE eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PULLDOWN:&#039;&#039;&#039; Es wird der interne Pulldown-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel LOW.&lt;br /&gt;
* &#039;&#039;&#039;PULLUP:&#039;&#039;&#039; Es wird der interne Pullup-Widerstand hinzugeschaltet, d.h. bei offenem Eingang ist der Pegel HIGH.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLDOWN:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pulldowns nicht notwendig, Taster ist active high.&lt;br /&gt;
* &#039;&#039;&#039;NOPULLUP:&#039;&#039;&#039; Für den Tastereingang ist die Hinzuschaltung des internen Pullups nicht notwendig, Taster ist active high.&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich, dass bei Einstellung PULLDOWN der Schalter gegen Vcc, bei Einstellung PULLUP der Schalter gegen GND schalten muss. Dasselbe gibt für NOPULLDOWN bzw. NOPULLUP. Hier muss die externe Beschaltung selbst für einen definierten Pegel sorgen, zum Beispiel bei NOPULLUP durch Anschluss eines &#039;&#039;&#039;externen&#039;&#039;&#039; Pullups.&lt;br /&gt;
&lt;br /&gt;
Das NIC-Laufzeitsystem vergibt eine interne Tastennummer größer Null, die bei Abfragen durch button.pressed() dann angegeben werden muss. Bis zu 8 solcher Tasten können mittels button.init() definiert werden. Wenn button.init() eine 0 zurückliefert, sind bereits alle 8 Tasten definiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Beim Nucleo hängt der blaue User-Taster an PC13 und schaltet gegen GND. Da hier bereits ein externer Pullup-Widerstand vorgesehen ist, muss &#039;&#039;&#039;kein interner Pullup-Widerstand&#039;&#039;&#039; aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es bis auf den RESET-Taster keinen weiteren Taster auf dem Board. Wir können aber zum Beispiel einen Taster an PA6 anschließen, so dass er gegen GND schaltet. Den externen Pullup sparen wir uns und verwenden dafür den internen Pullup am Pin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)   // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== button.pressed () ====&lt;br /&gt;
&lt;br /&gt;
Abfrage des Tasters.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
    int button.pressed (int button)&lt;br /&gt;
&lt;br /&gt;
button ist dabei die Taster-Nummer, die von button.init() zurückgegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
&lt;br /&gt;
    TRUE: Taste ist gedrückt&lt;br /&gt;
    FALSE: Taste wurde nicht gedrückt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Einschalten der Board-LED, sobald die blaue User-Taste gedrückt wird, sonst ausschalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOA, 5, OUTPUT)                 // LED als Output&lt;br /&gt;
    gpio.reset (GPIOA, 5)                        // Pegel low: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOC, 13, NOPULLUP)   // C13 als Input, kein interner Pullup nötig, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.set (GPIOA, 5)                  // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.reset (GPIOA, 5)                // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim STM32F103 Mini-Development-Board gibt es eine blaue LED auf dem Board. Sie ist an PC13 angeschlossen. Allerdings muss diese gegen GND geschaltet werden, damit sie leuchtet. Sie ist also &amp;quot;active low&amp;quot; - im Gegensatz zur Nucleo-LED. Die Set- und Reset-Befehl werden hier daher ausgetauscht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int button&lt;br /&gt;
    gpio.init (GPIOC, 13, OUTPUT)                // LED als Output&lt;br /&gt;
    gpio.set (GPIOC, 13)                         // Pegel high: LED ist aus&lt;br /&gt;
&lt;br /&gt;
    button = button.init (GPIOA, 6, PULLUP)      // PA6 als Input mit internem Pullup, active low&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if button.pressed (button) = TRUE        // Taste gedrückt?&lt;br /&gt;
            gpio.reset (GPIOC, 13)               // ja, LED einschalten&lt;br /&gt;
        else&lt;br /&gt;
            gpio.set (GPIOC, 13)                 // nein, LED ausschalten&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ws2812 ===&lt;br /&gt;
&lt;br /&gt;
==== ws2812.init () ====&lt;br /&gt;
&lt;br /&gt;
Mit ws2812.init() wird die WS2812-LED-Bibliothek initialisiert.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.init (int nleds)&lt;br /&gt;
&lt;br /&gt;
Als Argument ist die maximale Anzahl der verwendeten LEDs in der Kette anzugeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (30)   // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.set () ====&lt;br /&gt;
&lt;br /&gt;
Damit wird die Farbe einer oder aller WS2812-LEDs gesetzt.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.set (int led, int red, int green, int blue)&lt;br /&gt;
&lt;br /&gt;
led gibt die Nummer der LED an - beginnend mit 0. Wird als Nummer die Anzahl der verwendeten LEDs angegeben, werden die Farben sämtlicher verwendeter LEDs gesetzt. Die Farben können Werte zwischen 0 (aus) und 255 (volle Helligkeit) haben.&lt;br /&gt;
&lt;br /&gt;
Der Set-Befehl setzt die angebenen Farben erst einmal nur im RAM. Erst mit dem ws2812.refresh()-Befehl werden dann sämtliche gesetzten Farben an die LEDs übertragen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int i&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ws2812.set (MAXLEDS, 128, 128, 128)   // Alle LEDs auf weiß, halbe Helligkeit&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to MAXLEDS&lt;br /&gt;
        ws2812.set (i, 0, 128, 128)       // Eine LEDs auf türkis, halbe Helligkeit&lt;br /&gt;
        ws2812.refresh (MAXLEDS)          // Ausgabe&lt;br /&gt;
        delay (200)                       // 0,2 Sekunden warten&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ws2812.refresh () ====&lt;br /&gt;
&lt;br /&gt;
ws2812.refresh() überträgt sämtliche zuvor gesetzte Farben an die LEDs.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    void ws2812.refresh (nleds)&lt;br /&gt;
&lt;br /&gt;
Das Argument nleds bestimmt, wieviele der LEDs aktualisiert werden sollen. Der Maximalwert ist derjenige, der bei ws2812.init() angegeben wurde. Dann werden alle LEDs aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
const int MAXLEDS = 30&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAXLEDS)                 // 30 LEDs auf dem Stripe&lt;br /&gt;
    ...&lt;br /&gt;
    ws2812.refresh (MAXLEDS)              // Ausgabe: Alle LEDs aktualisieren&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konkreteres Beispiel siehe oben: [[NIC#ws2812.set_.28.29|ws2812.set()]].&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irmp ===&lt;br /&gt;
&lt;br /&gt;
==== irmp.init () ====&lt;br /&gt;
==== irmp.get () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek irsnd ===&lt;br /&gt;
&lt;br /&gt;
==== irsnd.init () ====&lt;br /&gt;
==== irsnd.send () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek i2c ===&lt;br /&gt;
&lt;br /&gt;
==== i2c.init () ====&lt;br /&gt;
&lt;br /&gt;
i2c.init () initialisiert die jeweils gewünschte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
  void i2c.init (int channel, int alternate, int clockspeed)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
*  channel: I2C-Channel. Erlaubte Werte: I2C1, I2C2 oder I2C3. Welche Werte davon möglich sind, ist prozessorabhängig.&lt;br /&gt;
*  alternate: Flag, ob die alternative Pinkonfiguration verwendet werden soll, siehe Tabelle.&lt;br /&gt;
*  clockspeed: Taktgeschwindigkeit. Standard ist 100000 (100k), möglich ist aber auch 400000 (400k) für schnelle Peripherie&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Mögliche I2C-Channel&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Channel || ALT || STM32F4x1 Nucleo || STM32F103C8T6&lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  0  || SCL=PB6,  SDA=PB7|| SCL=PB6,  SDA=PB7 &lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  0  || SCL=PB10, SDA=PB3 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  0  || SCL=PA8,  SDA=PB4 ||                  &lt;br /&gt;
|-&lt;br /&gt;
| I2C1    ||  1  || SCL=PB8,  SDA=PB9 || SCL=PB8,  SDA=PB9&lt;br /&gt;
|-&lt;br /&gt;
| I2C2    ||  1  ||                   ||                   &lt;br /&gt;
|-&lt;br /&gt;
| I2C3    ||  1  || SCL=PA8,  SDA=PC9 ||                   &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)          // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
    ...&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== i2c.write () ====&lt;br /&gt;
&lt;br /&gt;
i2c.write() schreibt einen Datenpuffer auf die gewählte I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.write (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Schreiben des Datums &amp;quot;2017-06-10 16:32:12&amp;quot; in eine DS3231 Real Time Clock:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// write date/time to DS3231&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year = 2017&lt;br /&gt;
int mon  = 6&lt;br /&gt;
int mday = 10&lt;br /&gt;
int hour = 16&lt;br /&gt;
int min  = 32&lt;br /&gt;
int sec  = 12&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert decimal number into BCD format&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int dec2bcd (int i)&lt;br /&gt;
    i = ((i / 10) &amp;lt;&amp;lt; 4) | (i  % 10)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: set date/time to 2017-06-10 16:32:12&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    year = year % 100                                   // 2000 - 2099 -&amp;gt; 00 - 99&lt;br /&gt;
&lt;br /&gt;
    buf[0] = dec2bcd (sec)                              // seconds (0-59)&lt;br /&gt;
    buf[1] = dec2bcd (min)                              // minutes (0-59)&lt;br /&gt;
    buf[2] = dec2bcd (hour)                             // hours (0-24)&lt;br /&gt;
    buf[3] = 0                                          // wday (unknown) (0-6)&lt;br /&gt;
    buf[4] = dec2bcd (mday)                             // day of month (0-31)&lt;br /&gt;
    buf[5] = dec2bcd (mon)                              // month (1-12)&lt;br /&gt;
    buf[6] = dec2bcd (year)                         	// year (00-99)&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, RTC, 0x00, FALSE, buf, 7)    // write to RTC&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag beim Aufruf von i2c.write() auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== i2c.read () ====&lt;br /&gt;
&lt;br /&gt;
i2c.read() liest Daten von der gewählten I2C-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&lt;br /&gt;
    int i2c.read (int channel, int address, int startaddress, int flag, byte buffer[], int length)&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
&lt;br /&gt;
* channel: I2C-Channel, siehe i2c.init()&lt;br /&gt;
* address: I2C-Adresse des anzusprechenden Moduls&lt;br /&gt;
* startaddress: Start-Adresse für die Daten&lt;br /&gt;
* flag: Flag, ob die Start-Adresse ein 8- oder 16-Bit-Wert ist: TRUE: 16-Bit, FALSE: 8-Bit&lt;br /&gt;
* buffer: Datenpuffer&lt;br /&gt;
* length: Länge der Daten&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Lesen von Datum/Uhrzeit aus DS3231 Real Time Clock und Ausgabe auf der Console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// read date/time from DS3231 RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
const int RTC = 0xD0                                    // I2C address of DS3231 RTC&lt;br /&gt;
&lt;br /&gt;
int year&lt;br /&gt;
int mon&lt;br /&gt;
int mday&lt;br /&gt;
int hour&lt;br /&gt;
int min&lt;br /&gt;
int sec&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// convert BCD format into decimal number&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function int bcd2dec (byte i)&lt;br /&gt;
    i = 10 * ((i &amp;amp; 0xF0) &amp;gt;&amp;gt; 4) + (i &amp;amp; 0x0F)&lt;br /&gt;
    return i&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: get date/time from RTC&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buf[7]                                      // Data buffer&lt;br /&gt;
    int     rtc&lt;br /&gt;
&lt;br /&gt;
    i2c.init (I2C1, FALSE, 100000)                      // Channel 1, SCL=PB6, SDA=PB7, 100k&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, RTC, 0x00, FALSE, buf, 7)     // read from RTC&lt;br /&gt;
&lt;br /&gt;
    if rtc = TRUE&lt;br /&gt;
        sec  = bcd2dec (buf[0])                     	// seconds (0-59)&lt;br /&gt;
        min  = bcd2dec (buf[1])                     	// minutes (0-59)&lt;br /&gt;
        hour = bcd2dec (buf[2])                     	// hours (0-24)&lt;br /&gt;
        mday = bcd2dec (buf[4])                     	// day of month (0-31)&lt;br /&gt;
        mon  = bcd2dec (buf[5])                     	// month (1-12)&lt;br /&gt;
        year = bcd2dec (buf[6])                     	// year (00-99)&lt;br /&gt;
        year = year + 2000                          	// 00 - 99 -&amp;gt; 2000 - 2099&lt;br /&gt;
&lt;br /&gt;
        console.print (year, DEC0, 4)                   // print YYYY-DD-MM hh:mm:ss&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mon, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;-&amp;quot;)&lt;br /&gt;
        console.print (mday, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot; &amp;quot;)&lt;br /&gt;
        console.print (hour, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (min, DEC0, 2)&lt;br /&gt;
        console.print (&amp;quot;:&amp;quot;)&lt;br /&gt;
        console.print (sec, DEC0, 2)&lt;br /&gt;
        console.println (&amp;quot;&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die RTC erwartet lediglich 8-Bit-Startadressen. Deshalb wird hier das Flag auf FALSE gesetzt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiteres Beispiel: Lesen/Schreiben eines EEPROMs:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
// main function: write some values into EEPROM, read them from EEPROM again&lt;br /&gt;
//-----------------------------------------------------------------------------------&lt;br /&gt;
function void main ()&lt;br /&gt;
    byte    buffer1[8]&lt;br /&gt;
    byte    buffer2[8]&lt;br /&gt;
    int     rtc&lt;br /&gt;
    int     i&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        buffer1[i] = i&lt;br /&gt;
    endfor&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.write (I2C1, EEPROM, 0x0000, TRUE, buffer1, 8)    // write buffer1 to EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c write error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    rtc = i2c.read (I2C1, EEPROM, 0x0000, TRUE, buffer2, 8)     // read buffer2 from EEPROM&lt;br /&gt;
&lt;br /&gt;
    if rtc = FALSE&lt;br /&gt;
        console.println (&amp;quot;i2c read error!&amp;quot;)&lt;br /&gt;
    endif&lt;br /&gt;
&lt;br /&gt;
    for i = 0 to 7&lt;br /&gt;
        console.println (buffer2[i])&lt;br /&gt;
    endfor&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da das EEPROM 16-Bit-Startadressen erwartet, wird hier das Flag auf TRUE gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek rtc ===&lt;br /&gt;
&lt;br /&gt;
==== rtc.read () ====&lt;br /&gt;
==== rtc.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek eeprom ===&lt;br /&gt;
&lt;br /&gt;
==== eeprom.read () ====&lt;br /&gt;
==== eeprom.write () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek onewire ===&lt;br /&gt;
&lt;br /&gt;
==== onewire.init () ====&lt;br /&gt;
==== onewire.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek ds1820 ===&lt;br /&gt;
&lt;br /&gt;
==== ds1820.init () ====&lt;br /&gt;
==== ds1820.read () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek lcd ===&lt;br /&gt;
&lt;br /&gt;
==== lcd.init () ====&lt;br /&gt;
==== lcd.move () ====&lt;br /&gt;
==== lcd.print () ====&lt;br /&gt;
&lt;br /&gt;
=== Bibliothek spi ===&lt;br /&gt;
&lt;br /&gt;
==== spi.init () ====&lt;br /&gt;
==== spi.read () ====&lt;br /&gt;
==== spi.write () ====&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Lauflicht mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird ein Lauflicht mit 30 WS2812-LEDs realisiert. Die erste Variante läuft noch mit der delay-Funktion, welche keinen Spielraum mehr lässt für andere Sachen, die eventuell auch noch abgearbeitet werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die zweite Variante ist da schon wesentlich eleganter. Sie wird nur aktiv, wenn auch Änderungen auf unserem LED-Streifen vonnöten sind.&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante dagegen überlässt dem NIC-Laufzeitsystem die Zeitmessung bis zum nächsten LED-Update, so dass man sich darum nicht mehr kümmern muss. Desweiteren kann man bis zu 8 solcher Alarm-Timer gleichzeitig aktivieren, so dass man hier auch ganz verschiedene Aufgaben mit unterschiedlichen Aktivierungszeiten implementieren kann. Hier wird der Alarm-Timer noch gepollt, d.h. explizit abgefragt.&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird auch dieses noch dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche automatisch aufgerufen werden soll, wenn der Alarm eintrifft.&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Delay ===&lt;br /&gt;
&lt;br /&gt;
Die erste Variante arbeitet mit einem Delay, welches den Prozessor warten lässt. Währenddessen kann man keine anderen Aktionen im Programm ausführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                           // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                       // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                        // Gruen aus&lt;br /&gt;
    int blue    =  0                        // Blau aus&lt;br /&gt;
    int led                                 // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                  // Initialisierung&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        ws2812.set (MAX_LEDS, 0, 0, 0)      // Alle LEDs aus&lt;br /&gt;
        ws2812.set (led, red, green, blue)  // Eine LED leuchten lassen&lt;br /&gt;
        ws2812.refresh (MAX_LEDS)           // Zustand aktualisieren&lt;br /&gt;
        led = led + 1                       // Naechste LED&lt;br /&gt;
        if led &amp;gt;= MAX_LEDS                  // Ende erreicht?&lt;br /&gt;
            led = 0                         // Ja, zurueck zum Anfang&lt;br /&gt;
        endif&lt;br /&gt;
        time.delay (500)                    // Eine halbe Sekunde warten&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Millis-Timer ===&lt;br /&gt;
&lt;br /&gt;
Diese Variante ermittelt mittels time.millis(), wann es aktiv werden soll und kann währenddessen noch andere Aufgaben erledigen. Allerdings wird hier der millis-Timer verwendet, so dass dieser nicht mehr für andere Dinge zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    time.reset ()                                   // Setze &amp;quot;Uhrzeit&amp;quot; zurueck&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if time.millis() &amp;gt; 500                      // Eine halbe Sekunde erreicht?&lt;br /&gt;
            time.reset ()                           // Ja, Zeit wieder zuruecksetzen&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm ===&lt;br /&gt;
&lt;br /&gt;
Die dritte Variante verwendet einen von acht Alarm-Timern. Das ist damit die Luxusversion. Der millis-Timer wird nicht verwendet. Neben diesem können noch sieben weitere Alarm-Timer für andere Aufgaben benutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    int red     = 128                               // Rot auf halbe Helligkeit&lt;br /&gt;
    int green   =  0                                // Gruen aus&lt;br /&gt;
    int blue    =  0                                // Blau aus&lt;br /&gt;
    int led                                         // Aktive LED&lt;br /&gt;
    int timer1                                      // alarm-timer&lt;br /&gt;
&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    timer1 = alarm.set (500)                        // Alarm initialisieren&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
        if alarm (timer1) = TRUE                    // Alarm gesetzt?&lt;br /&gt;
            ws2812.set (MAX_LEDS, 0, 0, 0)          // Alle LEDs aus&lt;br /&gt;
            ws2812.set (led, red, green, blue)      // Eine LED leuchten lassen&lt;br /&gt;
            ws2812.refresh (MAX_LEDS)               // Zustand aktualisieren&lt;br /&gt;
            led = led + 1                           // Naechste LED&lt;br /&gt;
            if led &amp;gt;= MAX_LEDS                      // Ende erreicht?&lt;br /&gt;
                led = 0                             // Ja, zurueck zum Anfang&lt;br /&gt;
            endif&lt;br /&gt;
        else&lt;br /&gt;
            // ...                                  // Hier koennen nun andere Aufgaben erledigt werden!&lt;br /&gt;
        endif&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lauflicht mit Alarm als Interrupt ===&lt;br /&gt;
&lt;br /&gt;
In der letzten und vierten Variante wird das Pollen des Alarm-Timers dem NIC-Runtime-System überlassen. Hier geben wir einfach eine NIC-Funktion an, welche aufgerufen werden soll, wenn der Alarm eintrifft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
int MAX_LEDS = 30                                   // Anzahl der benutzten LEDs&lt;br /&gt;
&lt;br /&gt;
function void lauflicht ()&lt;br /&gt;
    static int red      = 128                       // Rot&lt;br /&gt;
    static int green    = 0                         // Gruen&lt;br /&gt;
    static int blue     = 0                         // Blau&lt;br /&gt;
    static int led                                  // Aktive LED&lt;br /&gt;
&lt;br /&gt;
    ws2812.set (MAX_LEDS, 0, 0, 0)                  // Alle LEDs aus&lt;br /&gt;
    ws2812.set (led, red, green, blue)              // Eine LED leuchten lassen&lt;br /&gt;
    ws2812.refresh (MAX_LEDS)                       // Zustand aktualisieren&lt;br /&gt;
    led = led + 1                                   // Naechste LED&lt;br /&gt;
    if led &amp;gt;= MAX_LEDS                              // Ende erreicht?&lt;br /&gt;
        led = 0                                     // Ja, zurueck zum Anfang&lt;br /&gt;
    endif&lt;br /&gt;
endfunction&lt;br /&gt;
&lt;br /&gt;
function void main ()&lt;br /&gt;
    ws2812.init (MAX_LEDS)                          // Initialisierung&lt;br /&gt;
    alarm.set (500, function.lauflicht)             // lauflicht() alle 500msec automatisch aufrufen lassen&lt;br /&gt;
&lt;br /&gt;
    loop&lt;br /&gt;
            // ...                                  // Hier koennen nun komplett andere Aufgaben erledigt werden!&lt;br /&gt;
    endloop&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variablen led, red, green und blue sind nun alle in die Funktion lauflicht() gewandert. Die Definition als static-Variable lassen sie über die ganze Laufzeit des Programms &amp;quot;leben&amp;quot;, d.h. sie verlieren nicht ihren Wert, wenn die Funktion wieder verlassen wird. Alternativ können sie auch einfach als globale Variablen definiert werden. Der Vorteil der static-Definition ist jedoch, dass sie ausschließlich in der Funktion lauflicht() manipuliert werden können.&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Knight Rider mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Beispielprojekt - Equinox-Uhr mit WS2812 =&lt;br /&gt;
&lt;br /&gt;
= Erstellung eigener NIC-Bibliotheksfunktionen =&lt;br /&gt;
&lt;br /&gt;
= Benchmarks =&lt;br /&gt;
&lt;br /&gt;
=== Sieb des Eratosthenes ===&lt;br /&gt;
&lt;br /&gt;
Es geht um die Ermittlung sämtlicher Primzahlen bis 100.000.&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in NIC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=pas&amp;gt;&lt;br /&gt;
function void main ()&lt;br /&gt;
    int limit = 100000&lt;br /&gt;
    int zahl&lt;br /&gt;
    int zaehler&lt;br /&gt;
    int primzahl&lt;br /&gt;
    int letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
    for zahl = 2 to limit&lt;br /&gt;
        primzahl = TRUE&lt;br /&gt;
&lt;br /&gt;
        for zaehler = 2 to zahl / 2&lt;br /&gt;
            if zahl % zaehler = 0&lt;br /&gt;
                primzahl = FALSE&lt;br /&gt;
                break&lt;br /&gt;
            endif&lt;br /&gt;
        endfor&lt;br /&gt;
&lt;br /&gt;
        if primzahl = TRUE&lt;br /&gt;
            // console.println (zahl : &amp;quot; ist eine Primzahl&amp;quot;)&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
        endif&lt;br /&gt;
    endfor&lt;br /&gt;
    console.println (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; : letzte_primzahl)&lt;br /&gt;
endfunction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in PHP:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$limit = 100000;&lt;br /&gt;
&lt;br /&gt;
for ($zahl = 2; $zahl &amp;lt;= $limit; $zahl++)&lt;br /&gt;
{&lt;br /&gt;
    $primzahl = true;&lt;br /&gt;
&lt;br /&gt;
    for ($zaehler = 2; $zaehler &amp;lt;= $zahl / 2; $zaehler++)&lt;br /&gt;
    {&lt;br /&gt;
        if ($zahl % $zaehler == 0)&lt;br /&gt;
        {&lt;br /&gt;
            $primzahl = false;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ($primzahl)&lt;br /&gt;
    {&lt;br /&gt;
        // print (&amp;quot;&amp;quot; . $zahl . &amp;quot; ist eine Primzahl\n&amp;quot;);&lt;br /&gt;
        $letzte_primzahl = $zahl;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot; . $letzte_primzahl . &amp;quot;\n&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Python:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    limit = 100000&lt;br /&gt;
&lt;br /&gt;
    for zahl in range (2, limit):&lt;br /&gt;
        primzahl = True&lt;br /&gt;
&lt;br /&gt;
        for zaehler in range (2, zahl / 2):&lt;br /&gt;
            if zahl % zaehler == 0:&lt;br /&gt;
                primzahl = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if primzahl == True:&lt;br /&gt;
            letzte_primzahl = zahl&lt;br /&gt;
    print &amp;quot;Die hoechste ermittelte Primzahl ist %d&amp;quot; % (letzte_primzahl)&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieb des Eratosthenes in Lua:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=lua&amp;gt;&lt;br /&gt;
local limit = 100000&lt;br /&gt;
local zahl&lt;br /&gt;
local zaehler&lt;br /&gt;
local primzahl&lt;br /&gt;
local letzte_primzahl&lt;br /&gt;
&lt;br /&gt;
for zahl = 2, limit do&lt;br /&gt;
    primzahl = true&lt;br /&gt;
&lt;br /&gt;
    for zaehler = 2, zahl / 2 do&lt;br /&gt;
        if zahl % zaehler == 0 then&lt;br /&gt;
            primzahl = false&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if primzahl == true then&lt;br /&gt;
        -- print (zahl, &amp;quot;ist eine Primzahl&amp;quot;)&lt;br /&gt;
        letzte_primzahl = zahl&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
print (&amp;quot;Die hoechste ermittelte Primzahl ist &amp;quot;, letzte_primzahl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Umsetzung in PHP, Python und Lua wurde durch 1:1-Ersetzung jeder Zeile durch die adäquate Formulierung in der jeweiligen Programmiersprache vorgenommen. Die Programme sind damit direkt vergleichbar.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeiten:&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ergebnisse: Sieb des Eratosthenes&#039;&#039;&#039;&lt;br /&gt;
|-  style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Programmiersprache || Version || i7-2600 CPU @ 3.40GHz || Intel T6500 @ 2.10GHz&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NIC&#039;&#039;&#039; || 0.9 || 5,3 sec || 17,3 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PHP&#039;&#039;&#039; || 5.6.23 || 10,4 sec ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Python&#039;&#039;&#039; || 2.7 || 25,6 sec || 118 sec&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Lua&#039;&#039;&#039; || 5.2 || 6,1 sec ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich nicht, obiges Programm auf dem STM32 mit dem oben verwendeten Startwert 100000 laufen zu lassen. Dabei muss man schon seeeehr lange warten, da der STM32 doch um einiges langsamer ist als ein moderner Intel-Prozessor. Für eigene Messungen auf dem STM32 empfiehlt sich ein Startwert von 10000, also eine Größenordnung geringer.&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Warnungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens foo ist zwar definiert, wird aber nicht aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar definiert, aber nicht verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; set but not used.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wird zwar zwischenzeitlich gesetzt, aber sonst nicht weiter verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;local variable &#039;foo&#039; shadows global variable &#039;foo&#039; defined in line NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die lokale Variable &#039;foo&#039; überdeckt die globale gleichnamige Variable. Dies kann je nach Kontext zu unerwünschten Effekten führen: In der Funktion, wo die lokale Variable definiert wurde, wird dann der Wert dieser lokalen Variablen verwendet, in allen anderen Funktionen jedoch der Wert der globalen Variablen.&lt;br /&gt;
&lt;br /&gt;
=== Compiler-Fehlermeldungen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with a value, in function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte void-Funktion liefert unzulässigerweise einen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;return with no value, in function returning non-void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die definierte Funktion mit Datentyp als Rückgabewert liefert unzulässigerweise keinen Return-Wert zurück.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;keyword &#039;foo&#039; unexpected.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort &#039;foo&#039; ist an der angegebenen Stelle unerwartet und damit falsch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;break stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Break-Befehl unterbrochen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;continue stack overflow.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Schachtelungstiefe von Schleifen ist zu tief und somit kann die aktuelle Schleife nicht mehr durch einen Continue-Befehl am Anfang der Schleife fortgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;double negation not allowed.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine doppelte Negation eines numerischen Wertes ist nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;empty expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der erwartete arithmetische Ausdruck ist leer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;invalid argument type &#039;foo&#039; in function &#039;bar&#039;, argument #NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der angegebene Parameter an NN-ter Stelle hat einen ungültigen Datentyp.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;main must be defined as function returning void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die main-Funktion muss stets vom Datentyp void definiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no main function found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein NIC-Programm muss immer eine main-Funktion als Startpunkt enthalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Funktion namens &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; returns void.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, den Rückgabewert einer Funktion &#039;foo&#039; weiterzuverwenden, obwohl der Datentyp dieser Funktion &#039;void&#039; ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;function &#039;foo&#039; undefined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die aufgerufene Funktion &#039;foo&#039; ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;unterminated string.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebene Zeichenkette wurde nicht mit dem Anführungszeichen terminiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing &#039;endfoo&#039; at end of file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein geöffneter Kontrollblock wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurden keine Parameter für die Funktion foo angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing closing bracket.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine geöffnete Klammer wurde nicht geschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no matching &#039;)&#039; found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu einer geschlossenen Klammer wurde die dazugehörende geöffnete Klammer nicht gefunden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;missing return before &#039;endfunction&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Return-Statement unmittelbar vor dem Ende der Funktion fehlt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;no compare operator found.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wurde kein Vergleichsoperator im Ausdruck angegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;number of arguments wrong for call of function &#039;foo&#039;, expected NN.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Parameter für den Aufruf der Funktion &#039;foo&#039; ist falsch, richtig ist NN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;syntax error. Use brackets around negative expression.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein Ausdruck mit einem negativen Operanden (wie z.B. &amp;quot;3 * -2&amp;quot;) bedeutet einen Syntax-Error. In diesem Fall muss der zu negierende Operand geklammert werden, also: &amp;quot;3 * (-2)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many arguments for function &#039;foo&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu viele Parameter für den Aufruf der Funktion namens &#039;foo&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many closing brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geschlossene Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many open brackets.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck enthält zu viele geöffnete Klammern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;too many expressions.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck ist zu komplex.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; already defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde bereits definiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;variable &#039;foo&#039; not defined.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Variable &#039;foo&#039; wurde vorher nicht definiert.&lt;/div&gt;</summary>
		<author><name>Klause</name></author>
	</entry>
</feed>