程序目的:
當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;
}
|