2016-10-12 5 views
0

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

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(); 
} 

ответ

0

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

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

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(); 
    } 
} 
0

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

 Смежные вопросы

  • Нет связанных вопросов^_^