找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1356|回复: 7
打印 上一主题 下一主题
收起左侧

有没有高手帮我看看我下面的代码错哪了,可以进入第一个中断,但第二个怎么也不能...

[复制链接]
跳转到指定楼层
楼主
ID:511424 发表于 2019-4-20 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <msp430.h>

/*
* main.c
*/
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
    P1OUT =BIT3;
    P1REN |=BIT3;
        P1IE |=BIT3;
        P1IES |=BIT3;
        P1IFG &=~BIT3;
        P1OUT |=BIT2;
        _BIS_SR(GIE);
        while (1)
        {
                if((P1OUT&BIT2)==0)
                {
                        TA0CTL = TASSEL_1 + MC_1 + TACLR;
                        TA0CCTL0 = CCIE;
                        TACCR0 = 32768;       //30秒计时
                        _BIS_SR(GIE);
                }
                else
                        __no_operation();

          }
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
        P1OUT &=~BIT2;
        P1IFG &= ~BIT3;
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
        int i=0;
        i++;
        if(i==30)
        P1OUT |=BIT2;
        else
                __no_operation();
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:395176 发表于 2019-4-20 12:49 | 只看该作者
int i=0;前加static 不然一直执行不了if中的语句
回复

使用道具 举报

板凳
ID:511424 发表于 2019-4-20 13:19 | 只看该作者
飞机翻筋斗 发表于 2019-4-20 12:49
int i=0;前加static 不然一直执行不了if中的语句

还是不行,定时器中断还是没反应
回复

使用道具 举报

地板
ID:511424 发表于 2019-4-20 13:30 | 只看该作者
飞机翻筋斗 发表于 2019-4-20 12:49
int i=0;前加static 不然一直执行不了if中的语句

是main函数里的定时器中断有问题,不能中断啊
回复

使用道具 举报

5#
ID:282850 发表于 2019-4-22 13:59 | 只看该作者
调试思路有2:
1、将LED显示改在if前,也就是一进入TIMEA中断就改变LED状态,看是否能进入中断;
2、i=0;每次进中断就置0,if肯定没能进入,建议i=0定义为全局变量,思路也清晰。
    另外可以用我的《(原创设计)自用自写的IAR for MSP430系列快速编程模版Template.txt 》模版中的TIME中断试试看,都是我调试通过的。 在-----MSP430单片机 › (原创设计)自用自写的IAR for MSP430系列快速编程模版 ... 中有下载。
回复

使用道具 举报

6#
ID:282850 发表于 2019-4-22 21:36 | 只看该作者
今天工作多,看到你TIMEA的结构不对,不应放置在while(1)中,中断的特点是初始化完成后,就会等待中断条件的到来,千万不要与while(1)相关联。
回复

使用道具 举报

7#
ID:282850 发表于 2019-4-22 21:40 | 只看该作者
喝了酒的晚上,刚才的还没有写完。
给我参考程序:

void main()
{
   Init_Timer_A();

}

unsigned int it=0;      //测试时钟精度,用来校准
void Init_Timer_A(void)
{

      /*----------------SMCLK--分频再分频------------SMCLK来源在main中选择:BCSCTL2=SELS */
      //     TACTL = TASSEL_2 + ID_3 + MC_1 ;//+ TAIE;          //TASSEL_1:时钟,ID_3:分频,MC_1:增计数到CCR0从0重新计。err:TASSEL_0外部时钟,TAIE溢出中断允许,对应TIMERA1_VECTOR的TA0IV 10,不需要CCIE也中断
      //     CCTL0 = CCIE;              //= CCR0 捕获比较中断使能,对应TIMERA0_VECTOR。计数中断见TAIE
      //     CCR0=62500;  //8Mhz晶体/8=1M--->SMCLK, DCOx---->MCK(BCSCTL2 =SELM_1,主时钟(main中)用DOC), 8MHz/8(DIV_3)/8(ID_3)=125000--->TimerA,0.5S=125000/2=62500
      //▲ CCTL1 = CCIE;              //= CCR1 中断使能,▲▲FFF:如果使能,一定要用中断处理函数TIMERA1_VECTOR(才自清标志),否则TimerA0只执行一次。
      /*----------------ACLK--------------*/
      TACTL = TASSEL_1 + ID_0 + MC_1 ;//+ TAIE;          //TASSEL_1:时钟,ID_3:分频,MC_1:增计数到CCR0从0重新计。err:TASSEL_0外部时钟,TAIE溢出中断允许,对应TIMERA1_VECTOR的TA0IV 10,不需要CCIE也中断
      CCTL0 = CCIE;              //= CCR0 捕获比较中断使能,对应TIMERA0_VECTOR。计数中断见TAIE
      CCR0=32768;  //1S  
      //▲ CCTL1 = CCIE;              //= CCR1 中断使能,▲▲FFF:如果使能,一定要用中断处理函数TIMERA1_VECTOR(才自清标志),否则TimerA0只执行一次。
      _EINT();
            
}

/*同一个定时器,但是有2个中断向量地址。TIMERA0对CCR0溢出中断;TIMERA1对CCR1/CCR2或TAR计数溢出中断,*/
#pragma vector=TIMERA0_VECTOR       //g2332  TIMER0_A0_VECTOR
__interrupt void TimerA0()
{
      P2DIR |= BIT5;                           //方向设为输出
      P2OUT ^= BIT5;                           //输出取反,与位的1异或=位取反
      
}
回复

使用道具 举报

8#
ID:282850 发表于 2019-4-23 09:52 | 只看该作者
f556 发表于 2019-4-22 21:40
喝了酒的晚上,刚才的还没有写完。
给我参考程序:

这是我模版中的程序,MSP430G2332,大部分是通用的。如果编译出错,是msp430.h定义的寄存器名不对,按h文件改一下。可以看出注释、参数选择、时钟选择备注很详细。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表