TI中文支持网
TI专业的中文技术问题搜集分享网站

Timer_A 定时1ms 的问题

采用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 模式下面就相差很明显。

赞(0)
未经允许不得转载:TI中文支持网 » Timer_A 定时1ms 的问题
分享到: 更多 (0)