求助!自己看教程,写了一个程序,定时器中断不能跳转到中断服务函数

[复制链接]

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
查看: 4170回复: 12 发表于 2019-4-20 14:11:40   只看该作者
#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();

          }
}

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
发表于 2019-4-21 09:32:05   只看该作者
中断服务函数写了吗?贴上来看一下?

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-21 17:53:37   只看该作者
Shuyang 发表于 2019-4-21 09:32
中断服务函数写了吗?贴上来看一下?

#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)
{
        static int i=0;
        i++;
        if(i==30)
        P1OUT |=BIT2;
        else
                __no_operation();
}

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
发表于 2019-4-22 10:52:27   只看该作者


楼主,想实现什么功能?

猜测几个点:

GPIO口没有设定方向~  输入或者输出。

其它还没细看

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-22 11:15:47   只看该作者
shengxiang 发表于 2019-4-22 10:52
楼主,想实现什么功能?

猜测几个点:

开始P1.2输出高电平;按键,P1.2口输出低电平,进入计时,;计时三十秒,结束后P1.2口输出高电平。
这是2018电赛C类无线充电小车的充电站部分,按键后进行充电,计时30秒后结束,我自己写的,刚学不久所以可能不太对。

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-22 11:26:36   只看该作者
shengxiang 发表于 2019-4-22 10:52
楼主,想实现什么功能?

猜测几个点:

额。。。
现在是按键后能进入第一个中断,出来后在main函数里的if就可以执行,但是if里面的中断也就是第二个中断用不了,一直在循环if里的语句。。

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-22 11:28:45   只看该作者
shengxiang 发表于 2019-4-22 10:52
楼主,想实现什么功能?

猜测几个点:

望解答!!

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
发表于 2019-4-22 14:14:42   只看该作者


初始化代码供你参考下。

主程序的循环是不对的,你可以多读两遍,只要输出为高了,一直在执行代码。


  1. int main(void)
  2. {
  3.     WDTCTL = WDTPW | WDTHOLD;   //关闭看门狗
  4.    
  5.     //GPIO口初始化配置;
  6.     P1DIR |= BIT2;   //P1.2作为输出;
  7.     P1OUT |= BIT2;   //P1.2输出高电平;

  8.     P1DIR &= ~BIT3;  //P1.3接按键,作为输入
  9.     P1REN |=BIT3;    //=1,启用内部电阻;
  10.     P1OUT |=BIT3;   //=1,配置成上拉电阻
  11.    
  12.     P1IES |=BIT3;   //下降沿中断
  13.     P1IFG &=~BIT3;  //清除中断标志位
  14.     P1IE |=BIT3;   //使能中断

  15.     _BIS_SR(GIE);  //开启全局中断
  16.     while (1)
  17.     {
  18.         if((P1OUT&BIT2)==0)  
  19.         {
  20.             TA0CTL = TASSEL_1 + MC_1 + TACLR;
  21.             TA0CCTL0 = CCIE;
  22.             TACCR0 = 32768;       //30秒计时
  23.             _BIS_SR(GIE);
  24.         }
  25.         else
  26.             __no_operation();
  27.     }
  28. }
复制代码

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-22 19:50:20   只看该作者
shengxiang 发表于 2019-4-22 14:14
初始化代码供你参考下。

主程序的循环是不对的,你可以多读两遍,只要输出为高了,一直在执行代码。

我在第一个中断设置输出低电平了呀,if语句的循环。。。

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-22 19:52:30   只看该作者
shengxiang 发表于 2019-4-22 14:14
初始化代码供你参考下。

主程序的循环是不对的,你可以多读两遍,只要输出为高了,一直在执行代码。

我看不出循环体的错误。。。

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
发表于 2019-4-22 23:42:27   只看该作者
XHP 发表于 2019-4-22 19:52
我看不出循环体的错误。。。

我把主循环标上号(不考虑代码实现的功能):

P1.2输出高电平:  1-->2--> 7-->1 -->2--> 7 ...  中间是没有休息的
P1.2输出低电平:  1-->2--> 3-->4 -->5--> 6  -->1-->2--> 3-->4 -->5--> 6 ... 中间也是没休息,定时器被不停的初始化配置

  1.     while (1)    (1)
  2.     {
  3.         if((P1OUT&BIT2)==0)    (2)
  4.         {
  5.             TA0CTL = TASSEL_1 + MC_1 + TACLR;   (3)
  6.             TA0CCTL0 = CCIE; (4)
  7.             TACCR0 = 32768;       //30秒计时   (5)
  8.             _BIS_SR(GIE);  (6)
  9.         }
  10.         else
  11.             __no_operation();   (7)
  12.     }
复制代码

1

主题

9

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
发表于 2019-4-23 10:22:19   只看该作者
shengxiang 发表于 2019-4-22 23:42
我把主循环标上号(不考虑代码实现的功能):

P1.2输出高电平:  1-->2--> 7-->1 -->2--> 7 ...  中间是 ...

嗯,这个我通过debug测试出来了,就是定时器初始化后要怎么做才能进入定时器中断?

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
发表于 2019-4-23 11:09:47   只看该作者
XHP 发表于 2019-4-23 10:22
嗯,这个我通过debug测试出来了,就是定时器初始化后要怎么做才能进入定时器中断? ...


建议先学习下MSP430G2553基本的例程操作。

先停止定时器运行;
配置参数;

清除中断标志位;
开启定时器中断;
开启全局中断;


启动计数器,定时器开始跑起来;
快速回复 返回顶部 返回列表