采用DCO 1MHZ的时钟,
问题:采用counter定时的时间明显比采用compare定时的时间要快,附上代码如下:
#include "msp430g2231.h"
#define _1ms 1000
#define _1kHz 1000
#define Timer 0
unsigned int flag=0;
unsigned int flag1=0;
void Timer_Init()
{
P1SEL &= ~BIT0 + ~BIT6;
P1DIR |= BIT0 + BIT6;
P1OUT |= BIT0 + BIT6;
/***********************************************/
//TODO:
//1–>> Capture/compare interrupt enable
//2–>> set the time(1ms) jump into the interrupt
//3–>> use SMCLK, upmode
/***********************************************/
#if Timer
TACCTL0 |= CCIE;//Capture/compare interrupt enable
TACCR0 = _1kHz;
TACTL |= TASSEL_2 | MC_1;//SEL SYSTEM CLK SMCLK,upmode
#else
TACCR0 = _1kHz;
TACTL |= MC_1 | TAIE | TASSEL_2;
#endif
_EINT();
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//鍐呴儴鏃堕挓鏍″噯
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) //濡傛灉鏍″噯浜嗘椂閽燂紝鎴栬€?segm A 娌℃湁琚摝闄わ紝閭d箞杩欎袱涓€间笉鍙兘鏄痜f
{
while(1); // If calibration constants erased // do not load, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set range /this test value is 0x86
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation /This test value is 0xca
Timer_Init();
while(1);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Blinky(void)
{
flag++;
/***********************************************/
//TODO: Set time is 0.5 second
/***********************************************/
if(flag%500==0)
{
P1OUT ^=BIT6;
}
if(flag%1000==0) //set time is 1 second
{
P1OUT ^=BIT0;
flag=0;
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Blinky1(void)
{
flag1++;
/***********************************************/
//TODO: Set time is 0.5 second
/***********************************************/
if(flag1%500==0)
{
P1OUT ^=BIT0;
}
if(flag1%1000==0) //set time is 1 second
{
P1OUT ^=BIT6;
flag1=0;
}
}
Young Hu:
您是怎么测出来的?能差多少?
Hardy Hu:
1.能否发两个波形上来看一下;
2.按你的程度的意思,中断服务函数是1ms才进一次,然后里面的翻转是由里面的二重计数器来控制,这个程序的意思是每500ms翻转,周期为1000ms。
River Huang:
回复 Young Hu:
不好意思,没注意看《客户提问前必读》,现在补充说明:
1. 上面的程序注意是实现 LED 以 1 s 和 0.5 s循环亮灭的效果,就是简单的熟悉验证代码。
2. 没有用仪器进行测量,目测 compare 模式很接近 1 s 和 0.5 s,但是 counter 模式明显比 compare 模式快很多,而且调节 TACCR0 的值,counter 模式目测没有变化,最小 TACCR0 = 1. compare模式有明显变化。
3.开发环境IAR Assembler for MSP430 5.30.1 (5.30.1.50284) ,运行在 WIN7 homebasic 上。
4. 硬件环境为 TI LaunchPad,MCU 为 MSP430G2231。
5. 目前还是熟悉编程阶段,程序主要为了验证对 TimerA 操作的正确性,分别将 compare 模式和 counter 模式做了对比,感觉在counter 的 upmode 下面,定时不受控制。
River Huang:
回复 Hardy Hu:
1. 没有测试波形,因为相差很明显,肉眼很容易观察出来差异。
2. 是 LED 500 ms 和 1000ms 取反一次。
3. 只是为了验证 TimerA 的操作。
4. 代码中有compare 模式和 counter 模式的对比,不同模式下面,LED 的显示效果明显不同,compare模式下,目测很接近1000ms 和 500 ms,但是counter 模式下面就相差很明显。