PicoBasic Funktions-Erweiterungen
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Es gibt tausend Gründe, PicoBasic um
weitere Befehle zu erweitern. Andererseits sind für die einfach
gehaltene Oberfläche möglichst wenige Befehle besser. Es wäre also
ungünstig, die direkt sichtbaren Befehle zu vermehren. Der Wunsch nach
Erweiterungen kam zuerst auf, als es im TestLab die Möglichkeit gab,
die PWM-Frequenz und die Spannungsreferenz umzuschalten, dies aber in
PicoBasic nicht möglich war. Die Lösung des Problems liegt nun ab der
Version 2.3 im Befehl Gosub L. Normalerweise steht da z.B. Gosub L2,
wobei ein PicoBasic-Unterprogramm an der Adresse L2 aufgerufen wird.
Wenn man aber eine Label-Nummer ab 240 (F0) angibt, werden ab der
Version 2.3 interne Funktionen ausgeführt, die als Spracherweiterungen
dienen. Im Bild oben sieht man den Aufruf Gosub L244 zur Erzeugung
einer Sinustabelle. Man muss dazu also nicht mehr ins TestLab
umschalten.
Die Funktion extensions(void) wertet die Label-Nummer aus und führt die
zugehörigen Unterfunktionen aus. Mit Gosub L240 (oder headezimal
Gosub LF0) stellt man die PWM-Frequenz ein, wobei ein Parameter 0…4 in
A übergeben werden muss. Ganz ähnlich funktioniert der Aufruf Gosub
L241, mit dem man die Spannungsreferenz in drei Stufen umschalten kann.
void extensions(void){
if
(dat==240){
//PWM Freq
if (a==4) {TCCR2B=1;TCCR1B=1;} //Prescaler 1
if (a==3) {TCCR2B=2;TCCR1B=2;} //Prescaler 8
if (a==2) {TCCR2B=4;TCCR1B=3;} //Prescaler 64
if (a==1) {TCCR2B=6;TCCR1B=4;} //Prescaler 256
if (a==0) {TCCR2B=7;TCCR1B=5;} //Prescaler 1014}
}
if
(dat==241){
//AD Ref
if (a==0) {uref=0xE0;} //Ref 1.1 V
if (a==1) {uref=0x20;} //Ref ext
if (a==2) {uref=0x60;} //Ref 5 V
}
if (dat==242){ //Hispeed Scope
for (n=0;n<256;n++){
ram[n]=adc(0);
}
}
if (dat==243){ //Zweikanal Scope
for (uint16_t n=0;n<256;n++){ram[n*2]=adc(0);ram[n*2+1]=adc(1);}
for (uint16_t n=0;n<512;n++){USART_printByte(ram[n]);}
}
if (dat==244){ //Sinustabelle
for (uint16_t n=0; n<256;n++) {ram[n]=127+127*
sin(3.14159*2*n/256);}
}
…
if (dat==253){}
if (dat==254){}
if (dat==255){}
}
Insgesamt gibt es 16 mögliche Erweiterungen, von denen die meisten noch
frei sind. Die dritte Funktion ist schon gefüllt und bildet eine
schnelle Messschleife für ein Einkanal-Oszilloskop. Zusätzlich gibt es
ein Zweikanal-Oszilloskop und eine Sinustabelle. Man findet noch viele
Dinge, die ein Arduino leisten kann, die aber bisher in PicoBasic nicht
enthalten sind. Dazu gehören die Nutzung externer I2C-Bausteine,
zahlreiche Sensoren, verschiedene Displays und vieles mehr. Mit den
Extensions steht der Weg offen für spezielle Ansteuerungen aller Art.
Das folgende Programm verwendet drei der vorhandenen Extensios, die mit
Gosub aufgerufen werden. Mit A = 3 und Gosub L240 wird die PWM-Frequenz
auf 3,9 kHz geschaltet. A = 7 und Gosub L241schaltet die Referent des
AD-Wandler auf VDD, also den Messbereich auf 5 V. Und Gosub L242
startet eine schnelle Messserie, die Daten von AD0 in das 256 Byte
große Array schreibt.
REM Scope4
0x0103 A = 3
0x2200 If A=B Goto L240:
REM 3.9 kHz
0x1064 PWM1 = 100
0x0107 A = 7
REM Ref VDD
0x21F1 Gosub L241:
L1:
0x04FF D = 255
0x21F2 Gosub L242:
REM Fast Scope
0x04FF D = 255
0x0200 B = 0
L2:
0x3A00 A = [B+]
0x4200 Print A
0x2609 D*Goto L2:
0x1A01 Delay s = 1
0x2005 Goto L 1:
Das Beispiel erzeugt ein PWM-Signal mit 3,9 kHz und ca. 40%
Impulsdauer. Der Messbereich des AD-Wandlers wird auf 5 V gestellt.
Dann wird einmal pro Sekunde eine schnelle Messung gestartet und die
Daten werden mit einer PicoBasic-Ausgabeschleife an den PC
gesandt. Für die Messung wurde ein RC-Filter mit 10 kΩ und 22 nF, also
mit einer Grenzfrequenz von 720 Hz zwischen PWM-Ausgang und AD0
geschaltet. Insgesamt werden 16 Schwingungen in 250 Messpunkten
aufgezeichnet. Die Abtastfrequenz beträgt also 3,9 kHz * 250 / 16 = 61
kHz. Damit wird eine wesentlich höhere Abtastrate erreicht als mit
einem reinen PicoBasic-Programm.
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic