搜索
bottom↓
回复: 10

求求帮忙看下这个程序啊,timerA的问题。完全无法理解啊。

[复制链接]

出0入0汤圆

发表于 2014-1-15 23:25:12 | 显示全部楼层 |阅读模式
本来想做一个一秒翻转一次的LED,写出来根本不是这样一回事啊。用的CCR0 50000,up-down mode. 全局变量i 累加来定时。但是每次进中断i 能加1,但是出中断之后i 又清零了啊。怎么回事啊。脑袋都要爆炸了啊。

#include <msp430g2553.h>

unsigned char i=0;

void main()
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
if((CALBC1_1MHZ==0xff)||(CALDCO_1MHZ==0xff))  //切换DCO频率         
    while(1);
  else
  {
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1= CALBC1_1MHZ;
  }
  
    TACTL = TASSEL_2 + TAIE + MC_3;                      //SMCLK
  CCR0 = 50000;
  CCTL0 = CCIE;
    P1DIR |= BIT0;
    _EINT();
    LPM0;
    while(1);
}


#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  i++;
   if(i>=10)
  {
    i=0;
    P1OUT ^= BIT0;
  }
  _NOP();
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-1-16 09:52:44 | 显示全部楼层
volatile unsigned char i=0;

出0入0汤圆

 楼主| 发表于 2014-1-16 18:14:33 | 显示全部楼层
helloshi 发表于 2014-1-16 09:52
volatile unsigned char i=0;

我使用了volatile 之后还是一样。传不出去。。。我又把程序改成这样了,更直观。结果就是跑不到最下面去。

#include <msp430g2553.h>

unsigned char i;

void main()
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  if((CALBC1_1MHZ==0xff)||(CALDCO_1MHZ==0xff))  //切换DCO频率         
    while(1);
  else
  {
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1= CALBC1_1MHZ;
  }
  
  i=0;
  TACTL = TASSEL_2 + TAIE + MC_1;                      //SMCLK
  CCR0 = 50000;
  CCTL0 = CCIE;
  P1DIR |= BIT0;
  _EINT();
  //LPM0;
  while(i!=20);
  while(1);
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void ctimer_A0(void)
{
  i++;
}

他根本就没法跑到最后。debug 下载之后点GO, 等个几十秒stop了看还是 i=0。在定时器里面设一个break, 然后点go, 就发现i 会累加,然后再突然某次随机的go之后就又清零了(一般不会累加过10,go几次就清零了)。神啊。我这是在和谁玩啊。

出0入0汤圆

 楼主| 发表于 2014-1-16 18:29:38 | 显示全部楼层
我用指针来传也传不出去。这种感觉好像是学了10年的1+1突然不等于2了啊。。。我整个人都要崩溃了。。。

出0入0汤圆

 楼主| 发表于 2014-1-19 07:32:31 | 显示全部楼层
问题找到了,但是不知道为什么会产生这个问题。在CCTL中打开了CCIE,在TACTL中打开了TAIE. 两个中断都打开之后程序就复位了。

出0入0汤圆

发表于 2014-1-20 10:51:09 | 显示全部楼层
我记得CCTL0中的中断是单独一个中断服务函数。
故两个都开的话,复位了肯定是少一个中断服务函数的入口。

出0入0汤圆

 楼主| 发表于 2014-1-21 04:24:51 | 显示全部楼层
dalarang 发表于 2014-1-20 10:51
我记得CCTL0中的中断是单独一个中断服务函数。
故两个都开的话,复位了肯定是少一个中断服务函数的入口。 ...

是的,一个向量是TIMER0-A0,一个向量是TIMER0-A1

出0入0汤圆

发表于 2014-1-25 22:30:41 | 显示全部楼层
如果没有猜错的话,你的系统在一直复位中...........

出0入0汤圆

 楼主| 发表于 2014-1-28 02:08:10 | 显示全部楼层
activeleo 发表于 2014-1-25 22:30
如果没有猜错的话,你的系统在一直复位中...........

是的。。。

出0入0汤圆

发表于 2014-1-28 09:19:36 | 显示全部楼层
仿真......好好分析下!

出0入0汤圆

发表于 2014-2-11 14:23:50 | 显示全部楼层
你用连续计数模式打开了溢出中断又没有写对应的中断服务函数,溢出中断发生时装载中断向量,由于没有写对应的中断服务函数,中断向量指向0,程序就会跳到启动位置,发生复位,msp430使能的中断必须写中断函数,哪怕是空函数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 09:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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