4174|7

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

msp430f5529代码 [复制链接]

用定时器控制LED的闪烁间隔,慢流水时亮灭间隔0.5s,快流水时亮灭间隔0.2s,两个按键一个控制流水速度,一个控制流水方向,流水速度分快慢,流水方向分正负
自己写了个程序
#include


unsigned char flag =0;
unsigned char boom =0;
unsigned char n =2;
void main(void)
{
        WDTCTL = WDTPW+WDTHOLD;


        P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);//P1.0-P1.5为输出方向
        P8DIR|=(BIT1+BIT2);                    //P8.1-P8.2为输出方向


        P1OUT &=~ (BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);
        P8OUT &=~ (BIT1 + BIT2);


        P1DIR &=~ BIT7;
        P1REN |=BIT7;                //使用上拉下拉电阻
        P1OUT |=BIT7;                //输出置1,使用上拉电阻,高电位
        P1IE |=BIT7;                //p1,7产生变化的时候允许中断
        P1IES |=BIT7;                //上升沿中断
        P1IFG &=~ BIT7;                //没有中断请求
        __enable_interrupt();


        P2DIR &=~ BIT2;
    P2REN |=BIT2;
    P2OUT |=BIT2;
    P2IE |=BIT2;
    P2IES |=BIT2;
    P2IFG &=~ BIT2;
    __enable_interrupt();


    while(1){
                          TA0CCTL0=CCIE;     //捕获比较器1开启CCIFG位中断
                          switch(flag)
                          {
                                case 0:TA0CCR0=16384;break;
                                case 1:TA0CCR0=6654;break;
                                default:break;
                          }
                          TA0CTL|=TASSEL_1+MC_1+TACLR; //选择SCLK32.768KHZ作为时钟,选用增模式,并开启中断
                          __enable_interrupt(); //开启总中断
                          __bis_SR_register(LPM0_bits + GIE);
                    };


}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TimerA(void)
{
        if(boom==0)
{
                switch(n)
                {           case 2:P1OUT=BIT0;break;
                            case 3:P1OUT=0x00;
                                          P8OUT=BIT1;break;
                            case 4:P1OUT=0x00;
                                          P8OUT=BIT2;break;
                            case 5:P8OUT=0x00;
                                              P1OUT=BIT1;break;
                            case 6:P1OUT=BIT2;break;
                            case 7:P1OUT=BIT3;break;
                            case 8:P1OUT=BIT4;break;
                            case 9:P1OUT=BIT5;break;
                            default:break;
                }
}
                    else
                    {
                            switch(n)
                            {
                                       case 2:P8OUT=0x00;
                                              P1OUT=BIT5;break;
                                       case 3:P1OUT=BIT4;break;
                                       case 4:P1OUT=BIT3;break;
                                       case 5:P1OUT=BIT2;break;
                                       case 6:P8OUT=0x00;
                                                      P1OUT=BIT1;break;
                                       case 7:P1OUT=0x00;
                                                         P8OUT=BIT2;break;
                                       case 8:P1OUT=0x00;
                                                      P8OUT=BIT1;break;
                                       case 9:P8OUT=0x00;
                                              P1OUT=BIT0;break;
                                       default:break;
                             }
                    }
        n++;
        if(n>9)
        {
                n=2;
        }
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1(void)
{
        while((P1IE & 0x80)==0);
        if(flag == 1)
              flag =0;
      else
              flag =1;
      P1IFG &=~BIT7;
}
#pragma vector = PORT2_VECTOR
__interrupt void PORT_2(void)
{
        while((P2IE & 0x04)==0);
        if(boom==1)
         boom=0;
else
         boom=1;
        P2IFG &=~BIT2;
}

之后那个改变速度的s1键按键后无变化,改变方向的s2可以。
请问各位大神,哪里出错了,要怎么改啊.....

最新回复

我不是大神,你说的是哪个switch  详情 回复 发表于 2014-7-30 13:35
 
点赞 关注

回复
举报

1801

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
这种跟中断相关的寄存器TA0CCR0可能不好在已经开启中断的时候任意更改吧
给你另一个思路,你可以固定中断间隔,比如0.1s,然后通过一个变量累计到你要的0.2s,0.5s
你按键所要做的只是改变这个变量为2和5而已

点评

我单步运行了一下,就是进入亮灯的中断后,如果按了变速的中断,会进入变速的中断,但是变速键中断结束后会立即在回到亮灯的中断。而回不到主函数,所以时间不改变。但是如果按照大神你的说法,这个问题还是解决不了  详情 回复 发表于 2014-7-28 16:11
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
sint27 发表于 2014-7-28 15:45
这种跟中断相关的寄存器TA0CCR0可能不好在已经开启中断的时候任意更改吧
给你另一个思路,你可以固定中断 ...

我单步运行了一下,就是进入亮灯的中断后,如果按了变速的中断,会进入变速的中断,但是变速键中断结束后会立即在回到亮灯的中断。而回不到主函数,所以时间不改变。但是如果按照大神你的说法,这个问题还是解决不了啊。

点评

补充:flag的初始值要为2或5,还有别忘了对cnt初始化,剩下的就看你的了  详情 回复 发表于 2014-7-28 16:48
亮灯的中断运行完之后还不是会回到主函数而且你这个程序的主要问题是主循环处理错了, 1、你把以下放到主循环前,同时原来的主循环全删掉 TA0CCTL0=CCIE; //捕获比较器1开启CCIFG位中  详情 回复 发表于 2014-7-28 16:29
 
 
 

回复

1801

帖子

0

TA的资源

五彩晶圆(初级)

4
 
子非鱼非子鱼 发表于 2014-7-28 16:11
我单步运行了一下,就是进入亮灯的中断后,如果按了变速的中断,会进入变速的中断,但是变速键中断结束后 ...

亮灯的中断运行完之后还不是会回到主函数而且你这个程序的主要问题是主循环处理错了,
1、你把以下放到主循环前,同时原来的主循环全删掉
                       TA0CCTL0=CCIE;     //捕获比较器1开启CCIFG位中断
                       TA0CCR0=16384/5;
                          TA0CTL|=TASSEL_1+MC_1+TACLR; //选择SCLK32.768KHZ作为时钟,选用增模式,并开启中断
                          __enable_interrupt(); //开启总中断
                          __bis_SR_register(LPM0_bits + GIE);

2、TA中断改为
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TimerA(void)
{
     cnt++;
    if(cnt>=flag)
    {
         cnt=0;
         《这里是你原本的内容》
    }
}
3、外部中断处理
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1(void)
{
        while((P1IE & 0x80)==0);
        if(flag == 2)
              flag =5;
      else if(flag==5)
              flag =2;
      P1IFG &=~BIT7;
}

你再试试,如果你原本的寄存器配置没错的话,这样应该就能实现你要的效果了
 
 
 

回复

1801

帖子

0

TA的资源

五彩晶圆(初级)

5
 
子非鱼非子鱼 发表于 2014-7-28 16:11
我单步运行了一下,就是进入亮灯的中断后,如果按了变速的中断,会进入变速的中断,但是变速键中断结束后 ...

补充:flag的初始值要为2或5,还有别忘了对cnt初始化,剩下的就看你的了

点评

大神,我换成if就完美运行了,可是switch为毛就不行呢......  详情 回复 发表于 2014-7-30 09:26
还是不行,单步运行,它只有第一次达到cnt>=flag时,才会跳出进入判断flag=2还是5那个中断,之后,无论再怎么按s1,都不会跳出了  详情 回复 发表于 2014-7-28 18:32
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

6
 
sint27 发表于 2014-7-28 16:48
补充:flag的初始值要为2或5,还有别忘了对cnt初始化,剩下的就看你的了

还是不行,单步运行,它只有第一次达到cnt>=flag时,才会跳出进入判断flag=2还是5那个中断,之后,无论再怎么按s1,都不会跳出了
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

7
 
sint27 发表于 2014-7-28 16:48
补充:flag的初始值要为2或5,还有别忘了对cnt初始化,剩下的就看你的了

大神,我换成if就完美运行了,可是switch为毛就不行呢......

点评

我不是大神,你说的是哪个switch  详情 回复 发表于 2014-7-30 13:35
 
 
 

回复

1801

帖子

0

TA的资源

五彩晶圆(初级)

8
 
子非鱼非子鱼 发表于 2014-7-30 09:26
大神,我换成if就完美运行了,可是switch为毛就不行呢......

我不是大神,你说的是哪个switch
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表