音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

為什么mega8的ADC一開(kāi)中斷,雖啟動(dòng)一次AD轉(zhuǎn)換但總是有中斷呢?

作者:xinjie1023 欄目:單片機(jī)
為什么MEGA8的ADC一開(kāi)中斷,雖啟動(dòng)一次AD轉(zhuǎn)換但總是有中斷呢?
AVR高手,我在天河雙龍的MEGA8開(kāi)發(fā)板上把ADC和UART兩個(gè)功能用中斷實(shí)現(xiàn)時(shí)出現(xiàn)怪問(wèn)題(準(zhǔn)確得說(shuō)是UART的接收,ADC轉(zhuǎn)換完成用中斷,在中斷前單片機(jī)工作在空閑模式。),下面使我的程序,我說(shuō)一下我碰到的現(xiàn)象:對(duì)ADC初始化時(shí)的ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);這句話(huà)中的1<<ADIE出現(xiàn)問(wèn)題,沒(méi)有這句話(huà)時(shí)程序可以受到sleep語(yǔ)句的影響,但是開(kāi)了ADC轉(zhuǎn)換結(jié)束的使能中斷后,好像就不行了,開(kāi)AD中斷后就一直有AD的中斷觸發(fā),不知為什么?(我讓程序循環(huán)4次,有了那句話(huà),從第二次循環(huán)開(kāi)始sleep語(yǔ)句就不起作用了)。請(qǐng)高手指點(diǎn)。
    還有我看了別人帖子怎么不能回復(fù)呢?

#include <iom8v.h>
#include <macros.h>
#define fosc 8000000 //晶振8MHZ
#define baud 19200     //波特率
#define osc_address   0x1ff0
unsigned int adc_rel;//AD轉(zhuǎn)換結(jié)果
unsigned int adcd_rel;//AD轉(zhuǎn)換結(jié)果的模擬化
unsigned CHAR adc_mux;//AD通道
unsigned int adc_flag;
#define osccal 0x7d//內(nèi)部RC校正常數(shù)
#define Vref   5//參考電壓值
//ADC完成中斷
#pragma interrupt_handler adc_isr:iv_ADC     
void adc_isr(void)
{
adc_rel=ADC&0x3ff; //得到轉(zhuǎn)換結(jié)果
}

#pragma interrupt_handler Reciverdata:12
//extern unsigned CHAR read_flash(unsigned int add);

/*  字符輸出函數(shù)      */
void putCHAR(unsigned CHAR c)
    {     
     while (!(UCSRA&(1<<UDRE)));//測(cè)到當(dāng)前發(fā)出寄存器為空時(shí)則發(fā)出新數(shù)據(jù)
    UDR=c;    
    }
/*字符串輸出函數(shù)(人為加回車(chē)換行)   */    
int puts(CHAR *s)
    {
    while (*s)
        {
        putCHAR(*s);
        s++;
        }    
    putCHAR(0x0a);//回車(chē)換行
    putCHAR(0x0d);
    return 1;
    }
/* 不含回車(chē)換行的字符串輸出函數(shù)  */    
void putstr(CHAR *s)
    {
    while (*s)
        {
        putCHAR(*s);
        s++;
        }    
    }    

/*  字符輸入函數(shù) */    
unsigned CHAR getCHAR(void)
      {
     while(!(UCSRA& (1<<RXC)));  //如果測(cè)到接收結(jié)束則執(zhí)行下面條語(yǔ)句
     return UDR;
    }    
    
//ADC結(jié)果轉(zhuǎn)換成電壓值
void ADCtoBCD(unsigned int TEMP)
{
// TEMP=(unsigned int)(((unsigned LONG)((unsigned LONG)TEMP*Vref))/0x3ff);
}

void adc_init(void)
{
DDRC=0x00;  //選擇C口的方向,1為輸出
PORTC=0x00; //輸入0,關(guān)閉上拉電阻
ADCSRA = 0x00; //P194,
ADMUX =(1<<REFS0)|(adc_mux&0x0f);//選擇內(nèi)部AVCC為基準(zhǔn)P192
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);//64分頻
}//ADC啟動(dòng),啟動(dòng)一次ADC轉(zhuǎn)換,中斷使能


//接受串口來(lái)的數(shù)據(jù)
void Reciverdata(void)
{
   unsigned CHAR i;
             int j;
     i=getCHAR();
       {
        putstr("當(dāng)前按鍵是:");
        putCHAR(i);
        putCHAR(0x0a);
        putCHAR(0x0d);
        j=i-0x30;
        if((j>=0)&&(j<=3))
        {
        adc_flag=1;
        puts("進(jìn)入AD轉(zhuǎn)換");
        adc_mux=j;
        }
        else
         {
         puts("無(wú)此通道1");
         adc_flag=0;
         }
       }     
}

/*UART初始化*/    
void uart_init(void)
{
// OSCCAL=read_flash(osc_address);//????????
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允許發(fā)送和接收
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數(shù)據(jù)+1位STOP位
  
}

/*RS232通信main函數(shù)*/
void main(void)
{
unsigned CHAR sd;
OSCCAL=osccal;//校正振蕩頻率
  ACSR  =(1<<ACD);//關(guān)閉模擬比較器
  uart_init();
  SREG=0X80;
  MCUCR=(1<<SE);
  asm("sleep");
  MCUCR=(0<<SE);
for(sd=0;sd<4;sd++)   //循環(huán)4次是為了測(cè)試SLLEP的作用以及程序流程的正確性
{
puts("廣州天河雙龍電子公司RS232通信演示程序");
puts("HTTP://WWW.SL.COM.CN");
puts("MAIL TO:sllg@sl.com.cn");
  adc_flag=0;
  MCUCR=(1<<SE);
  asm("sleep");
  MCUCR=(0<<SE);
  puts("測(cè)試休眠轉(zhuǎn)換1");
  MCUCR=(1<<SE);
  asm("sleep");
  MCUCR=(0<<SE);
  puts("再次測(cè)試休眠11");
  if((adc_mux>=0)&&(adc_mux<=3)&&(adc_flag==1))
  {     
        adc_flag=0;
    adc_init(); //ADC初始化,就是這里面開(kāi)中斷出現(xiàn)問(wèn)題
    MCUCR=(1<<SE);
        asm("sleep");
    MCUCR=(0<<SE);
        puts("測(cè)試休眠轉(zhuǎn)換2");
        
        
   }
   else{puts("此次無(wú)正確按鍵");
   }
}
}


2樓: >>參與討論
sinkship
你是不是使能了連續(xù)轉(zhuǎn)換模式?
 
3樓: >>參與討論
xinjie1023
我用的一次轉(zhuǎn)換模式
我用的一次轉(zhuǎn)換模式
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);//64分頻
}//ADC啟動(dòng),啟動(dòng)一次ADC轉(zhuǎn)換,中斷使能

但不知道為什么他多次中斷

4樓: >>參與討論
sinkship
再看看程序哦!
adc_mux=j;這句話(huà)是在
void Reciverdata(void)函數(shù)中;
你主函數(shù)都沒(méi)有執(zhí)行這句話(huà)你怎么進(jìn)下面這句話(huà)的呢?
if((adc_mux>=0)&&(adc_mux<=3)&&(adc_flag==1))

這句話(huà)不進(jìn)你怎么開(kāi)中斷呢?


5樓: >>參與討論
hotpower
我用GCCAVR一點(diǎn)沒(méi)問(wèn)題
 
6樓: >>參與討論
xinjie1023
解釋一下程序的流程先
基本上的流程:
     程序進(jìn)入main(),
     然后關(guān)閉模擬比較器;
     再初始化UART串口;
     后面進(jìn)入休眠狀態(tài)(sleep);
     再用鍵盤(pán)輸入一個(gè)數(shù)(最好小于3),這樣就觸發(fā)了void Reciverdata(void)函數(shù)中;
     從而執(zhí)行了adc_mux=j;這句話(huà)
     從而進(jìn)入for循環(huán)
     初始化ADC,并啟動(dòng)一次ADC轉(zhuǎn)換
     又進(jìn)入 休眠狀態(tài)(sleep);
     當(dāng)AD轉(zhuǎn)換完時(shí),中斷觸發(fā)喚醒MCU,繼續(xù)向下執(zhí)行程序
     后面的幾個(gè)sleep語(yǔ)句理論上是靠鍵盤(pán)輸入數(shù)字喚醒的,(但是就是這里出了問(wèn)題,沒(méi)有其他輸入,AD轉(zhuǎn)換一次后應(yīng)該是不再轉(zhuǎn)換了,但是不知為什么總是進(jìn)AD中斷服務(wù)程序,并且從此好像所有的sleep都不起作用了,只要一有sleep,她就進(jìn)ADC中斷激活sleep)。
     我主要想讓他受sleep語(yǔ)句的控制,同時(shí)按照要求每次循環(huán)只執(zhí)行一次ADC,其他的sleep語(yǔ)句靠輸入數(shù)字激活。
     請(qǐng)高手指教




參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
求助 AVR Studio 4.0如何仿真串口接收發(fā)送
請(qǐng)教ucos_ii移植到mega64后出現(xiàn)的奇怪問(wèn)題?
請(qǐng)問(wèn)CVAVR的散轉(zhuǎn)怎么寫(xiě)阿?
JTAG ICE 能不能低電壓仿真的
WinAVR中如何操作單個(gè)IO口
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)