[讨论] (解决了)用定时器A写音乐的程序,只能演奏第一个音,请大家看看什么原因

qingwen9668   2013-12-17 18:55 楼主
用launchpad板子,定时器A写了一个P1.0口输出音乐的程序,只能演奏第一个音,请大家看看什么原因

#include "io430g2553.h"
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
unsigned int sb;
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;    // CCR0 interrupt enabled
  sb=1908;
  CCR0 = sb; //第一个音
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, contmode
_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
delay_nms(200);
   sb=1701;
   CCR0 = sb;//第二个音
//  TACTL = TASSEL_2 + MC_1;                  // SMCLK, contmode
//_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
delay_nms(200);

}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0= sb;                            // Add Offset to CCR0
  //LPM0_ EXIT;
}
/*****************************************
    *               1us延时函数
   ****************************************/
void delay_1us(void)
{
    asm("nop");
}
/*****************************************
  *               N us延时函数
  ****************************************/
void delay_nus(unsigned int n)
{
    unsigned int i;
    for (i=0;i     delay_1us();
}
/*****************************************
   *               1ms延时函数
  ****************************************/
void delay_1ms(void)
{
    unsigned int i;
    for (i=0;i<1140;i++);
}
/*****************************************
   *               N ms延时函数
   ****************************************/
void delay_nms(unsigned int n)
{
    unsigned int i=0;
    for (i=0;i     delay_1ms();
}

[ 本帖最后由 qingwen9668 于 2013-12-19 18:02 编辑 ]

回复评论 (6)

连续模式?连续模式的CCRO中断的周期是一定的吧?除非改时钟
用up模式?
点赞  2013-12-17 19:27
但第一个音是可以的呀,为什么呢?
点赞  2013-12-17 20:11
我用的是增计数器模式
点赞  2013-12-17 20:13
很是好奇,正好前几天某网站给寄来了一块launchpad。
昨晚在CCS中Bebug试了下,程序会卡在
“_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt”
这条后的“delay_nms(200);”处

查了一下,“_BIS_SR(LPM0_bits + GIE);“是用来进入低功耗模式的,程序第一次执行到_BIS_SR();SP++,指向
“delay_nms(200);”,CPU关闭。而计数器A是可以进中断的,当执行完中断服务程序,退出中断后,又进入低功耗模式,CPU关闭。所以程序无法往下走,一直会卡在“delay_nms(200);”处。

不知道这样理解对不对
点赞  2013-12-18 09:13

回复 5楼gs001588 的帖子

是这么回事好像

我开始那个回帖没仔细看,只看到您注释中写着连续模式

要想退出低功耗模式向下执行程序,得退出低功耗模式,一般是在一个中断中执行退出低功耗模式的设定,例如按键中断中,你按一下按键,播放另外一个音。用定时器中断也行,例如第一个播放了一定时间到了,定时器产生中断退出低功耗模式程序往下执行播放另外一个音
点赞  2013-12-19 09:59
佛粽说的对,已经改好,实验已经成功了,谢谢各位网友的帮助
点赞  2013-12-19 18:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复