Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: @Peter S - Timer 0 läuft nicht stabil Kategorie: CC-Pro Unit & Appl.Board (von Hannes - 12.09.2008 13:51)
Als Antwort auf Re: @Peter S - Timer 0 läuft nicht stabil von Werner - 11.09.2008 8:59
Ich nutze:
C-Control Pro Mega32, eigenes Board
Hallo Werner,

ist eine Möglichkeit. In meinem Fall müsste ich dann auch die Spannung mit dem extra Proz.
einlesen, und die Daten zum C-Control schicken (ist alles sehr umständlich), oder gleich Bascom verwenden.
Was braucht man da für ein Programmiergerät?

Gruss




> 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 Werner - 13.09.2008 10:18)