|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
求教mega8用中斷同時實現(xiàn)ADC和UART時出現(xiàn)的問題 |
| 作者:xinjie1023 欄目:單片機 |
AVR高手,我在天河雙龍的MEGA8開發(fā)板上把ADC和UART兩個功能用中斷實現(xiàn)時出現(xiàn)怪問題(準確得說是UART的接收,ADC轉(zhuǎn)換完成用中斷,在中斷前單片機工作在空閑模式。),下面使我的程序,我說一下我碰到的現(xiàn)象:對ADC初始化時的ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);這句話中的1<<ADIE出現(xiàn)問題,沒有這句話時程序可以受到sleep語句的影響,但是開了ADC轉(zhuǎn)換結(jié)束的使能中斷后,好像就不行了,我讓程序循環(huán)4次,有了那句話,從第二次循環(huán)開始sleep語句就不起作用了。請高手指點。 還有我看了別人帖子怎么不能回復呢? #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)));//測到當前發(fā)出寄存器為空時則發(fā)出新數(shù)據(jù) UDR=c; } /*字符串輸出函數(shù)(人為加回車換行) */ int puts(CHAR *s) { while (*s) { putCHAR(*s); s++; } putCHAR(0x0a);//回車換行 putCHAR(0x0d); return 1; } /* 不含回車換行的字符串輸出函數(shù) */ void putstr(CHAR *s) { while (*s) { putCHAR(*s); s++; } } /* 字符輸入函數(shù) */ unsigned CHAR getCHAR(void) { while(!(UCSRA& (1<<RXC))); //如果測到接收結(jié)束則執(zhí)行下面條語句 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為基準P192 ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);//64分頻 }//ADC啟動,啟動一次ADC轉(zhuǎn)換,中斷使能 //接受串口來的數(shù)據(jù) void Reciverdata(void) { unsigned CHAR i; int j; i=getCHAR(); { putstr("當前按鍵是:"); putCHAR(i); putCHAR(0x0a); putCHAR(0x0d); j=i-0x30; if((j>=0)&&(j<=3)) { adc_flag=1; puts("進入AD轉(zhuǎn)換"); adc_mux=j; } else { puts("無此通道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次是為了測試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("測試休眠轉(zhuǎn)換1"); MCUCR=(1<<SE); asm("sleep"); MCUCR=(0<<SE); puts("再次測試休眠11"); if((adc_mux>=0)&&(adc_mux<=3)&&(adc_flag==1)) { adc_flag=0; adc_init(); //ADC初始化,就是這里面開中斷出現(xiàn)問題 MCUCR=(1<<SE); asm("sleep"); MCUCR=(0<<SE); puts("測試休眠轉(zhuǎn)換2"); } else{puts("此次無正確按鍵"); } } } |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |