Mit
dem Update auf die Version 1.1 gibt es drei Neuerungen, die auf der
Anwenderseite realisiert wurden. Die Firmware wurde ebenfalls überarbeitet. Der
Interpreter läuft jetzt im zweiten Kern des Pico und verwendet ein
Funktionsarray für die Aufrufe der einzelnen Befehle. Damit wurde eine höhere
Geschwindigkeit erreicht. Gleichzeitig laufen die Programme glatter, weil
Zeitmessung und USB keine Unterbrechungen im zweiten Kern verursachen. Das neue
Anwenderprogramm läuft zwar auch mit der bisherigen Firmware, aber ein Update
auf die neue Firmware lohnt sich.
1. Das Terminal
Bisher gab es in PicoBasic zwar schon die Befehle Print A und Input A,
aber man musste ein externes Terminal bemühen, um sie zu nutzen. Mit
der Version 1.1 ist ein eigenes Terminal hinzugekommen. Das untere
horizontale Textfenster hat in der ersten Version nur die
Datenübertragung beim Programm-Upload gezeigt. Das ist auch jetzt noch
so, aber mit einem Klick ins Fenster wird daraus ein spezielles
Terminal. Man kann Zahlen eingeben und mit Return absenden und auch
Zahlenwerte empfangen. Das Fenster wird automatisch für eine neue Eingabe
gelöscht, wenn länger als eine Sekunde keine neuen Daten mehr kommen.
Achtung, wer in einem
Programm Print A verwendet hat und sich dann wundert, dass keine
Ausgabe erscheint, der hat vergessen, in das Terminalfenster zu
klicken. Das wurde so gemacht, damit man auch weiterhin mit externen
Terminals arbeiten kann. Ohne den Klick ist die COM nach einem Upload
freigegeben und kann von anderer Software wie einem Terminal oder einem
Plotter benutzt werden.
2. Zahleneingaben
Ab jetzt kann man Zahlen wahlweise dezimal, binär oder hexadezimal
eingeben. Das betrifft alle Textfenster zur Eingabe von Konstanten und
auch die Eingaben im Terminal. Im Bild oben sieht man, dass H0F
eingeben wurde. Jede Eingabe wird vom Mikrocontroller grundsätzlich mit
einem Echo in Form einer Dezimalzahl beantwortet. Die Hexadezimalzahl
H0F wird hier zur Dezimalzahl 15. Entsprechend werden die vier
unteren LEDs eingeschaltet.
Dezimalzahlen dürfen maximal drei Stellen haben. Die Eingabe 999 ist
erlaubt, wird aber auf acht Bit abschnitten und erscheint als 231. Die
Zahl 256 wird auf diese Weise zu 0.
Binärzahlen müssen mindestens vier Stellen haben, damit sie eindeutig
von Dezimalzahlen unterschieden werden können. 111 wäre noch eine
Dezimalzahl, also muss man 0111 oder auch 00000111 schreiben. Das Echo
lautet dann 7.
Hexadezimalzahlen beginnen mit einem H. Es ist Groß- oder
Kleinschreibung möglich. H0F oder h0f sind gleichwertig und werden als
dezimal 15 gelesen. H15 entspricht dagegen 21.
3. Label-Nummern
Wie bisher wird mit jedem neuen Label eine neue Nummer vergeben, Neu
ist, dass nun mit jedem neuen Label beide betreffenden Fenster die neue
Nummer erhalten. Wenn man ein weiter zurückliegendes Label anspringen
möchte, muss man die Zahl manuell ändern.
Das Programm Dmal.pbas zur Untersuchung einer Zählschleife
verwendet zwei Labels. Nun ist für den Befehl Dmal GotoL2: keine
Änderung der Label-Nummer mehr nötig. Allerdings muss die letzte Zeile,
Goto L1: in das zugehörige Fenster die 1 eingeben werden. Achtung, Wenn
ein Programm mit einem neuen Label erweitert werden soll, muss
man zuerst die letzte vergebene Labelnummer eintragen, damit das
neue Label die folgende Nummer erhält.
Im Terminal Fenster sieht man, dass 20 eingegeben wurde. In der zweiten
Zeile kommt zuerst das Echo 20 und dann die absteigende Zahlenfolge von
20 bis 0. Es hab also tatsächlich 21 Durchläufe, weil Dmal L2: nach
vorn springt.
Das Programm Scope.pbas wurde für die Verwendung mit dem Seriellen
Plotter der Arduino-IDE geschrieben. Nach dem Hochladen darf man
deshalb nicht ins Terminalfenster kicken, denn damit wäre die COM
belegt.
Das Programm führt laufend analoge Messungen aus, die an den PC
gesendet werden. Die Wartezeit von 21 ms führt zu einer Unterabtastung
eines 50-Hz-Signals. Das folgende Ergebnis mit dem Arduino-Plotter zeigt
die in ein offenes Messkabel auf dem Labortisch eingestreuten
50-Hz-Signale. Im mittleren Bereich sieht man zusätzliche Störungen,
die durch Änderungen statische Felder entstanden sind, weil sich eine
Person in der Nähe auf dem Boden bewegt hat.
Veränderte Firmware V1.1
Der Interpreter läuft jetzt zweiten Kern des Pico. Für jeden Befehl
gibt es diesmal eine eigene Funktion. Die Funktionen sind so klein,
dass ich sie zur besseren Übersicht in jeweils eine Zeile geschrieben
habe. Die Funktionen heißen k1, k2, k3 usw., damit sie übersichtlich in
ein ein Array von Funktionszeigern gepackt werden können. Die die neu hinzugekommene
Funktionen np() steht für no operation bzw. nop.
void setup1() {
gpio_init_mask (mask);
//gpio_set_dir_masked (mask, 255);
gpio_put_masked (mask, 0);
}
void k1(){a = dat;adr++;}
void k2(){b = dat;adr++;}
void k3(){c = dat;adr++;}
void k4(){d = dat;adr++;}
void np(){adr++;}
void k8(){gpio_put_masked (mask, dat);adr++;} //Pout dat
void k9(){gpio_set_dir_masked (mask, dat);adr++;} //Pdir dat
void k10(){for(int j=0; j<8; j++){gpio_set_pulls(j,1 &(dat>>j), 0);}adr++;} //Pullup dat
void k11(){for(int j=0; j<8; j++){gpio_set_pulls(j, 0,1 &(dat>>j));}adr++;} //Ppulldown dat
In der Hauptschleife des zweiten Prozessorkerns steht das Array der
Funktionszeiger. Hier sind alle Funktionen hintereinander geschrieben,
sodass sie später mit befehl[kom]() aufgerufen werden können. Das
bringt eine erhebliche Zeitersparnis gegenüber der ersten Version.
void loop1(){
void (*befehl[76])() = {
np, k1, k2, k3, k4, np, np, np,
k8, k9, k10, k11, np, np, np, np,
k16, k17, k18, k19, np, np, np, np,
k24, k25, k26, k27, np, np, np, np,
k32, k33, k34, k35, k36, k37, k38, np,
k40, k41, k42, k43, k44, k45, k46, k47,
k48, k49, k50, k51, k52, k53, k54, k55,
k56, k57, k58, k59, k60, k61, k62, k63,
k64, k65, k66, k67, k68, k69, np, np,
k72, k73, np};
...
...
kom = code[adr] >> 8;
dat = code[adr] & 255;
befehl[kom]();