PicoBasic 2.3 für den Tiny3216                           

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




Download: PicoBasicTiny23.zip

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