打印
[AVR单片机]

新人请教 AD转换用定时器溢出触发自动转换,为什么只能触

[复制链接]
1882|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
和叶凌紫|  楼主 | 2013-4-9 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位大神帮忙看看,小女子感激不尽。
目前在做AD转换,用的单片机是ATmega32,在做到AD转换时用定时器溢出触发AD转换,发现似乎没办法连续转换,请高人指点。
下面是我的程序:

//****************定时器0初始化程序*****************
void init_avrtimer0()
{
        TCCR0=0x03;    //预分频64
        TCNT0=256-10000000/64*0.625*0.001;  //晶振10MHz,设定定时器初值为0.625MS
        TIMSK=0x01;    //使能TC0溢出中断
}
//=======================ADC初始化====================//
void init_ADC(int16u address)
{
        ADMUX = address;
        ADCSRA = (1<<ADEN)|(1<<ADATE)|(1<<ADIF);
        SFIOR=0x80;
        ADCSRA |= (1<<ADIE)|(1<<ADSC);
}
//********************************************************
void main()
{
        DDRD=0xff;
        PORTD=0xff;
        DDRA&=0x01;
        PORTA&=0x01;
        DDRB=0x0F;
        PORTB=0x0F;

    CLK_1();
    DIN_1();
    STB_1();
    send_data(0x80);//关显示
        display0(0,0,0,0x01);
    STB_1();
        send_data(0x89);//开显示
        delayms(2000);
        STB_1();   
        send_data(0x80);//关显示
        init_avrtimer0();
        init_ADC(0x43);
        sei();        
        while(1)
        {       
                SET();
                TIMSK=0x00;
                addata=ADCL;
                  addata=addata+ADCH*256-512;
                ADCSRA|=1<<(ADIF);
                ADCSRA=0;
                display(addata,0,0);
                TIMSK=0X01;                                       
        }       
}
//*************************************
ISR(TIMER0_OVF_vect)
{                          
        TCNT0=256-10000000/64*0.625*0.001;
        sign1++;       
}
ISR(ADC_vect)
{
         TIFR |= (1<<TOV0);
}

相关帖子

沙发
dqyubsh| | 2013-4-9 20:54 | 只看该作者
没细看,你写的是定时间隔是0.625ms,这个时间是不是太短了?建议先写一个1s启动的转换,调对了再去调整时间间隔。

还有while循环里并没有判断sign1,你的定时器溢出和主程序是如何关联的?如果没有关联,那么你就要判断ADC转换状态,否则读出的ADCL/ADCH一定是有问题的。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
airwill| | 2013-4-9 21:08 | 只看该作者
本帖最后由 airwill 于 2013-4-9 21:14 编辑

按理应该是可以了.
不过我曾经发现, 这个自动触发有点毛病, 好象还跟中断服务有关.

另外, 下面这个表达式的结果是否有问题. 验证一下看看
TCNT0=256-10000000/64*0.625*0.001;  //晶振10MHz,设定定时器初值为0.625MS

使用特权

评论回复
地板
qin552011373| | 2013-4-9 21:10 | 只看该作者
增加定时器时间  试下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝