Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > 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