关于MSP430单片机 定时器A, timerA 的问题.
我想用定时器A产生几个不同的独立的时间周期,每个周期都向串口发不同的信息,但是发现实际上程序并没有按照几个独立的时间周期发,而是取决越CCR0的周期,也就是每次都是CCR...
我想用定时器A产生几个不同的独立的时间周期,每个周期都向串口发不同的信息,但是发现实际上程序并没有按照几个独立的时间周期发,而是取决越CCR0的周期,也就是每次都是CCR0触发了,向串口3(我用串口大师看发回的数据)发数据2s了,其他的1/5s,1/2s 才跟在了后面,照理说我的程序应该是CCR1\CCR2\CCR3先触发,然后再到CCR0触发,然后TA0R 清零,再次从头,因为我设的CCR0 很大约2s,这样的话,中间应该是出现很多的1/5s,1/2s ,1s ……后才出现2s,但实际的数据是:1/5s1/2s1s2s1/5s1/2s1s2s1/5s1/2s1s2s1/5s1/2s1s2s1/5s1/2s1s2s1/5s1/2s1s2s1/5s1/2s1s2s
将CCR0调小了就会快一些,调大了就出现慢一些,但是数据都是一样的?请告诉解释。怕问题流答,我设的奖励少一些,采纳既大大的加分。
程序的关键部分:
UCSCTL4= SELM_5+ SELA_5 + SELS_0; // 设置时钟源 SELS_5 子系统时钟 32768 Hz
UCSCTL5=0x0051; // 子系统32分频,32768/32=1024 Hz,主系统2分频 ,辅助系统时钟未分频
……
//A0定时器,用于界面处理
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCTL1 = CCIE; // CCR1 interrupt enabled//时间周期1使能
TA0CCTL2 = CCIE; // CCR2 interrupt enabled//时间周期2使能
TA0CCTL3= CCIE; // CCR3 interrupt enabled//时间周期3使能
TA0CCR0 =2048; // CCR0必须最大,因为CCRn共用一个TAxR,TAxR一计数到CCR0即立刻清0,用于控制周期
//发送数据的频率
TA0CCR1=80; //定时器A0 case 2的触发频率
TA0CCR2=60; //定时器A0 case 4的触发频率
TA0CCR3=40; //定时器A0 case 6的触发频率
……
// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
UART3_SendStr_char("2s"); //计数到CCR0触发
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0: break;
case 2:UART3_SendStr_char("1s"); //TA0R1计数到CCR1触发
break;
case 4: UART3_SendStr_char("1/2s"); //TA0R1计数到CCR2触发
break;
case 6: // TA0R1计数到CCR3触发
UART3_SendStr_char("1/5s");//倾角传感器询问指令
break;
case 8: break; // CCR4 not used
case 10: break; // CCR5 not used
case 12: break; // Reserved not used
case 14: break; // 溢出触发
default: break;
}
} 展开
将CCR0调小了就会快一些,调大了就出现慢一些,但是数据都是一样的?请告诉解释。怕问题流答,我设的奖励少一些,采纳既大大的加分。
程序的关键部分:
UCSCTL4= SELM_5+ SELA_5 + SELS_0; // 设置时钟源 SELS_5 子系统时钟 32768 Hz
UCSCTL5=0x0051; // 子系统32分频,32768/32=1024 Hz,主系统2分频 ,辅助系统时钟未分频
……
//A0定时器,用于界面处理
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCTL1 = CCIE; // CCR1 interrupt enabled//时间周期1使能
TA0CCTL2 = CCIE; // CCR2 interrupt enabled//时间周期2使能
TA0CCTL3= CCIE; // CCR3 interrupt enabled//时间周期3使能
TA0CCR0 =2048; // CCR0必须最大,因为CCRn共用一个TAxR,TAxR一计数到CCR0即立刻清0,用于控制周期
//发送数据的频率
TA0CCR1=80; //定时器A0 case 2的触发频率
TA0CCR2=60; //定时器A0 case 4的触发频率
TA0CCR3=40; //定时器A0 case 6的触发频率
……
// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
UART3_SendStr_char("2s"); //计数到CCR0触发
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0: break;
case 2:UART3_SendStr_char("1s"); //TA0R1计数到CCR1触发
break;
case 4: UART3_SendStr_char("1/2s"); //TA0R1计数到CCR2触发
break;
case 6: // TA0R1计数到CCR3触发
UART3_SendStr_char("1/5s");//倾角传感器询问指令
break;
case 8: break; // CCR4 not used
case 10: break; // CCR5 not used
case 12: break; // Reserved not used
case 14: break; // 溢出触发
default: break;
}
} 展开
1个回答
展开全部
问题出在Timer_A的计数模式上,3种活动模式都不可能达到你想要的效果,因为比较寄存器总是不断的和计数器TA进行比较,然后相同时产生中断,所以你的想法很难实现。
1、如果是“增计数模式”,那么TAR可以增计数到CCR0的值,然后复位为0,再开始新一轮的计数,在此期间一旦有CCR1/2/3/4/5/6之一与之相同,则产生中断并进入中断处理程序,所以不论CCR1/2/3/4/5/6的值设为多少,周期始终都由CCR0决定,只不过先后顺序有差别。
2、如果是“连续计数模式”,同1的分析,周期始终为65535。
3、如果是“增/减计数模式”,则增减过程的比较中断各存在同一周期,周期由CCR0的值决定,而每相邻2次增减计数中断的间隔时间由CCR1/2/3/4/5/6决定。
1、如果是“增计数模式”,那么TAR可以增计数到CCR0的值,然后复位为0,再开始新一轮的计数,在此期间一旦有CCR1/2/3/4/5/6之一与之相同,则产生中断并进入中断处理程序,所以不论CCR1/2/3/4/5/6的值设为多少,周期始终都由CCR0决定,只不过先后顺序有差别。
2、如果是“连续计数模式”,同1的分析,周期始终为65535。
3、如果是“增/减计数模式”,则增减过程的比较中断各存在同一周期,周期由CCR0的值决定,而每相邻2次增减计数中断的间隔时间由CCR1/2/3/4/5/6决定。
追问
我想问的就是当比较寄存 与计数器TA 相比较的时候,不是这样的吗:与TA0CCR3=40; 相同产生一个中断触发case 6 ,计数器继续计数,当与 TA0CCR1=80; 相同是产生中断触发 case 2,计数器继续计数,当与TA0CCR2=60;相同是产生中断触发 case 4 ,然后计数器再继续计数达到 TA0CCR0 =2048 ,产生中断触发 UART3_SendStr_char("2s"); ,然后计数器清零,再重复上面的流程,我的分析对吗?
追答
是的,就是这个过程,所以每个case的周期是相同的,只是先后顺序不同,周而复始。
迪凯特科技(北京)有限公司
2023-07-28 广告
2023-07-28 广告
MCS-51串行接口有四种工作方式,分别是:1. 方式0(8位同步移位寄存器方式),一般用于外接移位寄存器芯片扩展I/O接口。2. 方式1(10位异步收发方式),通常常用于双机通信。3. 方式2(11位异步收发方式),通常常用于多机通信。4...
点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询