hallo ; ich versuche einen sinus signal(0v........5v )mit den frequenzen (100hz..................bis 5khz ) abzutasten mit dem mikrocontroller und die abgetasteten werte in RAM zu speichern und spaeter alle werte zu lesen ... leider bekomme ich mit dem programm immer noch keine daten und ich weiss nicht wo der fehler legt .... ich will zb 4000 abtastwerte lesen in hyperterminal ... (der ad wandler von meinem mikrocontroller hat 8 bit auflösung ) vielen danke für ihre antwort ------------------------------------------------------------ #include<reg517.h> #include<stdio.h> xdata unsigned char buf[4000]; int i; sfr S0RELL=0xAA; sfr S0RELH=0xBA; sfr ausgang=0xE8; bit flag =0; unsigned int i; int AD_Erg=0; void init_io(void); void main (void) { init_io(); ADM= 0x00; ADEX = 0; ADCON0 &= 0x80; ADCON1 = 0x00; // kanal AN0 , bei mir p7.0 DAPR=0x00; TF1=0; // Überlauf-flag vorsichthalber löschen TMOD=0x10; // reloadbetrieb durch überlauf ,timer 2 EIN TL1= 0xff; // timming von mikrokontroller 50 us timer TH1=0xce; //Interrupt hauptschalter EIN ET1=1; //timer 1 interrupt EAL=1; TR1=1; while (1) { // if (flag==1) // { // printf("Ad_Wert=%d\n", buf[i]); //flag=0; //} } } void init_io(void) // initialiserung der serille schnitstelle S0 { S0RELL=0xEC ; //Reloadwert=1024- (Fosz/(32*Baudrate)) baudrate 19200 S0RELH=0x3; S0CON= 0x52; // Mode 1 PCON |= 0x80; //SMOD =1 BD=1; // Internbaudrate generator } void timer1(void) interrupt 3 // Interruptserviceroutine { DAPR = 0x00; // A-D-Wandler starten while(BSY); // warten auf Wandlung komplett buf[i] = ADDAT; i=i+1; if(i==4000) { for(i=0;i<=4000;i++) printf("Ad_Wert=%d\n", buf[i]); } ET1=0; TR1=1; // TF1-Bit löschen flag=1; } } }
Ich hab mal schnell über das Programm drübergelesen und das einzige was mir Sorgen macht sind die 4000 Messwerte... Du benutzt den SAB80C537 sehe ich das richtig?
die init für den AD-Wandler kannst du auch in eine eigene Funktion packen... mit welchem compiler arbeitest du? hast du die möglichkeit zu debuggen?! woher kommen die printf?! das hab ich beim µC ja noch nie gesehen... ebenfalls die stdio.h! Du musst die Daten der AD Wandlung in einen Sende FIFO für die UART schreiben...
Wo wird die Variable i zu 0 initialisiert? Ich bin mir gerade nicht ganz sicher, ob Variablen im Global Name Space durch den Compiler initialisiert werden, aber besser einmal zuviel initialisieren, als einmal zu wenig! Meckert der Compiler nicht über die doppelte Definition von i? Teste Dein printf mal separat mit festen Strings, um die Strecke UART-RS232-PC-Terminal zu sichern. Nebenbei, um Code zu posten gibt es eine spezielle Formatierung, da wird dann auch nicht umgebrochen. Edit: Nochwas, die Abtastfrequenz muss mindestens doppelt so hoch sein, wie die höchste zu messende Frequenz, das ist klar?
danke erstes mal . also die variable i wird oben global und sie ist zwischen 0 und 255 weil ich einen ad -wandler 8 bit ... der compiler meldet gar keine fehlern aber ich bekomme keine daten über serielle schnitstelle rs232.... vielleicht hat zu tun mit printf ....?
Hafid Zaifri wrote: > danke erstes mal . > also die variable i wird oben global und sie ist > zwischen 0 und 255 weil ich einen ad -wandler 8 bit ... > der compiler meldet gar keine fehlern aber ich bekomme keine > daten über serielle schnitstelle rs232.... > > vielleicht hat zu tun mit printf ....? Hä? Du verwendest i als Zählvariable, bis 4000... muss ich Dir Deinen eigenen Code erklären? Ich sehe nirgendwo eine explizite Initialisierung von i. Das printf wie gesagt separat testen, mach das zuerst.
unsigned int i = 0; Besser aber, erstmal ein gutes Buch über die Programmiersprache C zu kaufen, zu lesen, und zu verstehen... dann sehen wir weiter. Ich mache im Netz grundsätzlich nur Hilfe zur Selbsthilfe. Nachhilfe nur gegen Vorkasse.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.