Ein Picobasic-Speicheroszilloskop
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Das Programm Scope2.pbas besitzt eine schnelle Messschleife, in
der die gemessenen Daten im Datenarray gespeichert werden. So wird die
höchste mögliche Abtastfrequenz erreicht. Danach folgt die
Print-Ausgabe der Messwerte in einer zweiten Schleife. Wenn man den
Seriellen Plotter der Arduino-IDE verwenden will, muss man bedenken,
dass die Breite der Anzeige genau für 500 Messwerte vorgesehen ist. Das
Datenfeld in PicoBasic hat jedoch nur eine Länge von 256. Hier werden
deshalb jeweils genau 250 Daten erfasst und gesendet, wozu die
C-Schleife mit C=249 gestartet werden muss. Der Bildschirm wird auf
diese Weise aufgeteilt und zeigt jeweils zwei Oszillogramme. Hier wurde
das eigene PWM-Signal gemessen, das beim Tinc3216 eine Freqeunz von 1,2
kHz hat. Die Abtastrate beträgtz etwa 25 kHz.
REM Scope2
0x107F PWM1 = 127
L1:
0x03F9 C = 249
0x0200 B = 0
L2:
0x3C00 A = AD0
0x3B00 [B+] = A
0x2503 C*Goto L2:
0x03F9 C = 249
0x0200 B = 0
L3:
0x3A00 A = [B+]
0x4200 Print A
0x2508 C*Goto L3:
0x1A01 Delay s = 1
0x2001 Goto L1:
In einer zweiten Version, diesmal mit dem Rpi Pico, wurde das Programm
so verändert, dass 500 Messwerte ausgegeben werden. Da der
PicoBasic-Datenspeicher nur 256 Bytes fasst, wird jedes zweite Byte bei
der Ausgabe gemittelt. Bei der Aufnahme wird jeder Messwert durch
Rechtsschieben durch zwei geteilt, sodass effektiv nur mit einer
Auflösung von 7 Bit gemessen wird. Beim Abspielen vereinfacht das
die Mittelwertbildung. Es müssen nur das aktuelle und das folgende
Messergebnis addiert werden. Der erste Wert wird dagegen durch
Linksschieben verdoppelt.
Eine kleine Schwierigkeit ist bei diesem Projekt, dass B sowohl als
Adresszeiger für das Datenarray als auch für die Addition von
Messwerten benötigt wird. Am Ende der Ausgabeschleife wird die nächste
B-Adresse deshalb aus dem Zählerstand im Schleifenzähler C
rekonstruiert.
REM Scope3
0x117F PWM2 = 127
L1:
0x03FA C = 250
0x0200 B = 0
L2:
0x3C00 A = AD0
0x3200 A = A Shr 1
0x3B00 [B+] = A
0x2503 C*Goto L2:
0x03F9 C = 249
0x0200 B = 0
L3:
0x3A00 A = [B+]
0x3100 A = A Shl 1
0x4200 Print A
0x3200 A = A Shr 1
0x3800 D = A
0x3A00 A = [B+]
0x3400 B = A
0x3900 A = D
0x2A00 A = A + B
0x4200 Print A
0x3700 A = C
0x3400 B = A
0x01FA A = 250
0x2B00 A = A - B
0x3400 B = A
0x2509 C*Goto L3:
0x1A01 Delay s = 1
0x2000 Goto L1:
Die PWM-Frequenz beträgt hier genau 1 kHz Das
Signal wurde mit einem RC-Filter zu einem Sägezahn. Es werden genau
fünf Schwingungen aufgenommen, d.h. die gesamte Abtastzeit
beträgt 5 ms. Bei 500 Abtastpunkten bedeutet das eine Abtastrate
von 100 kHz, wobei tatsächlich nur mit 50 kHz gemessen wird und jeder
Zwischenwert durch die Mittelung entsteht.
Das Beispiel
zeigt, dass PicoBasic in Sachen Echtzeitfähigkeit sich nicht von anderen
Programmiersprachen verstecken muss. Man sieht aber auch, dass es meist um sehr
kurze und überschaubare Programme geht. Da wo eine kleine Aufgabe mit wenig
Aufwand gelöst werden soll, ist PicoBasic eine ernsthafte Alternative.
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic