程序目的:
当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;
}
此帖出自
小平头技术问答
一周热门 更多>