MSP430 AD模块、中断问题,程序进入死循环,跪求指点!

2019-03-24 10:56发布

程序目的:
当ADC采样值Temp与参考值target的差在给定区间范围内时,无操作;
当ADC采样值与参考值target的差超出区间上限时,4个LED灯向一个方向轮留灭(同时,逐步增大target的值,目的是使得两者的差最后停在区间内);
同理,当两者差低于区间下限时,4个LED灯向另外一个方向轮留灭(同时,逐步减小target的值,目的是使得两者的差最后停在区间内);

问题所在:
我们在改变模拟信号大小(-800mV~1200mV)的过程中,发现一开始LED会按着预想的根据三种情况分别停止不动、正向流动、或者反向流动。但是几秒后LED 就停滞在任意一种状态了,然后不管怎样改变模拟信号,LED都无动于衷。
我们猜测可能是哪里进入死循环了,也可能是我们的两个中断程序有问题(timerB的中断是0.5秒一次,就是LED轮流灭掉的间隔时间),但是我们不知道具体问题在哪里。

跪求各位大侠拔刀相助,感恩不尽!!!
#include "in430.h"

#include <msp430x14x.h>
#include "Config.h"


//////////////////////////////////////////////   变量声明



uchar flag2;
static uchar Flag=0;
uint count;
uint TEMP;
uint target;

////////////////////////////////////////////////////////////  函数定义

void ADC_Init()
{
  

                                     //选择ADC通道,设置对应IO口的功能模式
  ADC12CTL0|= ADC12ON + SHT0_7 + REF2_5V + REFON;//+ADC12OVIE; //ADC电源控制开,16个CLK

  ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0;            //SMCLK做时钟源
  ADC12MCTL0= SREF0 + INCH_0;                     //参考控制位及通道选择
  ADC12IE|= 0x01;                                 //中断允许
   ADC12CTL0|= ENC;
                               //使能转换器
}

void Port_Init()
{  
  
  P6DIR |=0xff;
  P6OUT &= 0x00;
  
  P6DIR &= ~BIT0;
  P6SEL|=0x01;
  
}

void motor_zheng(unsigned int LED_NUM)            // LED正向转
{
    switch(LED_NUM)
    {
        case 0
          LED8 =BIT4;
          break;
        case 1:
          LED8 =BIT;
          break;
        case 2:
          LED8 =BIT6;
          break;
        case 3:
          LED8 =BIT7;
          break;
   
         
        default
          _NOP();
          break;
    }
}

void motor_fan(unsigned int LED_NUM)              // LED反向转
{
    switch(LED_NUM)
    {
        case 0:
          LED8 =BIT7
          break;
        case 1:
          LED8 =BIT6
          break;
        case 2:
          LED8 =BIT5
          break;
        case 3:
          LED8 =BIT4
          break;
        default:
          _NOP()
          break;
    }
}


void motor_control(uint t)            // LED在三种情况下的运动模式 综合函数——control
{
  if(flag2==1)
  {
   if(TEMP<0x0800)
   {
    if(0x0800-TEMP>0x0100)
    {
      count++;
      motor_zheng(count%4);  
    }
   
    else
     _NOP()
   
   else
   {
     if(TEMP-0x0800>0x0100)
    {
      count++;
      motor_fan(count%4);
    }
    else
       _NOP()
   }
   flag2=0
  }
  else
    _NOP();
}






//***********************************************************************
//                   系统时钟初始化,外部8M晶振
//***********************************************************************
void Clockk_Init()
{
  uchar i;
  
  BCSCTL1 |=DIVA_3;
  BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清楚振荡器错误标志
    for(i=0;i<100;i++)
       _NOP();
  }
  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  IFG1&=~OFIFG;
}


void timerb_init()
{
  TBCTL=TBCLR+TASSEL_1+ID_2+MC_1;
  TBCCTL0= CCIE;
  TBCCR0=512;
}

///////////////////////////////////////////////////////////////////////////////////////////    main 函数

int main( void )
{

  WDTCTL = WDTPW + WDTHOLD;
  timerb_init();
  Clockk_Init();
  Port_Init();
  ADC_Init();
  _EINT();                            //使能中断
  Flag=1;  
  
  target=0x0800;
                          
while(1)
  {
    while(Flag==1)
    {
      ADC12CTL0 |= ADC12SC;           //开启转换

      ADC12CTL0 &= ~ADC12SC;          //清零
      Flag=0;                         //清零标志位
     
    }
    motor_control(target);
   
  }

  return 0;
}


//*************************************************************************
//    ADC中断服务程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
      
  while(ADC12OVIE==1){P6OUT &=~BIT3;};

P6OUT |=BIT3;
  Flag = 1 ;
  TEMP = ADC12MEM0 ;                     //读取ADC转换值
if(TEMP>0x0800)
  P6OUT &= ~BIT2;
  else
    P6OUT |= BIT2;
     
}

#pragma vector=TIMERB0_VECTOR
__interrupt void TIMERB_ISR(void)
{
      flag2=1;
      TBCTL &=~TBIFG;
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
armcu
2019-03-24 23:14
不好猜,楼主可以一个模块一个模块的调,调好后在组合嘛

一周热门 更多>

相关问题

    相关文章