2016-10-12 1 views
0

Es scheint einen Konflikt zwischen Timer 2 und Timer 3 zu geben. Dies ist ein MIPS-Board und statt Assembler zu programmieren; Ich benutze C. Timer1 ist für eine Zählung, die richtig funktioniert. Timer2 ist für eine blinkende LED, die richtig funktioniert. Timer3 dient zum Umschalten der Zählrichtungen. Aber es gibt einen Konflikt zwischen Timer2 und Timer3. Weiß jemand wo der Konflikt ist? Ich muss auskommentieren DelayInit3(); Damit der Code ordnungsgemäß ausgeführt wird.Interrupt-C-Timer

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

Antwort

0

Sie sollten auch die Bits an jedem Timer-Ende umschalten. Die Reihenfolge, in der Sie wechseln, ist falsch. Bei jedem Ende des Timers schalten Sie BIT10 zweimal um, d. H. Bringen Sie es zurück in die Ausgangsposition.

Sie können Code wie diesen verwenden.

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

Sie schalten das Bit 10 mit einer Verzögerung von 2 ms in den ersten Zustand um. Selbst wenn das funktioniert, werden Sie es nicht bemerken.