Re: @Peter S - Timer 0 läuft nicht stabil Kategorie: CC-Pro Unit & Appl.Board (von Werner - 11.09.2008 8:59) | |
Als Antwort auf @Peter S - Timer 0 läuft nicht stabil von Hannes - 10.09.2008 8:14
| |
Hallo Hannes, für zeitgenaue Funktionen mit der C-Control empfiehlt es sich einen extra Processor einzusetzen. Ich verwende gern den ATMEGA8 mit BASCOM (mit eingelagerten Assemblerroutinen), der über RS232 an die C-Control (z.B.Pro 32) angehängt wird. Dann gibt es keine Probleme mehr und vor allem einfache Programme. > Hallo Peter, > > > ich möchte exakt 5ms nachdem ein Interrupt ausgelöst wurde eine Spannung messen. > Zum Testen habe ich an INT0 ein stabiles Rechtecksignal von einem Frequenzgenerator mit einer > Periodendauer von 20ms angeschlossen. Die positive Flanke triggert den INT0, dieser startet den > Timer0 und nach 5ms wird die Spg. eingelesen. > Zum Messen schalte ich bei der INT0 Routine und der Timer0 Routine eine LED kurz EIN + AUS. > > Zum Problem: > Das INT0 Signal ist stabil vorhanden, und die 5ms Verzögerung passen, nur das Signal das der Timer > auslöst zittert, d.h. die 5ms werden vom Timer nicht exakt reproduziert. Das Signal schwankt rund > 100us hin und her, teilweise setzt es sogar ganz aus. > > Kann man das verbessern? > Weil es bringt mir nichts, wenn man Timer0 mit 67.8ns auflösen kann, der Timer aber die Zeit nicht > stabil reproduzieren kann. > > Gruss > > > > > > > > word ADCWert_L1; > byte cnt1, Sekunde, Minute, Stunde, Sekunde_alt; > > void main(void) > { > > SPI_Disable(); > Serial_Init(0,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD38400); // Schnittstelle 0 > LCD_Init(); // Display initialisieren > LCD_ClearLCD(); // Display löschen > LCD_CursorOff(); // Display Cursor ausschalten > Port_DataDirBit(PORT_LED1,PORT_OUT); > Port_WriteBit(PORT_LED1,PORT_OFF); > > Irq_SetVect(INT_0, Nulldurchgang_L1); // INT0 setzen für Nulldurchgang L1 (Port D.2) > Ext_IntEnable(0,3); // INT0: Mode 3 = steig Flanke > > Irq_SetVect(INT_TIM0COMP,Timer0_ISR); // Interrupt Routine Timer 0 definieren > > > while(1); > } > > > void Nulldurchgang_L1(void) // Aufruf bei steigender Flanke > { > int irqcnt; > > Timer_T0Time(72,PS0_1024); // Zeit (5ms) festlegen und Timer0 starten > Port_WriteBit(PORT_LED1,PORT_OFF); // LED1 OFF > Port_WriteBit(PORT_LED1,PORT_ON); // LED1 ON Impulsdauer Off-On 50us > > irqcnt=Irq_GetCount(INT_0); > } > > > > void Timer0_ISR(void) // Aufruf 5ms nach Nulldurchgang der Wechselspg. > { > int irqcnt; > Port_WriteBit(PORT_LED1,PORT_OFF); // LED1 OFF > Timer_T0Stop(); // Timer0 anhalten > > ADC_Set(ADC_VREF_VCC, 0); // VREF für ADC0(=PortA.0) = VCC (5.000V) > ADCWert_L1 = ADC_Read(); // Spitzenwert von L1 in den ADC > > irqcnt=Irq_GetCount(INT_TIM0COMP); > > Port_WriteBit(PORT_LED1,PORT_ON); // LED1 ON, Laufzeit LED1 OFF-ON ca. 400us > } > | |
Antwort schreiben Antworten: Re: @Peter S - Timer 0 läuft nicht stabil (von Hannes - 12.09.2008 13:51) Re: @Peter S - Timer 0 läuft nicht stabil (von Werner - 13.09.2008 10:18) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum