uint16_t heartbeat(void)
{
//DCOCTL = 0;
//BCSCTL1 = 0;
//DCOCTL = 0;
BCSCTL1 = 0; \
DCOCTL = 0;
BCSCTL2 |= DIVS_3;//8分频
TA1CTL = TASSEL_2 + ID_3 + MC_2 + TACLR;//MCLK,8分频
TA1CCTL1 = CM_1 +CCIS_0 + SCS + CAP + CCIE;
P3SEL |= PULSE;//捕获模式
j=0;
lastCCR1=0;
__bis_SR_register(LPM0_bits+GIE);
//P1OUT |= LED_POWER;
__bis_SR_register(LPM0_bits+GIE);
return lastCCR1;
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER_A(void)
{
switch(TA1IV)
{
case 2://j = TA1CCR1-lastCCR1;
lastCCR1 = TA1CCR1;
TA1R=0;
LPM0_EXIT;
// P1OUT |= LED_POWER;
break;
case 10:break;
LPM0_EXIT;
default: break; }
}
麻烦大家帮我看一下上面的测试方波周期的程序:
定时器的时钟为1.56khz
测试方波的范围为1hz-10hz,测试过程中发现当测2hz频率以下的方波时,程序就不跑了,好像是陷入了循环里一样,昨天想了很久,也没有想通,麻烦大家看一看。
用的单片机类型为msp430f2132
Maka Luo:
用DEBUG模式,看看程序停在何处。
另外低频的时候,时间太长,可能Timer溢出中断,你这里没有置标志位,那么返回的lastCCR1就不是真实值了。
yi zeng:
回复 Maka Luo:
定时器TAR的最大值是FFFFh,如果用1.56khz去计数,对于1hz的方波两个周期也才计数到3120,远远没有达到定时器TAR的上限呀?
Maka Luo:
回复 yi zeng:
那你需要定位一下程序停在何处?
yi zeng:
回复 Maka Luo:
定位到了,是停在return lastCCR1这一句上,就是说3hz以上都能执行这条语句,但是3hz以下就不能执行这条语句,难道函数值的返回有时间的限制?
Maka Luo:
回复 yi zeng:
__bis_SR_register(LPM0_bits+GIE);//P1OUT |= LED_POWER;__bis_SR_register(LPM0_bits+GIE);return lastCCR1;
这里怎么有两条进入LPM0指令?
Maka Luo:
yi zeng
uint16_t heartbeat(void) { //DCOCTL = 0; //BCSCTL1 = 0; //DCOCTL = 0; BCSCTL1 = 0; \ DCOCTL = 0; BCSCTL2 |= DIVS_3;//8分频 TA1CTL = TASSEL_2 + ID_3 + MC_2 + TACLR;//MCLK,8分频 TA1CCTL1 = CM_1 +CCIS_0 + SCS + CAP + CCIE; P3SEL |= PULSE;//捕获模式 j=0; lastCCR1=0; __bis_SR_register(LPM0_bits+GIE); //P1OUT |= LED_POWER; __bis_SR_register(LPM0_bits+GIE);
//两次调用LPM0进入指令,不知道你的用意是如何? return lastCCR1; } #pragma vector=TIMER1_A1_VECTOR__interrupt void TIMER_A(void) { switch(TA1IV) { case 2://j = TA1CCR1-lastCCR1; lastCCR1 = TA1CCR1; TA1R=0; LPM0_EXIT; // P1OUT |= LED_POWER; break; case 10:break; LPM0_EXIT;
//这个有点语法错误,你应该是想退出LPM0
// case 10:
//LPM0_EXIT;
//break;
default: break; } }
麻烦大家帮我看一下上面的测试方波周期的程序:
定时器的时钟为1.56khz
测试方波的范围为1hz-10hz,测试过程中发现当测2hz频率以下的方波时,程序就不跑了,好像是陷入了循环里一样,昨天想了很久,也没有想通,麻烦大家看一看。
用的单片机类型为msp430f2132
yi zeng:
回复 Maka Luo:
1. 两次进入LMP0是为了捕获两次上升沿,第一次捕获到上升沿进入中断的时候,将TA1R置0;第二次捕获到上升沿进入中断的时候,这时TA1R中的值就是所测波形周期的计数值,这样便测的了周期。如果只开中断使能,不进入低功耗模式将CUP关掉,程序就直接往下跑了呀,相当于都没有执行到中断程序。
2.您说的第二个问题是对的。应该先退出低功耗,再break掉。但是我都没有开溢出中断使能,照理来说应该不会执行到那个分支中去。
3. 昨天我改了程序,让heartbeat()不返回函数值,而让其他函数直接引用全局变量lastCCR1,昨天实际测了一下,就完全没有问题,3hz以下都能测了。但是还是想不通为啥用return lastCCR1;就只能测3hz以上的波形。