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

Timer 1 verhaelt sich nicht wie Timer 3 Kategorie: Programmierung C (von Max - 19.09.2013 11:45)


Hallo zusammen,

ich benutze den Mega 128 CAN und versuche das Testprogramm PW_Messung zum laufen zu bekommen. Der Timer 1
zaehlt allerdings nicht richtig. Tausche ich in dem Programm Timer 1 und Timer3 funktionierts. Jetzt die Frage.
Habe ich eine Einstellung vergessen und der Pin vom Timer eins hat noch eine andere Funktion die er versucht auszufuehren,
oder ist das ein Interruptproblem?

Hier der Code:

// PMessung: Pulsbreite und Perioden Messung mit TIMER1(16 Bit)
// Pulsweitenmodulation mit Timer 0 bzw. Timer 3
// Die minimale messbare Pulsbreite/Periode=70┬Ás mit 14,756MHz Abtastrate.
// erforderliche Library: IntFunc_Lib.cc

// Mega32:  Frequenzgeneratorausgang Timer0 PB3 (PortB.3)
//          Z├Ąhlereingang (input capture) PD6 (PortD.6)
//          Der Output Timer0 OC0 PB3 (PortB.3) muss mit ICP (input capture pin) PD6
//          (PortD.6) verbunden werden.
// Mega128: Frequenzgeneratorausgang Timer3 PE3 (PortE.3)
//          Z├Ąhlereingang Timer1 (input capture) PD4 (PortD.4)
//          Der Output Timer3 OC3 PE3 (PortE.3) muss mit ICP (input capture pin) PD4
//          (PortD.4) verbunden werden.

//------------------------------------------------------------------------------
// ├?ber den Timer Prescaler wird das Teilungsverh├Ąltnis (Oszillatorfrequenz/ps)
// festgelegt. (14,7456MHz/ps)
//
/*
Vorteiler (prescaler)   Zeitbasis (Dauer eines Ticks)
PS_1    (1)   67,8 ns
PS_8    (2)  542,5 ns
PS_64   (3)   4,34 ┬Ás
PS_256  (4)  17,36 ┬Ás
PS_1024 (5)   69,4 ┬Ás
*/

// Deklaration der Formatierungsvariablen
#define SPACE 0x20
#define CR 13

word PM_Wert;                                   // globale Variablendeklaration

//------------------------------------------------------------------------------
// Messung
//
void Timer1_ISR(void)
{
    PM_Wert=Timer_T1GetPM();                    // Messwert auslesen
    Irq_GetCount(INT_TIM1CAPT);                 // Interrupt zur├╝cksetzen
}

//------------------------------------------------------------------------------
// Hauptprogramm
//
void main(void)
{
    byte n;
    word i;
    n=0;
    Irq_SetVect(INT_TIM1CAPT,Timer1_ISR);       // Interrupt Service Routine definieren

#ifdef MEGA32
    Timer_T0PWM(32,PS0_64);                     // Pulsgenerator
                                                // Puls=4,34 ┬Ás*32= 139 ┬Ás
                                                // Periode=4,34 ┬Ás*256= 1111 ┬Ás
#endif

#ifdef MEGA128
    // wir benutzen Timer 3 anstatt Timer 1 beim Mega128 da es sonst eine
    // Pin Kollision bei PB.4 mit OC0 und RX-BUSY gibt
    Timer_T3PWM(256,32,PS_64);                  // Pulsgenerator
                                                // Puls=4,34 ┬Ás*32= 139 ┬Ás
                                                // Periode=4,34 ┬Ás*256= 1111 ┬Ás
#endif

    // die Messung beginnt hier
    // Timer Output verbinden mit ICP (input capture pin) Timer1
    while (1)
    {
        PM_Wert=0;
        //Timer_T1PM(0,PS_1);                     // Pulsmessung initialisieren und starten
        Timer_T1PM(1,PS_1);                     // Periodenmessung initialisieren und starten

        while (PM_Wert==0);                     // Pulsbreite und Periode messen

        Msg_WriteHex(n);                        // Anzahl Durchl├Ąufe ausgeben
        Msg_WriteChar(SPACE);
        Msg_WriteWord(PM_Wert);                 // Wert ausgeben
        Msg_WriteChar(CR);
        AbsDelay(500);                          // Delay 500ms
        n++;
    }
}


    Antwort schreiben


Antworten:

Re: Timer 1 verhaelt sich nicht wie Timer 3 (von PeterS - 19.09.2013 14:15)
    Re: Timer 1 verhaelt sich nicht wie Timer 3 (von Max - 20.09.2013 7:50)
        Re: Timer 1 verhaelt sich nicht wie Timer 3 (von PeterS - 20.09.2013 14:49)
            Re: Timer 1 verhaelt sich nicht wie Timer 3 (von Max - 24.09.2013 6:15)