2012-06-14 11 views
2

我正在使用MSP430F5418IAR EW 5.10。 我想在正常模式下使用定時器B.定時器處於向上模式

我想使用兩個中斷。 TimerB0(1 ms)和TimerB1(1秒)。

我的配置是

TBCTL = MC__UP + TBSSEL__ACLK + TBCLR; 
TB0CCTL0 = CCIE; 
TB0CCR0 = 32; 

TB0CCTL1 = CCIE; 
TB0CCR1 = 32768; 

在我剛切換兩個引腳的ISR。 但是隻有TB0CCR0的引腳在觸發。 我的引腳配置是正確的。 誰能告訴我爲什麼?

回答

2

我想你的問題是計時器週期。
MC__UPUp mode: Timer counts up to TBxCL0

所以,你的計時器,當它到達TBxCL0這似乎是價值TB0CCR0 TBxR將重置爲0。

因此,它永遠無法達到的32768

您可以用TB0CCR1切換TB0CCR0的價值,所以你的期限爲1秒。
爲了獲得1ms中斷,您需要每次增加TB0CCR1。

INTERRUPT ISR_1MS() 
{ 
    TB0CCR1 = (TB0CCR1 + 32) & 0x7FFF; 
} 

但通常你不需要第二個定時器的第二個定時器。
你可以簡單地計數1000次你的1ms間隔。

INTERRUPT ISR_1MS() 
{ 
    ms_count++; 
    if (ms_count >= 1000) 
    { 
    ms_count=0; 
    // Do your second stuff 
    } 
} 

如果您需要更多不同的intervalls,您可以更改爲其他模型。
到系統時鐘時間並僅在這個時間檢查。

volatile unsigned int absolute_time=0; 

INTERRUPT ISR_1MS() 
{ 
    absolute_time++; 
} 

unsigned int systime_now(void) 
{ 
    unsigned int result; 
    di(); 
    result = absolute_time; 
    ei(); 
    return result; 
} 

uint8_t systime_reached(unsigned int timeAt) 
{ 
    uint8_t result; 
    result = (systime_now() - timeAt) < 0x1000; 
    return result; 
} 
+0

謝謝你的回答 – Harikrishnan

相關問題