[AVR单片机] 求助:那位帮看看这个AD采集程序出什么问题了

[复制链接]
3265|6
 楼主| cmy043 发表于 2011-5-28 16:03 | 显示全部楼层 |阅读模式
如果先进入外部中断0  能正常显示AD0通道采集的电压值  再进入外部中断1 也可以正常显示AD1通道采集的AD值  但这时再进入外部中断0 显示的却是AD1通道的值
还有 如果先进入外部中断1就只能显示AD1通道的值 再进入外部中断0还是显示AD1的值

#include <iom128v.h>                                      //AVR  M128  8M内部晶振
#include <macros.h>

float temp;

#pragma interrupt_handler int0_isr:2                       

void int0_isr(void)                                        //外部中断0
{

ADCSRA=0x00;
ADMUX|=0x00;                                            //选择AD0通道
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC);
while(!(ADCSRA&(1<<ADIF)));
ADCSRA|=~(1<<ADIF);
}


#pragma interrupt_handler int1_isr:3

void int1_isr(void)                                         //外部中断1
{

ADCSRA=0x00;
ADMUX|=0x01;                                              //选择AD1通道
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC);
while(!(ADCSRA&(1<<ADIF)));
  ADCSRA|=~(1<<ADIF);

}

#pragma interrupt_handler AD0:22

void AD0(void)                                           //AD中断
{
temp=((float)(ADC))*(5.000/1024.0);
Seg7_Led_float(temp);
}

void main(void)
{

DDRD=0xff;
PORTD=0xff;
CLI();
EICRA|=0X00;
EIMSK|=(1<<INT0)|(1<<INT1);
SEI();

while(1)
   {
    ;
    }
928315 发表于 2011-5-29 10:37 | 显示全部楼层
是不是数据读取的高位,低位问题,我记得好像数据没有读取到,会保持到下一次采样。

不过在中断里面做temp=((float)(ADC))*(5.000/1024.0)这样的运算确实不好。
 楼主| cmy043 发表于 2011-5-29 23:06 | 显示全部楼层
2# 928315
那请问应该怎么样处理啊 ??
uabuntsu 发表于 2011-7-30 16:47 | 显示全部楼层
问题出在你给通道赋值上,你一开始是ADMUX|=0x00; 然后变成了ADMUX|=0x01;  下一次你希望是变成ADMUX|=0x00; 但是,ADMUX|=0x01;  执行之后,寄存器就是0x01了,你用0x00和0x01相与,结果是多少?还是0x01吧??这就是你的原因了!为了避免这样的问题,在赋值通道之前,首先对通道进行清零操作。
huiyuan2000 发表于 2011-8-1 16:15 | 显示全部楼层
长见识了 谢谢
joyme 发表于 2011-8-4 11:21 | 显示全部楼层
4楼正解,如果多通道采样,AD采样中断读数据后应该关闭所有AD通道,下一次触发在打开相应通道即可,带浮点运算应该放在主程序里做,把AD值保存到buffer里,置一个标志位,主程序查询标志位再做处理
selloy 发表于 2011-8-8 17:00 | 显示全部楼层
学习了!~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

27

帖子

0

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