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

@Peter S - Timer 0 läuft nicht stabil Kategorie: CC-Pro Unit & Appl.Board (von Hannes - 10.09.2008 8:14)
Ich nutze:
C-Control Pro Mega32, eigenes Board
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 - 11.09.2008 8:59)
    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)
Re: @Peter S - Timer 0 läuft nicht stabil (von PeterS - 10.09.2008 18:33)
    Re: @Peter S - Timer 0 läuft nicht stabil (von Hannes - 11.09.2008 16:48)
        Re: @Peter S - Timer 0 läuft nicht stabil (von PeterS - 12.09.2008 14:27)
            Re: @Peter S - Timer 0 läuft nicht stabil (von Hannes - 12.09.2008 15:40)