PicoBasic 2.2 für den Tiny3216
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Das PicoBasic für den Tiny3216 wurde noch einmal
überarbeitet, auf den neusten Stand gebracht und um das TestLab
erweitert. Die entscheidenden Änderungen betreffen die
Ausführungsgeschwindigkeit. Die Übertragungsrate wurde auf 1 MBaud
erhöht. Alle wesentlichen Hardwarezugriffe laufen nicht mehr über die
Arduino-Funktionen, sondern über natives C. Dadurch entfallen
Hintergrundprozesse und die dabei nötigen kurze Unterbrechungen durch
Interrupt-Funktionen. Beim RPi Pico wurde dieses Problem durch den
zweiten Prozessorkern gelöst, hier durch die Vermeidung der Interrupts.
void USART0_init(void){
PORTB.DIRSET = 0x04; //TXD an PB2
PORTA.DIRCLR = 0x08; //RXD an PB3
USART0.BAUD = (uint16_t)USART0_BAUD_RATE(1000000);
USART0.CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
}
...
int main(void){
_PROTECTED_WRITE (CLKCTRL_MCLKCTRLB, 0); // 20 MHz
USART0_init();
...
while(1){
if (USART0.STATUS & USART_RXCIF_bm){
...
if (ch>64 && ch<88){
direkt[ch-65]();
}
}
if(warten>0){weiter = Timer_hi + warten; warten = 0; TCB0.CTRLA=1;}
if (TCB0.INTFLAGS & TCB_CAPT_bm){Timer_hi++;TCB0.INTFLAGS = TCB_CAPT_bm;}
if(Timer_hi >= weiter){
kom = code[adr] >> 8;
dat = code[adr] & 255;
befehl[kom]();
}
if ((PORTB.IN & 2)==0){_PROTECTED_WRITE (WDT_CTRLA,PERIOD_64CLK_gc);_delay_ms(1000);}// Reset an PB1
}
}
Damit gibt es keine Abfrage millis() mehr, um Zeitabläufe zu steuern.
Dafür wird nun der Timer TBC0 verwendet, der im Millisekundentakt
überläuft und die Zeitvariable Timer_hi erhöht. Bei einem laufenden
Programm werden für jede Zeile diese Schritte durchlaufen:
• Abfrage, ob vom USART ein Byte empfangen wurde
• Abfrage, ob gerade eine Wartezeit in Millisekunden gestartet wurde
• Abfrage, ob ein Timer-Überlauf erkannt wurde
• Abfrage, ob eine Wartezeit abgelaufen ist
• Lesen des Basic-Tokens und des Parameters aus dem Speicher
• Aufruf der Befehls-Funktion
• Abfrage der PicoBasic-Reset-Taste
Zum Test wurde das Programm Speed2.pbas verwendet, das ein
symmetrisches Rechtecksignal erzeugt. Mit dem Pico wurde damit eine
Frequenz von 52.2 kHz erreicht. Der Tiny3216 schafft nun 38,7 kHz.
Gegenüber der ursprünglichen Version sind vor allem solche Programme
wesentlich schneller, die eine serielle Ausgabe verwenden. Zusammen mit
dem Senden einer dreistelligen Zahl werden noch 19,3 kHz erreicht.
REM Speed
0x017B A = 123
0x09FF Pdir = 255
L1:
0x08FF Pout = 255
0x4200 Print A
0x0800 Pout = 0
0x2002 Goto L1:
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic