|
|||||||||||
| 技術(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ī) |
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 于 2005/12/1 23:19:00 發(fā)布:
你是不是使能了連續(xù)轉(zhuǎn)換模式? |
|
| 3樓: | >>參與討論 |
| 作者: xinjie1023 于 2005/12/2 15:51:00 發(fā)布:
我用的一次轉(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 于 2005/12/2 23:50:00 發(fā)布:
再看看程序哦! 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 于 2005/12/2 23:57:00 發(fā)布:
我用GCCAVR一點(diǎn)沒(méi)問(wèn)題 |
|
| 6樓: | >>參與討論 |
| 作者: xinjie1023 于 2005/12/3 16:14:00 發(fā)布:
解釋一下程序的流程先 基本上的流程: 程序進(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)高手指教 |
|
|
|
| 免費(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) |