[AVR单片机] 【求解】M16 AD两通道采集数值一样

[复制链接]
2621|16
 楼主| wnwnwn 发表于 2013-6-6 11:49 | 显示全部楼层 |阅读模式
本帖最后由 wnwnwn 于 2013-6-15 19:43 编辑

麻烦大家帮我看下这段程序,为什么两个通道采集上来得数据都是一样的,而且实时改变输入值,采集无变化。
我在网上查说是要先采集ADCL,然后再采集ADCH数据,可程序确实是先低后高,怎么还是不行呢?


#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

typedef unsigned char INT8U;
typedef unsigned int INT16U;

const PROGMEM INT8U SEG_CODE[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
volatile INT8U Display_Buffer[] = {0, 0, 0, 10, 0, 0, 0, 10};

void ADC_Convert(INT8U CH);

int main(void)
{
        INT8U i;
        DDRA = 0xfc;
        DDRC = 0xff; PORTC = 0x00;
        DDRD = 0xff; PORTD = 0x00;
        ADCSRA = 0xe6;
        SFIOR = 0x00;
        _delay_ms(3000);
        while (1)
        {
                ADC_Convert(0);
                ADC_Convert(1);
                for (i = 0; i < 8; i++)
                {
                        PORTC = 0xff;
                        PORTD = _BV(i);
                        PORTC = pgm_read_byte(&SEG_CODE[Display_Buffer]);
                        if (i == 0 || i == 4)
                             PORTC &= 0x7f;
                        _delay_ms(4);
                }
        }
}

void ADC_Convert(INT8U CH)
{
        INT16U Result;
        if (CH == 0)
                ADMUX = 0x40;
        else
                ADMUX = 0x41;
        //Result = (int)(ADC * 500.0 / 1023.0);
        Result = (INT16U)((ADCL + (ADCH << 8)) * 500.0 / 1024.0);
        Display_Buffer[CH * 4] = Result / 100;
        Display_Buffer[CH * 4 + 1] = Result / 10 % 10;
        Display_Buffer[CH * 4 + 2] = Result % 10;
}





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qin552011373 发表于 2013-6-6 13:52 | 显示全部楼层
程序没有注释啊 你用的哪种采样方式?
 楼主| wnwnwn 发表于 2013-6-6 14:35 | 显示全部楼层
qin552011373 发表于 2013-6-6 13:52
程序没有注释啊 你用的哪种采样方式?

是独立通道连续转换模式
qin552011373 发表于 2013-6-6 16:53 | 显示全部楼层
wnwnwn 发表于 2013-6-6 14:35
是独立通道连续转换模式

你把附件上传一下 回去后帮你看看
宇容创行 发表于 2013-6-6 21:06 | 显示全部楼层
要等ad转换完成后再读
 楼主| wnwnwn 发表于 2013-6-7 09:12 | 显示全部楼层
qin552011373 发表于 2013-6-6 16:53
你把附件上传一下 回去后帮你看看

程序的工程文件和仿真图已经上传了,麻烦您帮着看下吧。:handshake
 楼主| wnwnwn 发表于 2013-6-7 09:12 | 显示全部楼层
宇容创行 发表于 2013-6-6 21:06
要等ad转换完成后再读

那程序应该怎么修改呢?
qin552011373 发表于 2013-6-7 09:30 | 显示全部楼层
wnwnwn 发表于 2013-6-7 09:12
那程序应该怎么修改呢?

把ADC转换完成的中断打开
 楼主| wnwnwn 发表于 2013-6-7 10:07 | 显示全部楼层
qin552011373 发表于 2013-6-7 09:30
把ADC转换完成的中断打开

可是程序当中并没有写中断函数
qin552011373 发表于 2013-6-7 12:51 | 显示全部楼层
wnwnwn 发表于 2013-6-7 10:07
可是程序当中并没有写中断函数

你不回加上啊  程序是你自己写的吗?
 楼主| wnwnwn 发表于 2013-6-7 19:33 | 显示全部楼层
qin552011373 发表于 2013-6-7 12:51
你不回加上啊  程序是你自己写的吗?

不是的,是彭伟那本avr书上的,然后功能实现不了就发帖子问下。
qin552011373 发表于 2013-6-7 20:02 | 显示全部楼层
wnwnwn 发表于 2013-6-7 19:33
不是的,是彭伟那本avr书上的,然后功能实现不了就发帖子问下。

书名?有电子版?我研究下
 楼主| wnwnwn 发表于 2013-6-7 21:12 | 显示全部楼层
qin552011373 发表于 2013-6-7 20:02
书名?有电子版?我研究下

单片机C语言程序设计实训100例:基于AVR+PROTEUS仿真 作者:彭伟
网上很多pdf资源
qin552011373 发表于 2013-6-8 06:45 | 显示全部楼层
wnwnwn 发表于 2013-6-7 21:12
单片机C语言程序设计实训100例:基于AVR+PROTEUS仿真 作者:彭伟
网上很多pdf资源 ...

ok
zezy371 发表于 2013-6-11 16:08 | 显示全部楼层
缺了个等待ADC转换完成的语句
zezy371 发表于 2013-6-11 16:09 | 显示全部楼层
比如while(!(ADCSRA&(1<<ADIF)));

评论

问题已解决,谢谢您啦!  发表于 2013-6-15 19:44
 楼主| wnwnwn 发表于 2013-6-12 09:43 | 显示全部楼层
zezy371 发表于 2013-6-11 16:09
比如while(!(ADCSRA&(1

好的,谢谢您,我去试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部