求助ADC相关问题....死活调不通....
本帖最后由 424778940 于 2013-7-23 19:08 编辑如题...第三贴了...
我真心认真读了一遍手册,也看了很多人的代码,而且adc也就那么几个寄存器,想搞错都难啊...(当然,也总觉得这问题一定是我什么地方搞错了...)
我直接把别人的代码完全搬进去,依旧不行,难道是芯片有问题么...型号是mega128A和mega1280,均做过测试,结果一样
现在的情况是,用自带内部通道(1.23v)测试没问题,内部gnd也没问题,数据都正常
可是只要使用adc0-adc7单通道来转换,就无法得到正确结果,无论我把通道接地还是接vcc,都是跟悬空时候一样的一个相对稳定的值
代码如下/*
* lib_adc.cpp
*
* Created: 2013/7/17 16:43:14
*Author: Adam
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "d:/works/avr/bzh_avr_lib/device/usart/lib_usart.h"
#include "d:/works/avr/bzh_avr_lib/system/lib_delay.h"
//vin = adc * vref /1024
volatile unsigned char adc_cache_h = 0x00,adc_cache_l = 0x00;
volatile unsigned int adc_vin = 0x0000;
ISR(ADC_vect,ISR_BLOCK)
{
adc_cache_l = ADCL;
adc_cache_h = ADCH;
usart_0_send_char(0xff);//固定字节,用于确定开头位置
usart_0_send_char(adc_cache_l);
usart_0_send_char(adc_cache_h);
//adc_vin |= ( (adc_cache_h<<8) | (adc_cache_l<<8) );
}
int main(void)
{
usart_0_init();
//ADC PORT DDR INIT
DDRA = 0x00;
PORTA = 0x00;
//ADC REG INIT
ADCSRA = 0x00;
ADMUX = 0x00;
ADCSRA |= ( (1<<ADIE) | (1<<ADEN) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) );
ADMUX |= (1<<REFS0);
//ADMUX |= ( (1<<REFS0) | (1<<MUX0) );
//ADMUX |= ( (1<<REFS0) | (1<<ADLAR) );
sei();
while (1)
{
//usart_0_send_char(0xf0);
delay_reduce(80000);
ADCSRA |= (1<<ADSC);
}
} 话说...马老师呢? = =....人都那里去了.,... 现在放假,每天都会来看的。已经几天了,没有人给你帮助。这个问题应该属于基本的基础类错误,我也不愿意作更多的解释。按我的性格,希望你从最基本的开始,一步一步的、扎扎实实的进步。
我认为我的教程中的例子应该可以解决你的这个问题。你买本吧,认真研读肯定有收获的,如果你准备作这个行当5年。 machao 发表于 2013-7-25 19:54 static/image/common/back.gif
现在放假,每天都会来看的。已经几天了,没有人给你帮助。这个问题应该属于基本的基础类错误,我也不愿意作 ...
谢谢马老师,不过问题已经解决了,确实是个低级错误= =...
程序和硬件都没有任何问题,只是我有根线接错了= =...
avr的adc相关寄存器都叫ADxxxx,于是我把porta的AD0-AD7当成adc了,换到portf就好了 现在也在搞mega128,
mega128和mega16还是有些地方不一样的。。。
页:
[1]