3385|0

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

mega16的AD使用问题 [复制链接]

最近要用mega16来做电压采集,但是遇到一个很奇怪的问题,使用手动触发(利用串口中断来触发)的方式来采样,不管AD输入是否变化,转换结果一直是第一次采样的值。但是如果使用自动触发的方式(没有更改SFIO,默认值),采样结果就与AD输入同步变化。代码如下:
手动触发与自动触发
void adc_init()
{
    PORTA = 0X00;         
    DDRA = 0x00;   //ADC通道设置为输入口,高阻态   
    ADMUX |= (1 << REFS0) | (1 << MUX0);   //ADC参考电压为AVcc,选择通道ADC1     
    ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1)| (1 << ADPS0)|(1<串口中断触发用的是这一语句
   // ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1)| (1 << ADPS0)|(1<
   
}
void transfer()
{
        unsigned char data;
        ADCSRA |= (1 << ADSC);     //开始AD转换


}
int main(void)
{
    //DDRA=0x00;    //设置PORTA为输入
    //PORTA=0xff;    //设置为无上拉电阻输入
    DDRB=0x00;    //设置PORTA为输入
    PORTB=0xff;    //设置为无上拉电阻输入
    DDRC=0xff;    //
    PORTC=0x00;    //
    wdt_disable();
    uart_init(); //初始化串口
    adc_init();//初始化AD
    sei();  //开总中断
    while(1);



}

ISR(USART_RXC_vect)
{
    unsigned char status;
    status=UCSRA;    //读取接收状态标志位,必须先读,当读了UDR后,UCSRA便自动清零了
    status=UDR;    //读取USART数据寄存器
    if(status=='o')
    {
         RBI__(PORTC,7);
        transfer();
    }
}

ISR(SIG_ADC)
{
    unsigned char data;
    RBI__(PORTC,6);
    ADCSRA|=(1<     data=ADCH;              
    while((UCSRA&0x20)==0);
        UDR=data;
        data=ADCL;   
    while((UCSRA&0x20)==0);
        UDR=data;

}

[ 本帖最后由 海飏之心 于 2013-6-21 15:22 编辑 ]
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表