搜索
bottom↓
回复: 1

attiny45 adc求助:用debugwire单步调试时,AD转换值正确,连续...

[复制链接]

出0入0汤圆

发表于 2016-8-9 01:19:36 | 显示全部楼层 |阅读模式
我使用attiny45 的ADC进行转换,用debugwire单步调试时,AD转换值正确,但是连续执行时,发现程序不正确,好像ADC的输入没有反应似的。程序如下(使用timer0的compare a触发ADC,用ADC自己触发也试过,同样的问题)。
#include <avr/io.h>
#include <avr/interrupt.h>

#define PWR_CTRL_BIT   PB2
#define SW_CTRL_BIT    PB4

#define PWR_CTRL   (_BV(PWR_CTRL_BIT))
#define SW_CTRL    (_BV(SW_CTRL_BIT))
  

void init_adc(void)
{
       
        ADMUX |= 0x93;   //2.56V as ref, no external cap, ADC3 as input
               
        ADCSRB |= 0x03;  //timer0 compare match A as trigger source
        DIDR0 |= 0x3F;   //to reduce power consumption
   
        ADCSRA |= _BV(ADEN) |_BV(ADATE) | _BV(ADIE) | 0x03;  //enable adc, auto trigger , enable interrupt , 8 as prescaler, run as 125khz       
       
        sei();       
}

//adc trigger source
void init_timer0(void)
{
        GTCCR = 0x10;   //timer synchronization mode
        TCCR0A = 0x02;  //ctc mode
        TCCR0B = 0x02;  //8 as prescaler, run as 125khz
        OCR0A = 124;    //125k/125 = 1khz as sampling rate
        GTCCR = 0x00;   //start counting
}

//osc source for sw_ctrl
void init_timer1(void)
{

}

void init_ports(void)
{
        PORTB &= ~(PWR_CTRL | SW_CTRL);
        DDRB |= (PWR_CTRL | SW_CTRL);
}

void init_device(void)
{
        init_ports();
        init_timer0();
        init_timer1();
        init_adc();
}

ISR(ADC_vect)
{
        int value;
       
       
        value = ((ADCH << 8) | (ADCL));
       
        PORTB |= SW_CTRL;

#if 1       
        if (value > 0x60)
                PORTB |= PWR_CTRL;
        else
                PORTB &= ~PWR_CTRL;
#endif

#if 0
        for (int i = 0; i < 8; i++)
        {
                if (value & 0x80)
                        PORTB |= PWR_CTRL;
                else
                        PORTB &= ~PWR_CTRL;
            value <<= 1;
        }
#endif

        PORTB &= ~SW_CTRL;
       
        TIFR |= _BV(OCF0A);
       
}
void WDT_off(void)
{
        MCUSR = 0x00;
        WDTCR |= (1 << WDCE) | (1 << WDE);
        WDTCR = 0x00;
}
int main(void)
{
    /* Replace with your application code */
        WDT_off();
       
        init_device();
       
    while (1)
    {
//         PORTB |= _BV(PB2);
//        PORTB &= ~_BV(PB2);
    }
}
通过示波器观察PWR_CTRL上的波形得出上述结论。请问这是什么问题,小弟感谢万分。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-22 08:59

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

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