久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6148|回復: 1
收起左側

大家好,我是新手一枚,遇到關于ADC模塊、及中斷問題,麻煩大家幫忙看看,不勝感激!

[復制鏈接]
ID:65825 發表于 2014-9-5 10:04 | 顯示全部樓層 |閱讀模式
程序目的:
當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;
}

回復

使用道具 舉報

ID:66032 發表于 2014-9-13 15:40 | 顯示全部樓層
你的算法是錯的, 800轉為0x0320, 1200 轉為0x04B0, 你的temp值是在0~4096之間的數,可以以任何形式比較判斷。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费视频一区 | 欧美一区二区三区小说 | 草草在线观看 | 久久精品99 | 在线免费观看视频你懂的 | 国产91精品久久久久久久网曝门 | 亚欧午夜| 国产日韩欧美精品一区二区三区 | 久草中文在线观看 | 久久久www成人免费无遮挡大片 | 国产精产国品一二三产区视频 | 国产999精品久久久 精品三级在线观看 | 国产日韩一区二区三区 | 小h片免费观看久久久久 | 99r在线 | 成人午夜免费在线视频 | 国内久久| 精品日韩一区二区 | 天天射天天干 | 欧美在线视频网 | 东京久久| 中文字幕二区三区 | 亚洲男女激情 | 中文字幕乱码视频32 | 99久久免费精品视频 | 国产一区二区三区四区五区加勒比 | 日韩成人 | 99精品欧美一区二区三区综合在线 | 91在线视频网址 | 精品国产91乱码一区二区三区 | 亚洲国产网 | 一区二区三区久久久 | 国产一卡二卡三卡 | 欧美vide| 尤物视频在线免费观看 | 亚洲精选久久 | 午夜精品一区二区三区在线播放 | 日本理论片好看理论片 | 毛片一级电影 | 精品免费国产视频 | 99热热99 |