N76E003 Oszilloskop        


Elektronik-Labor  Projekte   


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.






Elektronik-Labor  Projekte