|
|||||||||||
| 技術(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 |
天啊老問(wèn)題.8535A/D..有誰(shuí)也用么?看看啦 |
| 作者:cosinfu 欄目:單片機(jī) |
AT90S8535還是老問(wèn)題,我上次問(wèn)過(guò)了,我檢查以后,發(fā)現(xiàn)硬件也沒(méi)問(wèn)題啊,參考電壓 LM336-5V提供,AVCC VCC沒(méi)問(wèn)題, AGND GND 沒(méi)問(wèn)題啊 可就是A/D出不來(lái),管叫沒(méi)壞 幾天了,都急死了 有人也用這個(gè)8535A/D的么? 有什么應(yīng)該注意的?或者我沒(méi)想到的地方? 書上沒(méi)說(shuō)明白的地方? 謝謝啦 我得程序只要為 .include "8535def.inc" .def adhbyte=r21 .def adlbyte=r20 .def TEMP=r16 .org $0000 rjmp reset .org $0010 reset: ;棧指針 ldi r16,low(ramend) out spl,r16 ldi r16,high(ramend) out sph,r16 ;端口設(shè)置 ser TEMP ;B,C,D 都設(shè)為輸出 out ddrb,TEMP out ddrd,TEMP out ddrc,TEMP clr TEMP ;A口 模擬輸入 out ddra,TEMP out porta,TEMP clt ldi TEMP,$07 ;第一次啞轉(zhuǎn)換,數(shù)據(jù)部計(jì) out admux,TEMP ldi TEMP,$86 out adcsr,TEMP sbi adcsr,adsc ADWAit: sbic adcsr,adsc rjmp ADWAit in adlbyte,adcl in adhbyte,adch ldi r17,$00 ldi r18,$00 ldi r25,10 ;轉(zhuǎn)換10次 compae: ldi TEMP,$07 ;第七通道 out admux,TEMP ldi TEMP,$86 ;無(wú)中斷,單次轉(zhuǎn)換 out adcsr,TEMP sbi adcsr,6 ADWAi1t1: ;等待轉(zhuǎn)換完畢 sbic adcsr,6 rjmp ADWAi1t1 ADWA: sbis adcsr,4 rjmp ADWA cbi adcsr,adif in adlbyte,adcl ;取數(shù)據(jù) in adhbyte,adch andi adhbyte,$03 mov r27,adlbyte ;r27.r28為作后一次轉(zhuǎn)換的值 mov r28,adhbyte add r17,adlbyte ;r17,r18為十次轉(zhuǎn)換的和 adc r18,adhbyte rcall delay ;延時(shí)5ms dec r25 brne compae ;中間調(diào)用除法,r17,r18最后為原來(lái)的1/10 ---略 okay: cp r17,r27 brne compae cp r18,r28 brne compae ;該段我想看看十次平均和最后一次是否相等 mov TEMP,r18 ;結(jié)果輸出到B.D口.看其結(jié)果 out portd,TEMP mov TEMP,r17 out portb,TEMP ;延時(shí)略 結(jié)果老是 輸入模擬電壓5V 11 11111111 0v 00 00000000 其它輸入 要么是 00 00000000 要么是00 00001111 難道A/D會(huì)壞????? 另外我用A/D中斷來(lái)測(cè)試,結(jié)果也是一樣,郁悶啊 .include"8535def.inc" .org $0000 rjmp reset .org $000e rjmp inter .def hledbyte=r19 .def lledbyte=r18 .def TEMP=r16 reset: ldi TEMP,$02 out sph,TEMP ldi TEMP,$5f out spl,TEMP ldi TEMP,$ff out ddrb,TEMP out ddrd,TEMP out ddrc,TEMP clr TEMP out ddra,TEMP out pina,TEMP main: clt sei rcall conini ;調(diào)用A/D初始化 wait: brtc wait ;等待中斷 clt ldi r20,100 start: out portc,lledbyte out portb,hledbyte rcall delay dec r20 brne start rjmp main inter: in lledbyte,adcl in hledbyte,adch cbi adsc,6 set reti conini: ldi TEMP,$8d out adcsr,TEMP ldi TEMP,$07 out admux,TEMP sbi adcsr,6 ret |
| 2樓: | >>參與討論 |
| 作者: techwell 于 2003/4/9 23:59:00 發(fā)布:
我大約在前年用過(guò)8535的AD,沒(méi)什么問(wèn)題呀! 我大約在前年用過(guò)8535的AD(ICCAVR編譯的),沒(méi)什么問(wèn)題呀! |
|
| 3樓: | >>參與討論 |
| 作者: coke 于 2003/5/31 17:00:00 發(fā)布:
沒(méi)有問(wèn)題 我多次用了8535 ADC.絕對(duì)沒(méi)有問(wèn)題.效果很好!告訴我E-mail.我現(xiàn)在沒(méi)有時(shí)間.OK |
|
| 4樓: | >>參與討論 |
| 作者: zlei 于 2003/5/31 17:01:00 發(fā)布:
8535 A/D #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include "global.h" #include "a2d.h" // 定義全局變量 //! 定義一個(gè)軟件標(biāo)志位,用來(lái)指示A/D轉(zhuǎn)換是否完成 volatile unsigned CHAR a2dCompleteFlag; //! ADC完成中斷的ISR SIGNAL(SIG_ADC) { // 置軟件標(biāo)志位,表明A/D轉(zhuǎn)換已經(jīng)完成 a2dCompleteFlag = TRUE; } // 函數(shù)、實(shí)現(xiàn)部分 //! 初始化A/D轉(zhuǎn)換器 void a2dInit(void) { sbi(ADCSR, ADEN); // 使能 ADC cbi(ADCSR, ADFR); // 設(shè)置為單次轉(zhuǎn)化模式 a2dSetPrescaler(ADC_PRESCALE); // 設(shè)置預(yù)分頻(使用默認(rèn)值) a2dSetReference(ADC_REFERENCE); // 設(shè)置參考電壓(使用默認(rèn)值) // cbi(ADMUX, ADLAR); // 設(shè)置A/D轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器的移位方式 sbi(ADCSR, ADIE); // 使能ADC完成中斷 a2dCompleteFlag = FALSE; // 清A/D轉(zhuǎn)換完成的軟件標(biāo)志位 sei(); // 打開(kāi)中斷 } //! 關(guān)閉A/D轉(zhuǎn)換 void a2dOff(void) { cbi(ADCSR, ADIE); // 禁用ADC完成中斷 cbi(ADCSR, ADEN); // 禁用A/D轉(zhuǎn)換 } //! 設(shè)置A/D轉(zhuǎn)換時(shí)鐘(預(yù)分頻) void a2dSetPrescaler(unsigned CHAR prescale) { outp( ((inp(ADCSR) & ~ADC_PRESCALE_MASK) | prescale), ADCSR); } //! 設(shè)置參考電壓 void a2dSetReference(unsigned CHAR ref) { outp( ((inp(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)), ADMUX); } //! 設(shè)置A/D轉(zhuǎn)換的輸入通道 void a2dSetChannel(unsigned CHAR ch) { outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX); // 設(shè)置通道 } //! 開(kāi)始一個(gè)A/D轉(zhuǎn)換(在當(dāng)前通道) void a2dStartConvert(void) { sbi(ADCSR, ADIF); // 清ADC轉(zhuǎn)換完成的硬件標(biāo)志位 sbi(ADCSR, ADSC); // 開(kāi)始A/D轉(zhuǎn)換 } //! 當(dāng)A/D轉(zhuǎn)換完成時(shí),返回 TRUE u08 a2dIsComplete(void) { return bit_is_set(ADCSR, ADSC); } //! 執(zhí)行一個(gè)10位的A/D轉(zhuǎn)換 // 開(kāi)始A/D轉(zhuǎn)換,并等待;直到A/D轉(zhuǎn)換完成,然后返回結(jié)果 unsigned SHORT a2dConvert10bit(unsigned CHAR ch) { a2dCompleteFlag = FALSE; // 清ADC轉(zhuǎn)換完成的軟件標(biāo)志位 outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX); // 設(shè)置通道 sbi(ADCSR, ADIF); // 清ADC轉(zhuǎn)換完成的硬件標(biāo)志位 sbi(ADCSR, ADSC); // 開(kāi)始A/D轉(zhuǎn)換 //while(!a2dCompleteFlag); // 等待,直到A/D轉(zhuǎn)換完成 //while( bit_is_clear(ADCSR, ADIF) ); // 等待,直到A/D轉(zhuǎn)換完成 while( bit_is_set(ADCSR, ADSC) ); // 等待,直到A/D轉(zhuǎn)換完成 // 注意: 先讀 ADCL,再讀 ADCH !!! return (inp(ADCL) | (inp(ADCH)<<8)); // 讀ADC(10 位) } //! 執(zhí)行一個(gè)8位的A/D轉(zhuǎn)換 // 開(kāi)始A/D轉(zhuǎn)換,并等待;直到A/D轉(zhuǎn)換完成,然后返回結(jié)果 unsigned CHAR a2dConvert8bit(unsigned CHAR ch) { // 執(zhí)行一個(gè)10位的A/D轉(zhuǎn)換,并返回其高8位 return a2dConvert10bit(ch)>>2; // 返回 } |
|
| 5樓: | >>參與討論 |
| 作者: zlei 于 2003/5/31 17:02:00 發(fā)布:
8535 A/D 的頭文件 #ifndef A2D_H #define A2D_H // 定義宏 // A/D轉(zhuǎn)換時(shí)鐘預(yù)分頻選擇: // *默認(rèn)情況下,A/D轉(zhuǎn)換的逐次比較轉(zhuǎn)換電路需要一個(gè)50KHz~200KHz // 之間的采樣時(shí)鐘。采樣時(shí)鐘=CPU時(shí)鐘/預(yù)分頻值。 // *在要求轉(zhuǎn)換精度低于10位的情況下,A/D轉(zhuǎn)換的采樣時(shí)鐘可以高于200KHz // 以獲得更高的采樣率。 // *低的采樣率(高的預(yù)分頻值),可以獲得更高的采樣精度。 #define ADC_PRESCALE_DIV2 0x00 ///< 0x01,0x00 -> CPU clk/2 #define ADC_PRESCALE_DIV4 0x02 ///< 0x02 -> CPU clk/4 #define ADC_PRESCALE_DIV8 0x03 ///< 0x03 -> CPU clk/8 #define ADC_PRESCALE_DIV16 0x04 ///< 0x04 -> CPU clk/16 #define ADC_PRESCALE_DIV32 0x05 ///< 0x05 -> CPU clk/32 #define ADC_PRESCALE_DIV64 0x06 ///< 0x06 -> CPU clk/64 #define ADC_PRESCALE_DIV128 0x07 ///< 0x07 -> CPU clk/128 // 默認(rèn)值 #define ADC_PRESCALE ADC_PRESCALE_DIV64 // 不要改變掩碼值。 #define ADC_PRESCALE_MASK 0x07 // A/D轉(zhuǎn)換的參考電壓選擇 #define ADC_REFERENCE_AREF 0x00 ///< 0x00 -> AREF引腳電壓, 關(guān)閉內(nèi)部VREF #define ADC_REFERENCE_AVCC 0x01 ///< 0x01 -> AVCC引腳電壓, 關(guān)閉內(nèi)部VREF #define ADC_REFERENCE_RSVD 0x02 ///< 0x02 -> 預(yù)留 #define ADC_REFERENCE_256V 0x03 ///< 0x03 -> 使用內(nèi)部2.56V VREF // 默認(rèn)值 #define ADC_REFERENCE ADC_REFERENCE_AVCC // 不要改變掩碼值! #define ADC_REFERENCE_MASK 0xC0 // ADC通道選擇器的位掩碼 #define ADC_MUX_MASK 0x1F // 定義通道號(hào) #define ADC_CH_ADC0 0x00 #define ADC_CH_ADC1 0x01 #define ADC_CH_ADC2 0x02 #define ADC_CH_ADC3 0x03 #define ADC_CH_ADC4 0x04 #define ADC_CH_ADC5 0x05 #define ADC_CH_ADC6 0x06 #define ADC_CH_ADC7 0x07 #define ADC_CH_122V 0x1E // 1.22V 參考電壓 #define ADC_CH_AGND 0x1F // AGND // 以下這些通道只有在ATMEGA128里有 // 差分輸入和增益控制 #define ADC_CH_0_0_DIFF10X 0x08 #define ADC_CH_1_0_DIFF10X 0x09 #define ADC_CH_0_0_DIFF200X 0x0A #define ADC_CH_1_0_DIFF200X 0x0B #define ADC_CH_2_2_DIFF10X 0x0C #define ADC_CH_3_2_DIFF10X 0x0D #define ADC_CH_2_2_DIFF200X 0x0E #define ADC_CH_3_2_DIFF200X 0x0F // 差分輸入 #define ADC_CH_0_1_DIFF1X 0x10 #define ADC_CH_1_1_DIFF1X 0x11 #define ADC_CH_2_1_DIFF1X 0x12 #define ADC_CH_3_1_DIFF1X 0x13 #define ADC_CH_4_1_DIFF1X 0x14 #define ADC_CH_5_1_DIFF1X 0x15 #define ADC_CH_6_1_DIFF1X 0x16 #define ADC_CH_7_1_DIFF1X 0x17 #define ADC_CH_0_2_DIFF1X 0x18 #define ADC_CH_1_2_DIFF1X 0x19 #define ADC_CH_2_2_DIFF1X 0x1A #define ADC_CH_3_2_DIFF1X 0x1B #define ADC_CH_4_2_DIFF1X 0x1C #define ADC_CH_5_2_DIFF1X 0x1D // 聲明函數(shù)原形 //! 初始化A/D轉(zhuǎn)換器 void a2dInit(void); //! 關(guān)閉A/D轉(zhuǎn)換 void a2dOff(void); //! 設(shè)置A/D轉(zhuǎn)換時(shí)鐘(預(yù)分頻) // 本函數(shù)會(huì)自動(dòng)地被a2dInit()調(diào)用 // 從而在初始化A/D轉(zhuǎn)換器時(shí),設(shè)置一個(gè)默認(rèn)值 void a2dSetPrescaler(unsigned CHAR prescale); //! 設(shè)置參考電壓 // 本函數(shù)會(huì)自動(dòng)地被a2dInit()調(diào)用 // 從而在初始化A/D轉(zhuǎn)換器時(shí),設(shè)置一個(gè)默認(rèn)值 void a2dSetReference(unsigned CHAR ref); //! 設(shè)置A/D轉(zhuǎn)換的輸入通道 void a2dSetChannel(unsigned CHAR ch); //! 開(kāi)始一個(gè)A/D轉(zhuǎn)換(在當(dāng)前通道) void a2dStartConvert(void); //! 當(dāng)A/D轉(zhuǎn)換完成時(shí),返回 TRUE u08 a2dIsComplete(void); //! 執(zhí)行一個(gè)10位的A/D轉(zhuǎn)換 // 開(kāi)始A/D轉(zhuǎn)換,并等待;直到A/D轉(zhuǎn)換完成,然后返回結(jié)果 unsigned SHORT a2dConvert10bit(unsigned CHAR ch); //! 執(zhí)行一個(gè)8位的A/D轉(zhuǎn)換 // 開(kāi)始A/D轉(zhuǎn)換,并等待;直到A/D轉(zhuǎn)換完成,然后返回結(jié)果 unsigned CHAR a2dConvert8bit(unsigned CHAR ch); #endif |
|
| 6樓: | >>參與討論 |
| 作者: zlei 于 2003/5/31 17:06:00 發(fā)布:
以上代碼是在winavr 上的 測(cè)試通過(guò),效果很好。請(qǐng)根據(jù)需要,加入濾波代碼。 如果再不行,可能是電路問(wèn)題。 |
|
| 7樓: | >>參與討論 |
| 作者: coke 于 2003/6/1 17:18:00 發(fā)布:
試一試. 首先﹕ 你把ldi TEMP,$86改為 ldi TEMP,$e6 試一試. |
|
| 8樓: | >>參與討論 |
| 作者: jfzjfz 于 2003/6/1 19:35:00 發(fā)布:
應(yī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) |