PicoBasic für den Arduino Nano                           

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




Download: PicoBasicNano23.zip

(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