Re: Pulsmessung Kategorie: Programmierung C (von Josef - 9.08.2009 11:46) | ||
Als Antwort auf Pulsmessung von Josef - 8.08.2009 23:05 | ||
| ||
> Hallo, > bin ein neuling bei der ccontrol pro, > > habe nach dem Puls und Periodenmessdemoprogramm einen UTI Baustein am den IC von Timer3 gehängt. > es hat nicht funktioniert. > Habe zum Testen wieder Timer1 Frequenzgenerator und Timer3 Pulsmssung zusammengehängt und einige > Teile vom UTI Programm belassen. > > // Dieses Demo Programm ist nur für Mega128 > #ifdef MEGA32 > #pragma Error " Timer3 nur für Mega128 " > #endif > > // Deklaration der Formatierungsvariablen > #define SPACE 0x20 > #define CR 13 > #define PORT_UTI 2 // Port C > #define PORTDIR_UTI 0x07 // UTI1=PortC.0, UTI2=PortC.1, UTI3=PortC.2 > > int n, m; > word PM_Wert, T_OFF1, T_OFF2, T_REF, T_X0, T_X1, T_X2; // globale Variablen > char str[20]; > > //------------------------------------------------------------------------------ > // Messung > // > void Timer3_ISR(void) > { > PM_Wert=Timer_T3GetPM(); // Messwert auslesen > n++; > Irq_GetCount(INT_TIM3CAPT); // Interrupt zurücksetzen > } > > //------------------------------------------------------------------------------ > // Hauptprogramm > // > void main(void) > { > n=0; m=0; PM_Wert=0; > Irq_SetVect(INT_TIM3CAPT,Timer3_ISR);// Interrupt Service Routine definieren > > Timer_T1PWM(256,72,PS_1024); // Pulsgenerator > // Puls=69,4 µs*72= 5 ms > // Periode=69,4 µs*256= 17,7ms > Port_DataDir(PORT_UTI,PORTDIR_UTI); > Timer_T3PM(0,PS_64); // Pulsmessung initialisieren und starten > Port_Write(PORT_UTI,0x01); > // die Messung beginnt hier > // Timer Output verbinden mit ICP (input capture pin) Timer1 > while (1) > { > label1: > switch(n) > { > case 1: > T_OFF1=PM_Wert; > break; > case 2: > T_OFF2=PM_Wert; > break; > case 3: > T_REF=PM_Wert; > break; > case 4: > T_X0=PM_Wert; > break; > case 5: > T_X1=PM_Wert; > break; > case 6: > T_X2=PM_Wert; > break; > } > Msg_WriteText("TOFF1"); > Msg_WriteWord(T_OFF1); > Msg_WriteChar(SPACE); > Msg_WriteText("PM"); > Msg_WriteWord(PM_Wert); // Wert ausgeben > Msg_WriteChar(SPACE); > Msg_WriteInt(n); > if (n!=6) goto label1; // fürs testen > Msg_WriteWord(PM_Wert); // Wert ausgeben > Msg_WriteChar(SPACE); > Msg_WriteInt(m); > Msg_WriteChar(SPACE); > Msg_WriteInt(n); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_OFF1); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_OFF2); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_REF); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_X0); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_X1); > Msg_WriteChar(SPACE); > Msg_WriteWord(T_X2); > Msg_WriteChar(SPACE); > Msg_WriteChar(CR); > > AbsDelay(500); // Delay 500ms > n=0; > } > } > > > hier nun die Ausgabe: > Interpreter gestartet - 4kb RAM > TOFF10 PM0 0PM0 0TOFF10 PM0 0TOFF10 PM0 0TOFF10 PM0 0TOFF10 PM0 1TOFF10 PM0 1TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 > 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 > > Anscheinend kommt das Programm nur 2mal in die interruptoutine und die Werte werden an T_OFF1 > auch nicht übergeben. > Habe die caseabfrage auch in der interruptroutine gehabt, hat auch nicht gfunkt. > wenn berechnungen eingebaut werden z. B.: PM_WERT=PM_Wert*4.64 kommt null raus. > > Vielleicht kann mir jemand weiterhelfen? > > Gru� > Josef HALLO das obige könnt ihr vergessen habe noch ein bisschen probiert und vermute, dass es sich um ein timingproblem handelt. das obigeprg hat noch einige fehler. hier das geänderte, das im debugmodus einwandfrei funktioniert aber jedoch im echtzeitmodus gibt es keinen übergabewert. void Timer3_ISR(void) { PM_Wert=Timer_T3GetPM(); // Messwert auslesen n++; switch(n) { case 1: T_OFF1=PM_Wert; break; case 2: T_OFF2=PM_Wert; break; case 3: T_REF=PM_Wert; break; case 4: T_X0=PM_Wert; break; case 5: T_X1=PM_Wert; break; case 6: T_X2=PM_Wert; break; } Irq_GetCount(INT_TIM3CAPT); // Interrupt zurücksetzen if (n<6) Timer_T3PM(0,PS_64); } //------------------------------------------------------------------------------ // Hauptprogramm // void main(void) { n=0; m=0; PM_Wert=0; Irq_SetVect(INT_TIM3CAPT,Timer3_ISR);// Interrupt Service Routine definieren Timer_T1PWM(256,72,PS_1024); // Pulsgenerator // Puls=69,4 µs*72= 5 ms // Periode=69,4 µs*256= 17,7ms Port_DataDir(PORT_UTI,PORTDIR_UTI); Timer_T3PM(0,PS_64); // Pulsmessung initialisieren und starten Port_Write(PORT_UTI,0x01); // die Messung beginnt hier // Timer Output verbinden mit ICP (input capture pin) Timer1 while (1) { // Timer_T3PM(0,PS_64); // Pulsmessung initialisieren und starten /* Msg_WriteText("TOFF1"); Msg_WriteWord(T_OFF1); Msg_WriteChar(SPACE); Msg_WriteText("PM"); Msg_WriteWord(PM_Wert); // Wert ausgeben Msg_WriteChar(SPACE); Msg_WriteInt(n); */ // if (T_X2==0) goto label1; while (T_X2==0); Msg_WriteWord(PM_Wert); // Wert ausgeben Msg_WriteChar(SPACE); Msg_WriteInt(m); Msg_WriteChar(SPACE); Msg_WriteInt(n); Msg_WriteChar(SPACE); Msg_WriteWord(T_OFF1); Msg_WriteChar(SPACE); Msg_WriteWord(T_OFF2); Msg_WriteChar(SPACE); Msg_WriteWord(T_REF); Msg_WriteChar(SPACE); Msg_WriteWord(T_X0); Msg_WriteChar(SPACE); Msg_WriteWord(T_X1); Msg_WriteChar(SPACE); Msg_WriteWord(T_X2); Msg_WriteChar(SPACE); Msg_WriteChar(CR); AbsDelay(500); // Delay 500ms n=0; T_OFF1=0; T_OFF2=0; T_REF=0; T_X0=0; T_X1=0; T_X2=0; Timer_T3PM(0,PS_64); } } habe um timingprobleme auszuschlie�en die abspeicherung in die interruproutine aufgenommen. warum muss man nach jedem interrupt den timer wieder neu definieren? danke josef | ||
Antwort schreiben Antworten: Re: Pulsmessung (von PeterS - 15.08.2009 21:51) Re: Pulsmessung (von Josef - 17.08.2009 19:09) Re: Pulsmessung (von ER - 20.08.2009 13:44) Re: Pulsmessung (von PeterS - 20.08.2009 14:52) Re: Pulsmessung (von Josef - 21.08.2009 10:37) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum