PicoBasic 2.3 für den Tiny3216
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Die Firmware für den Tiny3216 enthält
inzwischen auch die Möglichkeit der Funktionserweiterungen. Die
Zweikanal-Ausgabefunktion im Testlab erfordert 2 Mal 500 Messpunkte.
Das war bisher nur mit einer direkten Messung und sofortiger
Datenübertragung ohne Zwischenspeicherung möglich, weil das Datenarray
in PicoBasic nur bis 255 adressiert werden kann. Mit der
Funktionserweiterung ist diese Grenze jedoch überwindbar. Dazu wird ein
zweites Array mit doppelter Größe gebildet. Es wird mit jeweils 256
Bytes aus zwei Messkanälen gefüllt. Auch die Printausgabe muss
hierhin verlegt werden, weil nach der Messung insgesamt 500
gespeicherte Bytes an die Ausgabe gesendet werden müssen.
uint8_t ram2[512];
if (dat==243){ //Zweikanal Scope
for (uint16_t n=0;n<256;n++){
ram2[n*2] =adc(4); ram2[n*2+1]=adc(7);}
for (uint16_t n=0;n<500;n++){USART0_printByte(ram2[n]);}
}
Das eigentliche PicoBasic-Programm ist nun sehr kurz, weil alles im
Unterprogramm L243 abläuft. Zusätzlich gibt es eine Endlosschleife und
eine Wartezeit von einer Sekunde, damit man leichter vollständige
Messungen plotten kann. Das Programm läuft ohne Änderungen auch
auf dem Arduino Nano.
REM Scope5
L1:
0x21F3 Gosub L243:
REM Zweikanal
0x1A01 Delay s = 1
0x2000 Goto L1:
Für eine Beispielmessung wurde ein PWM-Signal mit 1,2 kHz und kurzen
Impulsen ausgegeben. Das Signal wurde mit einem zweifachen
Tiefpassfilter mit jeweils 10 kΩ und 22 nF gefiltert und mit den beiden
Messkanälen nach der ersten und der zweiten Stufe gemessen. Das
Ergebnis zeigt die Messung mit einem Messbereich von 2,5 V und einer
Abtastrate von ca. 70 kHz. Beim Nano wurde eine Abtastrate von 63 kHz
erreicht.
DDS-Signalgenerator und Oszilloskop
Unter dem Label 245 erreicht man einen schnellen DDS-Signalgenerator
mit einem gleichzeitig laufenden Oszilloskop. Die schnelle Ausgabe- und
Messschleife wird insgesamt fünfmal durchlaufen, damit eine
externe Schaltung genügend Zeit hat, um einzuschwingen.
if (dat==245){ //DDS + Scope
uint8_t akku = 0;
for (uint8_t m=0;m<5;m++){
for (uint16_t n=0;n<512;n++){
DAC0.DATA = ram[akku]; akku += a;
ram2[n]=adc(4);
}
}
for (uint16_t n=0;n<500;n++){USART0_printByte(ram2[n]);}
}
Die Signalform liegt als Tabelle im 256 Byte großen ram[]. Die
Messergebnisse gelangen in das 512 Byte große ram2[].
Entsprechend muss auch hier wieder die Ausgabeschleife in C
geschrieben werden. Mit A = 1 erhält man die kleinste Frequenz von 500
Hz. Der Schirm zeigt eine fast volle Schwingung von 250/256. Die
Messdauer beträgt 2 ms für 250 Punkte, also ist die Abtastrate 125 kHz.
REM DDS245
0x0102 A = 1
L1:
0x107F PWM1 = 127
0x1A01 Delay s = 1
0x21F6 Gosub L246:
REM DDS
0x2001 Goto L1:
Mit A = 10 erhält man entsprechend eine Frequenz von 5 kHz. Die
Kurvenform wird in diesem Fall erst im TestLab geladen. Alternativ
könnte man aber auch mit Gosub L244 eine Sinustabelle gleich beim Start
erzeugen. Um die Ausgangsfrequenz einzustellen, kann man A zur Laufzeit
im TestLab ändern. Messungen bis 20 kHz (A = 40) sind mit dem
Tiny3216 möglich. Dank des echten DA-Wandlers braucht man hier kein
spezielles Tiefpassfilter, wie es beim Arduino Nano benötigt wird, um
das PWM-Signal zu glätten.
Beim Arduino Nano war etwas mehr Aufwand nötig, um genau die gleiche
Geschwindigkeit zu erreichen. Der Aufruf der AD-Funktion konnte
eingespart werden, und der AD-Wandler wird hier ausnahmsweise mit dem
doppelten Takt von 2 MHz betreiben.
if (dat==245){ //DDS + Scope 125 kHz
uint8_t akku = 0;
uint8_t t = 0;
adc(0);
ADCSRA = 0xC3; //Start, 2 MHz
for (uint8_t m=0;m<5;m++){
for (uint16_t n=0;n<512;n++){
OCR1BL = ram[akku]; akku += a;
while((ADCSRA & 0x40));
ram2[n]=ADCH;
__asm__("nop\n\t");__asm__("nop\n\t");__asm__("nop\n\t");
ADCSRA = 0xC3; //Start, 2 MHz
}
}
for (uint16_t n=0;n<500;n++){USART_printByte(ram2[n]);}
}
Ein Sweep-Generator
Der Generator unter dem Label 246 ähnelt dem bisherigen DDS-Generator
mit dem Unterschied, dass diesmal die Frequenz mit a laufend erhöht
wird. Die Messzeit wurde so eingestellt, dass diesmal 5 ms auf den
Schirm mit seiner Breite von 250 Punkten passen. Die Abtastrate ist 50
kHz. Eine volle Schwingung hätte gerade 200 Hz. In dieser Zeit erhöht
sich a um 250/16, also abgerundet 15. Die Frequenz erhöht sich also in
dieser Zeit um 15 * 0,2 kHz = 3 kHz. Mit einem Start bei A = 5
überstreicht man den Bereich 1 kHz bis 4 kHz.
if (dat==246){ //Sweep
uint8_t akku = 0;
for (uint16_t n=0;n<512;n++){
DAC0.DATA = ram[akku];
akku = akku +a + (n>>4);
ram2[n]=adc(4);
delayMicroseconds(11);
}
for (uint16_t n=0;n<500;n++){USART0_printByte(ram2[n]);}
}
REM Sweep
0x0102 A = 5
L1:
0x107F PWM1 = 127
0x1A01 Delay s = 1
0x21F6 Gosub L246:
REM Sweep
0x2001 Goto L1:
Mit einem Klick auf Plotter 2 verdoppelt man die dargestellte
Messdauer. Damit wird ein Bereich von 6 kHz, also 1 kHz bis 7 kHz
überstrichen. Hier wurde ein Tiefpassfilter mit 10 kΩ und 22 nF
durchgemessen. Die Kurve erscheint breiter, weil die Daten als
Zweikanalmessung interpretiert werden.
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic