microhard567 发表于 2011-11-8 12:35:53

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

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

huayuliang 发表于 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){
      /***************/
    };

}

microhard567 发表于 2011-11-8 13:23:43

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

microhard567 发表于 2011-11-8 13:32:45

还有初始化时候为什么要设置模拟比较器相关的寄存器?
原来是为了省电啊,我还以为模拟比较器的设置对adc有影响呢。再次谢谢回复

huayuliang 发表于 2011-11-8 13:38:20

ACSR = 1<<ACD; 是禁用比较器,这里可以先不考虑它。

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

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

microhard567 发表于 2011-11-8 13:47:25

后两个寄存器我懂的……哈
我的程序的流程和你上面给出的是一样的,但是我的只能中断一次,我在studio里仿真的,ad转换一次就停了。怎么回事?

microhard567 发表于 2011-11-8 13:58:42

这是我的c程序(cvavr)、调试文件和proteus仿真文件:点击此处下载 ourdev_693002CO9OT5.rar(文件大小:68K) (原文件名:连续自由AD转换实验程序(中断).rar)

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

huayuliang 发表于 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。

gameboy22 发表于 2011-11-8 14:45:06

你是怎么判断程序没有进入第二次中断的呢?
要是判断LED,你看看你的LED语句写的是什么?
PORTB |= 0x1;
进入中断,LED常亮。
还有初始化之后的中断为什么不打开呢?
#asm("sei")

gameboy22 发表于 2011-11-8 14:55:07

将上面我说的两个地方改过之后,你再运行看看,程序完全可以运行,AD转换没有问题,并且中断里不用在将ADSC置位!

microhard567 发表于 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

microhard567 发表于 2011-11-8 15:55:14

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

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

Gorgon_Meducer 发表于 2011-11-14 13:59:50

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_695028X3T4D5.jpg

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_695027LPJH0B.jpg

microhard567 发表于 2011-11-15 17:11:46

问题已解决,谢傻孩子

tiantianyouyi 发表于 2012-7-18 21:22:04

microhard567 发表于 2011-11-15 17:11 static/image/common/back.gif
问题已解决,谢傻孩子

请教一下,你的问题是怎样解决的
页: [1]
查看完整版本: 请教傻孩子,关于avr连续自由转换模式的疑问