我利用以下程序,使用定时器A产生固定的38KHz波形,利用定时器B中断开关暂停定时器A,以实现断断续续的38KHz波形。 可结果一直持续输出38KHz的波形,为什么?
#include <msp430x14x.h>
#define T_CYC 104 //get 38kHz (timer 2MHz out_module7)
#define T_ON 35 //duty cycle (timer 2MHz out_module7)
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
volatile unsigned int i; BCSCTL1 &= ~XT2OFF; // XT2= HF XTAL
do { IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i–); // Time for flag to set
} while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 = SELM_2 + SELS + DIVS_1; // MCLK= XT2 SMCLK= XT2/2 (safe)
P1DIR = 0;
P1DIR |= BIT6;
P1SEL = 0;
P1SEL |= BIT6; //SET P1.6 TA1 OUT module
CCTL1 = 0;
CCTL1 |= OUTMOD_7; CCR0 = T_CYC;
CCR1 = T_ON;
TACTL = 0;
TACTL = TASSEL_2 + TAIE; // SMCLK, contmode
P2DIR = BIT0;
TBCCR0 = 32333;
TBCCTL0 = 0;
TBCCTL0 |= CCIE; TBCTL = 0;
TBCTL = CNTL_0 + TBSSEL_1 + MC_1 + TBIE; //定时器B时钟信号选择ACLK,同时设置定时器B计数模式为连续增计模式,TBR(MAX) = 0xFFFFh
TACTL |= MC_1;
_EINT(); //中断允许
for(;;)
_BIS_SR(LPM0_bits + GIE); // Enter LPM0
}
#pragma vector=TIMERB0_VECTOR //定时器B TACCR0中断处理
__interrupt void timer_b0(void)
{
_BIC_SR_IRQ(LPM0_bits); // Clear LPM0 bits from 0(SR)
TACTL ^= MC_1;
P2OUT ^= BIT0;
}
Ling Zhu2:
能进中断么?
建议两个 Timer 分开调,程序思路是可以的。手头没有149,我这边用另外一个片子试过两个Timer_A没问题。
灰小子:
TACTL ^= MC_1;这一句是有问题的,可能会操作到无关的bit位
Ling Zhu2:
回复 灰小子:
dirtwillfly
TACTL |= MC_1这一句是有问题的,可能会操作到无关的bit位
LI CHUNLEI Panasonic Corporation of China:
回复 Ling Zhu2:
中断可以进的,p2.0接的是led指示灯,是在闪烁的,但是观察p1.1波形是连续的, 并没有停止的状态。
>>我这边用另外一个片子试过两个Timer_A没问题。
两个timerA是什么意思?你直接把我的程序编译一下看看,谢谢!
LI CHUNLEI Panasonic Corporation of China:
回复 灰小子:
额~
这个怎么可能操作到其他位呢?1跟0或还是1, 0跟0或还是0。。。。。。
Ling Zhu2:
回复 LI CHUNLEI Panasonic Corporation of China:
LI CHUNLEI Panasonic Corporation of China
中断可以进的,p2.0接的是led指示灯,�在闪烁的,但是观察p1.1波形是连续的, 并没有停止的状态。
>>我这边用另外一个片子试过两个Timer_A没问题。
两个timerA是什么意思?你直接把我的程序编译一下看看,谢谢!
LI CHUNLEI Panasonic Corporation of China:
回复 Ling Zhu2:
笔误~ 不好意思~
我试试你的程序,稍等~
LI CHUNLEI Panasonic Corporation of China:
回复 Ling Zhu2:
你好!非常感谢!
你的这个程序是可以的,我也发现问题所在了,问题在于我打不打开 TBIE 中断,如果打开则一直连续输出38K。
但是我不能理解啊~ TBIE 打开不是只有在定时器发生溢出时才响应的中断吗?我的TBCCR0固定32333啊~每次进中断后寄存器TAR不就又清空了吗?不会发生溢出啊~ 怎么会跟开不开 TBIE 中断有关呢?谢谢!
另外,程序执行到
__bis_SR_register(LPM0_bits + GIE);// Enter LPM0 w/ interrupt就进入休眠模式了,在中断服务函数里边并没有把休眠关闭,cpu还是被禁用的,那么中断里边的两条代码由什么时钟来驱动执行?由谁来执行?以上~ 谢谢!期待您的回复。