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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6121|回復: 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;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人射人人 | 日韩三级 | 成人av在线播放 | 国产精品久久久久久久久久久久久久 | 精品久久久精品 | 日日干夜夜操天天操 | 亚洲v日韩v综合v精品v | 91综合在线视频 | 久久99精品久久久 | 手机看黄av免费网址 | 欧美一级大片免费看 | 日韩伦理一区二区 | 成人欧美一区二区三区在线播放 | 97超碰在线播放 | 超碰在线网站 | 精品国产91乱码一区二区三区 | 久久综合久色欧美综合狠狠 | 国产精品一区二区三 | 国产精品久久久久久久久久妞妞 | 国产成人精品网站 | 日韩免费视频 | 超碰伊人 | 91视频日本 | 在线免费观看黄网 | 精品国产视频 | 亚洲精品二区 | 九九久久精品视频 | 中文字字幕在线中文乱码范文 | 亚洲性在线| 亚洲一区二区三区福利 | 成人在线视频免费观看 | 亚洲欧美在线一区 | 国产精品片 | 国产精品久久久 | av在线免费观看不卡 | 欧美成人黄色小说 | 久久久久久久夜 | 国产色网站| av一区二区三区四区 | 一区二区三区中文字幕 | 久久久久成人精品免费播放动漫 |