таймеры прерывания C

#c #timer #interrupt

#c #таймер #прерывание

Вопрос:

Похоже, существует конфликт между таймером 2 и таймером 3. Это плата MIPS, и вместо того, чтобы использовать язык ассемблера для программирования; Я использую C. Timer1 предназначен для подсчета, который работает правильно. Timer2 предназначен для мигающего светодиода, который работает правильно. Timer3 предназначен для переключения направлений подсчета. Но существует конфликт между timer2 и timer3. Кто-нибудь знает, в чем конфликт? Я должен закомментировать DelayInit3(); для правильного выполнения кода.

 void __ISR(_TIMER_2_VECTOR, ipl2) Timer2Handler(void)
{
// clear the interrupt flag
mT2ClearIntFlag();
    PORTToggleBits(IOPORT_B, BIT_10); 
 }
 void __ISR(_TIMER_23_VECTOR, ipl2) Timer23Handler(void)
 {
    // clear the interrupt flag
    mT3ClearIntFlag();
    if (direction != 0){
        direction < 1;
    }
    else{
        direction != 0;
    }
}

int main()
{
DeviceInit();
DelayInit1();
DelayInit2();
//  DelayInit3();

}
void DelayInit1()   
{
unsigned int tcfg1;

/* Configure Timer 1. This sets it up to count a 10Mhz with a period of 0xFFFF
  */
    tcfg1 =     T1_ON|T1_IDLE_CON|T1_SOURCE_INT|T1_PS_1_8|T1_GATE_OFF|T1_SYNC_EXT_OFF;
OpenTimer1(tcfg1, 0xFFFF);

}


void DelayInit2()
{
unsigned int tcfg2;

// Config Timer 2. This sets it to count 312500 Hz with a period of T2_TICK
tcfg2 = T2_ON | T2_SOURCE_INT | T2_PS_1_32;
OpenTimer2(tcfg2, T2_TICK);

// Now enable system-wide multi-vector interrupt handling
INTEnableSystemMultiVectoredInt();

// Configure timer 2 interrupt with a priority of 2
ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);

// Clear interrupt flag
mT2ClearIntFlag();
}

void DelayInit3()
{
unsigned int tcfg3;

// Config Timer 3. This sets it to count 312500 Hz with a period of T3_TICK
tcfg3 = T3_ON | T3_SOURCE_INT | T3_PS_1_256;
OpenTimer23(tcfg3, T23_TICK);

// Now enable system-wide multi-vector interrupt handling
INTEnableSystemMultiVectoredInt();

// Configure timer 3 interrupt with a priority of 2
ConfigIntTimer23(T23_INT_ON | T23_INT_PRIOR_2);

// Clear interrupt flag
mT3ClearIntFlag();
}
  

Ответ №1:

Вы также должны переключать биты в каждом конце таймера. Порядок, который вы переключаете, неверен. При каждом завершении таймера вы дважды переключаете БИТ10, то есть возвращаете его в исходное положение.

Вы можете использовать код, подобный этому.

 count = 0;  // in Init.
while(1)
{
    if (IFS0bits.T2IF == 1)
    {
        //if timer == period, toggle the LED
        count  ;
        PORTToggleBits(IOPORT_B, BIT_10);
        if (count %2 == 0)
        {
          DelayMs(2);
          PORTToggleBits(IOPORT_B, BIT_11);
        }
        if (count > 3)
           count = 0;
        mT2ClearIntFlag();
    }
 }
  

Ответ №2:

Вы переключаете бит 10 с задержкой в 2 мс в его первое состояние. Даже если это сработает, вы не заметите.