PicoBasic für den Arduino Nano
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
(Aktuell 10.3.25: Am 6.3.23 zeigte Windows 10 plötzlich eine Virenwarnung
des Defender für das exe-Programm. Bis dahin lief es noch problemlos. Ich gehe
von einem Fehlalarm aus. Deshalb habe ich unter „Windows-Sicherheit" das
entsprechende Verzeichnis von der Überprüfung ausgeschlossen. Das Problem war
anscheinend das im Programm enthaltene Foto, das wohl zufällig eine scheinbar
böse Bitfolge enthielt. Und weil der Virenscanner nachtragend ist, musste ich
außerdem noch den Namen der Anwendung ändern. Sie heißt jetzt
TestLab23Nano.exe. Inzwischen habe ich das Bild ganz herausgenommen (kompiliert
am 8.3.23). Der Defender ist jetzt zufrieden, aber ich habe eine
Rückmeldung bekommen, dass Avira immer noch warnt. Inzwischen habe ich
mit Virustotal alle Versionen von PicoBasic getestet und habe den
Eindruck, dass einige Scanner etwas gegen VB6 haben. Das bedeutet aber
nicht, dass eine tatsächliche Gefahr von den Programmen ausgeht.)
Das PicoBasic wurde auf den Arduino Nano
portiert. Auf den ersten Blick sieht alles gleich aus, und man kann
alle bisherigen Programme damit laden und ausführen. Einen wichtigen
Unterschied gibt es aber doch. Der ATmega328 hat keine
Pulldown-Widerstände. Pullups hat er, aber kein eigenes Register dafür
wie der Pico oder der Tiny3216. Um die Pullups einzuschalten, muss man
die Datenrichtung Lesen einschalten und die Pots auf 1 setzen. Das
bedeutet, dass man das Programm Pullblink.pbas zwar starten kann, aber
es passiert nichts, weil die Befehle Pullup und Pulldown nicht
ausgeführt werden können. Um nicht alle Befehlstasten zu verschieben,
wurden zwei neue Befehle hinzugefügt Pdir = NOT Zahl und Pout = NOT
Zahl. Beide sind nicht lebensnotwendig, denn man könnte ja statt Pdir =
NOT 255 auch Pdir = 0 schreiben. Aber hier und da kann es die Arbeit
erleichtern, weil man den Parameter nicht neu eingeben muss.
REM Pullblink Pico
0x0900 Pdir = 0
L1:
0x0AFF Pullup = 255
0x19FA Delay ms = 250
0x0BFF Pulldown = 255
0x19FA Delay ms = 250
0x2001 Goto L1:
Das Programm sollte am Pico die LEDs über die Pullup-Widerstände
betrieben und mit geringer Helligkeit blinken lassen. Das geht auch mit
dem Nano, aber man muss es etwas anders programmieren.
REM Pullblink Nano
0x0900 Pdir = 0
L1:
0x08FF Pout = 255
0x19FA Delay ms = 250
0x0800 Pout = NOT 255
0x19FA Delay ms = 250
0x2001 Goto L1:
Weil alle Ports als Eingänge geschaltet wurden, schaltet der
Pout-Befehl jetzt die Pullups ein. Beim Abschalten wurde Pout = NOT 255
geschrieben. Wenn man genau hinsieht, erkennt man, dass hier
tatsächlich kein neuer Befehl zum Einsatz kommt, sondern das Token 08
verwendet wird, genau wie zwei Zeilen höher für den Port-Befehl. Es
wird also tatsächlich nur die eingegebene Konstante invertiert.
Es blinkt und blinkt und blinkt mit reduzierter Helligkeit. Die acht
LEDs stehen aufgereiht an den Ausgängen D2 bis D9. Links daneben gibt
es die beiden PWM-Ausgänge an D10 und D11. Die analogen Eingänge findet
man an A0 bis A2. Alles ist also leicht zu finden. Auch die
GND-Verbindungen zu den Versorgungsschienen der Steckplatine haben
ihren kurzen Weg zu den GND-Schlüssen der Nano-Platine. Die
Masseleitung zu den LEDs habe ich nicht direkt angeschlossen, sondern
einen Widerstand von 1 k eingesetzt, weil ich manchmal von den LEDs
geblendet wurde,
Die Firmware wurde wieder mit der Arduino-IDE entwickelt, was die
Portierung sehr erleichtert hat. Allerdings wurde auch hier auf
maximale Geschwindigkeit geachtet und vieles in nativem C ohne die
Arduino-Besonderheiten umgesetzt. Interessant ist daher, welche
Geschwindigkeiten am Ende erreicht werden.
REM Speed
0x09FF Pdir = 255
L1:
0x08FF Pout = 255
0x0800 Pout = 0
0x2001 Goto L1:
Mit dieser schnellen Schleife wurden an den Ausgänge Rechtecksignale mit 54,8 kHz erreicht (beim Pico 70 kHz).
REM Speed2
0x09FF Pdir = 255
L1:
0x08FF Pout = 255
0x4A00 Nop
0x0800 Pout = 0
0x2001 Goto L1:
REM Rechteck 50%
Eine symmetrisches Rechtecksignal erreichte 41,9 kHz (Pico 52,2 kHz).
0x017B A = 123
0x09FF Pdir = 255
L1:
0x08FF Pout = 255
0x4200 Print A
0x0800 Pout = 0
0x2002 Goto L1:
Wenn man statt Nop andere Befehle einfügt, kann man auch deren
Ausführungszeit messen. Hier wurde Print A getestet, wobei eine
dreistellige Zahl ausgegeben wird. Die serielle Schnittstelle läuft mit
1 MBaud. Das Ausgangssignal erreicht noch 16,4 kHz.
REM Speed3
0x09FF Pdir = 255
L1:
0x1901 Delay ms = 1
0x08FF Pout = 255
0x1901 Delay ms = 1
0x0800 Pout = 0
0x2001 Goto L1:
REM 500 Hz
Wenn man Delay ms verwendet, spielen die Ausführungszeiten der
einzelnen Zeilen keine Rolle mehr, weil immer bis zur nächsten
Millisekunde gewartet wird, Hier wurden 499,8 Hz gemessen. die
Abweichung von 0,04% kommt daher, dass der Pico keinen Quarz hat,
sondern einen Keramikresonator verwendet.
Nun kann man also alle bisher entwickelten PicoBasic-Programme auch auf
dem Nano testen. Und es sollte ohne Änderungen möglich sein, auch den
Arduino Uno zu verwenden, was ich allerdings noch nicht probiert habe,
weil ich das Steckboard nicht missen möchte. Ich verwende den roten
Nano-Clone von Franzis mit seiner USB C Buchse und der zusätzlichen LED
an D12. Die beiden Ports D12 und D13 werden von PicoBasic nicht
verwendet, sind aber mit LEDs auf der Platine ausgerüstet. Damit kann
ich diese beiden an irgendwelche Ports oder PWM-Ausgänge verbinden und
die Onboard-LEDs nutzen.
Hier habe ich mein bisher längstes Programm getestet, die Ansteuerung
des Charlieplexing-Displays. Es lief auf Anhieb ohne jede Änderung.
Ist jemand die neue Versionsnummer 2.3 aufgefallen? Sie betrifft eine
wesentliche Erweiterung der Firmware, die es ermöglicht, neue
Funktionen einzubauen. Einige sind schon enthalten. Dazu später mehr.
Wer sich den Quelltext genauer ansieht, wird jetzt schon erkennen, was
damit möglich wird.
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic