N76E003 Oszilloskop
Der
Controller hat ein internes "externes RAM" mit einer Größe von 768 Byte
also 3/4 kB (Additional 768 Bytes on-chip auxiliary RAM (XRAM) accessed
by MOVX instruction). Der originale 8051 hatte intern nur 256 Byte, die
er mit den SFR-Bytes teilen musste. Außen wurde aber über den
parallelen Datenbus ein RAM mit z.B. 32 KB angeschlossen. Am selben
Datenbus hing auch das externe ROM für die Firmware. Weil man bei
modernen Mikrocontrollern gern auf den externen Datenbus verzichtet,
ist jetzt das Flash-ROM intern, und auch das externe RAM, wenn auch in
bescheidener Größe. Aber besser als nichts, es reicht schon für ein
einfaches Oszilloskop. Das Bild oben zeigt ein Signal mit 10 kHz. Die
Messdauer beträgt ca. 2,5 ms für 500 Messpunkte. Die Abtastrate beträgt
damit 200 kHz.
Zur Ausgabe sollte der Serielle Plotter aus der Arduino-IDE verwendet
werden, der eine X-Basis von 500 Punkten hat. Damit alles reinpasst,
wurden genau 500 Byte gespeichert, wobei der AD-Wandler nur mit einer
Auflösung von 8 Bit verwendet wird. Dazu muss man nur das Highbyte des
Messergebnisses in ADCRH auslesen. Das Programm verwendet den Eingang
ADC0 am Anschluss P17. Damit dieser Pin ein hochohmiger Eingang wird,
muss das entsprechende Bit in P1M1 gesetzt werden.
#include <N76E003.h>
#include <stdio.h>
void InitUART0_Timer1(long Baudrate);
char getchar(void);
void putchar(char);
void delay(void);
void main(void)
{
int n;
int i;
__xdata unsigned char dat[500];
P0M1=0;P0M2=0;P1M1=0x80;P1M2=0;
InitUART0_Timer1(9600);
ADCCON1=1; //ADC on
n=0;
for(i=0;i<500;i++)
{
ADCCON0 = 0; //ADC0 = P17
ADCS = 1;
while(ADCF == 0);
dat[i] =ADCRH;
}
for(i=0;i<500;i++)
{
printf ("\n %d", dat[i]);
}
while(1);
}
void InitUART0_Timer1(long Baudrate) //T1M = 1, SMOD = 1
{
SCON = 0x50; //UART0 Mode1,REN=1,TI=1
TMOD |= 0x20; //Timer1 Mode1
PCON |= 128; //SMOD = 1 UART0 Double Rate Enable
CKCON |=16; //set_T1M
T3CON &= ~64; //BRCK = 0 Serial port 0 baud rate clock source = Timer1
TH1 = 256 - (1000000/Baudrate+1); /*16 MHz */
TR1 = 1;
TI = 1; //For printf
}
char getchar(void)
{
char c;
while (!RI);
c = SBUF;
RI = 0;
return (c);
}
void putchar(char c)
{
while (!TI);
TI = 0;
SBUF = c;
}
void delay(void)
{
int i,j;
for(i=0;i<0xff;i++)
for(j=0;j<0xff;j++);
}
Das
Programm endet mit einer Endlosschleife. Die Messung und die serielle
Ausgabe werden also nur einmal ausgeführt. Für jede Messung drückt man
einmal auf den Reset-Knopf der Platine und startet das Programm damit
neu.
Externe Programmierung
Das Oszilloskop soll nun
auf dem Testboard laufen. Die Zeit ist reif, das Starterkit in zwei
Teile zu brechen, damit es als separates Programmiergerät vom Typ
Nu-Link-Me verwendet werden kann. Hier wurden Pfostenstecker eingebaut,
in das Testboard Pfostenbuchen. Zum Programmieren kann nun das
Testboard einfach umgekehrt auf den Programmierer gesteckt werden.
USB/Seriell-Schnittstelle
Jetzt taucht das nächste Problem auf. Das Testboard hat zwar einen
Mini-USB-Anschluss, Er wird aber nur für die Spannungsversorgung
verwendet. Jetzt könnte ich nach alter Väter Sitte das TX-Signal mit
einem Transistor invertieren und auf eine normale RS232 schicken. Oder
ich verwende einen FT232-Adapter als Schnittstelle. Statt dessen habe
ich die Platine des Lernpakets Mikrocontroller als USB-Adapter
verwendet. Der Controller wurde von dort aus mit 5 V versorgt. Ob das
den 3,3V-Spannungsregler auf der Testplatine ärgert, habe ich vorher
mit meinem Labornetzteil getestet. Nicht die feine Art, aber man kann
das machen.
Die Daten erscheinen nun an COM4. Bei offenem Eingang P17 pendelt sich
die analoge Spannungen auf einen Wert von 64, also ein Viertel der
Betriebsspannung ein.
Wenn man sich das auf dem Seriellen Plotter anschaut, erkennt man, wie
die Kapazität des Eingangs im Verlauf von ca. 200 Messungen bis auf den
Endwert entladen ist. Daraus lässt sich abschätzen, wie wenig Ladung
eine einzelne Messung braucht. Nach dem ersten groben Eindruck, ist der
AD-Wandler ähnlich gut wie der in AVR-Controllern.
Am Ende habe ich noch einen USB-Seriell-Wandler CH340C eingebaut (siehe
Labortagebuch USB/Seriell-Wandler
CH340C). Der
Chip benötigt keinen Quarz mehr. Man braucht nur zwei zusätzliche
Bypass-Kondensatoren. Er konnte deshalb auf dem Rücken liegend mit ein
paar Drähtchen passend angeschlossen werden.