搜索
bottom↓
回复: 14

请教傻孩子,关于avr连续自由转换模式的疑问

[复制链接]

出0入0汤圆

发表于 2011-11-8 12:35:53 | 显示全部楼层 |阅读模式
请教版主,有个疑问:书上看到只要置位ADFR就会工作在连续转换模式下,这个连续转换模式指的是什么,帖子地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=864509
我也有同样的疑问,发了几个关于这方面的帖子,但至今没有得到合理解释,请指教。

出0入0汤圆

发表于 2011-11-8 13:09:28 | 显示全部楼层
还没弄好??

给你贴个gcc的例子吧。话说这类问题再不明白用软件仿真也能试验出来了。

#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>


volatile uint16_t adc_value;
ISR(ADC_vect){
        adc_value = ADCL;
        adc_value |= (ADCH<<8);
}


void adc_init(void){
        ADMUX = (1<<REFS0)|(1<<MUX1)|(1<<MUX0);
        SFIOR = 0x00;
        ADCSRA = (1<<ADEN)|(1<<ADATE)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS0);
}
int main(void){

    DDRA = 0x00;
    PORTA = 0x00;
         sei();
         adc_init();
    while(1){
        /***************/
    };

}

出0入0汤圆

 楼主| 发表于 2011-11-8 13:23:43 | 显示全部楼层
花生锅:我不会用gcc,因此得不到你的.hex文件,怎么防真啊?你确定你方针过了?你确定你的程序能在第二次进入中断?还有初始化时候为什么要设置模拟比较器相关的寄存器?
有时间我把我的cvavr程序和仿真程序发上来,你分析一下我的为什么无发启动第二次转换。

出0入0汤圆

 楼主| 发表于 2011-11-8 13:32:45 | 显示全部楼层
还有初始化时候为什么要设置模拟比较器相关的寄存器?
原来是为了省电啊,我还以为模拟比较器的设置对adc有影响呢。再次谢谢回复

出0入0汤圆

发表于 2011-11-8 13:38:20 | 显示全部楼层
ACSR = 1<<ACD; 是禁用比较器,这里可以先不考虑它。

俺仿真过的。。在别的帖子里我给你回复过:

ADCSRA   – ADATE: ADC 自动触发使能
SFIOR  – ADTS2:0: ADC 自动触发源

出0入0汤圆

 楼主| 发表于 2011-11-8 13:47:25 | 显示全部楼层
后两个寄存器我懂的……哈
我的程序的流程和你上面给出的是一样的,但是我的只能中断一次,我在studio里仿真的,ad转换一次就停了。怎么回事?

出0入0汤圆

 楼主| 发表于 2011-11-8 13:58:42 | 显示全部楼层
这是我的c程序(cvavr)、调试文件和proteus仿真文件:点击此处下载 ourdev_693002CO9OT5.rar(文件大小:68K) (原文件名:连续自由AD转换实验程序(中断).rar)

你可以用studio仿真一下,看ad相关寄存器的状态,重点看adsc位和adif位,你会看到第一次能正常转换,进入中断以后adsc就一直为0了,ad也就停止转换了。

出0入0汤圆

发表于 2011-11-8 14:33:18 | 显示全部楼层
#include <avr\io.h>              // Most basic include files
#include <avr\interrupt.h>       // Add the necessary ones
#include <avr\signal.h>          // here


ISR(ADC_vect){
    unsigned int adc_data;
    // Read the AD conversion result
    adc_data=ADCW;
    //ADCSRA|=(1<<ADSC);


}

// Declare your global variables here

int main(void){
    PORTA=0x00;
    DDRA=0x00;

    PORTB=0x00;
    DDRB=0x1;

    ADMUX = (1<<REFS0)|(1<<MUX1)|(1<<MUX0);
    ADCSRA=0xAD;
    SFIOR&=0x1F;

    ADCSRA|=(1<<ADSC); //开启ADC
    sei();
    while(1){
    //
    }
}
仿真正常,进入中断后 ADCSR = 0b11101101
俺很少用AVRSUTDIO,多数时候都用vmlab。

出0入0汤圆

发表于 2011-11-8 14:45:06 | 显示全部楼层
你是怎么判断程序没有进入第二次中断的呢?
要是判断LED,你看看你的LED语句写的是什么?
PORTB |= 0x1;
进入中断,LED常亮。
还有初始化之后的中断为什么不打开呢?
#asm("sei")

出0入0汤圆

发表于 2011-11-8 14:55:07 | 显示全部楼层
将上面我说的两个地方改过之后,你再运行看看,程序完全可以运行,AD转换没有问题,并且中断里不用在将ADSC置位!

出0入0汤圆

 楼主| 发表于 2011-11-8 15:43:09 | 显示全部楼层
以上2位仁兄,非常不好意思,我的文件上传错误,这个是我原本要上传的:点击此处下载 ourdev_693032SXB55S.rar(文件大小:67K) (原文件名:连续自由AD转换实验程序(中断).rar)

请再看一下,谢谢
还有请仔细看一看我另外的2次提问:“马老师请进,关于avr连续自动转换的问题”:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5175384&bbs_page_no=1&bbs_id=1003
以及
“mega16连续自由转换模式,中断读数,老是无法启动第2次转换,请高手指”:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5178126&bbs_page_no=1&bbs_id=1000

出0入0汤圆

 楼主| 发表于 2011-11-8 15:55:14 | 显示全部楼层
to花生:
仿真正常,进入中断后 ADCSR = 0b11101101
俺很少用AVRSUTDIO,多数时候都用vmlab。
-----------------------------------------------------
真的吗?你确认仿真的时候把这一句注释掉了?://ADCSRA|=(1<<ADSC);看来是studio的问题?
但如果是仿真器的问题,我把程序烧到板子上用led测试锅,还是不行,除非在中断函数中加上这句:ADCSRA|=(1<<ADSC);

请问花生锅哪里有最新的vmlab下载地址?我到咱们网站搜了一下,都是几年前的帖子,我的是win7系统,不知道可不可以用。

出0入296汤圆

发表于 2011-11-14 13:59:50 | 显示全部楼层


出0入0汤圆

 楼主| 发表于 2011-11-15 17:11:46 | 显示全部楼层
问题已解决,谢傻孩子

出0入0汤圆

发表于 2012-7-18 21:22:04 | 显示全部楼层
microhard567 发表于 2011-11-15 17:11
问题已解决,谢傻孩子

请教一下,你的问题是怎样解决的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 19:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表