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 PeterS - 10.09.2008 18:33)
Als Antwort auf @Peter S - Timer 0 läuft nicht stabil von Hannes - 10.09.2008 8:14


Hallo Hannes,

eine Interpreter Interrupt Routine ist ja keine richtige Assembler Interrrupt Routine. Wird ein Interrupt erzeugt,
wird intern ein Flag gesetzt, und nach bei Abarbeitung des aktuellen Bytecodes, werden die Bytecodes
der Interpreter Interrupt Routine abgearbeitet. Das ist natürlich leicht verzögert. Werden in dem Bytecode
rechenintensive Sachen wie z.B: ein Sinus berechnet, kann die Verzögerung sogar im Bereich von ms liegen.
Kann das Dein Problem erklären?

Gruss Peter

> 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 - 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)