harrle 发表于 2008-5-20 16:42:06

timer0溢出adc自动触发中,为何adc一直没有产生中断?

测试程序如下:
#define    Adc_get_10_bit_result()            ((uint16)(ADCL+((uint16)(ADCH<<8))))

void ADC_Init(void)    //16/62.5K=256us
{
ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<MUX3);
ADCSRA|=(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADCSRB|=(1<<ADTS2);
}
//timer0 初始化      
void Timer0_init(void) //2.04ms中断一次
{
TCCR0A = 0;
TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // 64 prescaler (8us)
TIMSK0|=(1<<TOIE0);
}

int main(void)
{
PORTC&=~(1<<PC4);
DDRC&=~(1<<PC4);
ADC_Init();
Timer0_init();
sei();
do
{
   
        }while(1);
        return(0);

}

SIGNAL(SIG_ADC)
{
   uint16 temp;

   temp=Adc_get_10_bit_result();
}
timer0溢出adc自动触发中,为何adc一直没有产生中断?

harrle 发表于 2008-5-23 10:39:27

在调试中,ADIF一直没有置高。

felixch 发表于 2008-5-23 10:53:27

没看见哪里启动了adc,
timer0的中断处理在哪里?

harrle 发表于 2008-5-23 11:22:59

timer0一溢出就启动ADC。应该没用到TIMER0中断处理吧?

felixch 发表于 2008-5-23 12:12:58

说了半天,芯片型号?

harrle 发表于 2008-5-23 13:59:27

我用的是AT90PWM3本来打算用PSC0中的OCR0RA(中心对称模式向上计数匹配OCRORA)作为ADC同步启动信号,可是调试时ADC总是没有触发中断,所以写那这个程序看看ADC自动模式该怎么操作。

harrle 发表于 2008-5-23 14:49:15

#include <avr/io.h>
#include <avr/interrupt.h>
#include "typedefine.h"
#include "systemdefine.h"

#define    Adc_get_10_bit_result()            ((uint16)(ADCL+((uint16)(ADCH<<8))))

void ADC_Init(void)    //16/125K=128us
{
ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<MUX3);//选择内部2.56基准电压,8通道
ADCSRA|=(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//ADC使能,自动模式 64分频
ADCSRB|=(1<<ADTS2);//TIMER0溢出触发ADC
}
//timer0 初始化      
void Timer0_init(void) //2.04ms中断一次
{
TCCR0A = 0;
TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); // 64 prescaler (8us)
TIMSK0|=(1<<TOIE0);
}

int main(void)
{
PORTC&=~(1<<PC4);
DDRC&=~(1<<PC4);
ADC_Init();
Timer0_init();
sei();
do
{
   
        }while(1);
        return(0);

}

//=================================================================*/
/*Timer0 Overflow for speed measurement
//=================================================================*/
SIGNAL(SIG_OVERFLOW0)//定时器0溢出中断标志硬件置0
{
TCNT0=0X00;

}

SIGNAL(SIG_ADC)
{
   uint16 temp;
   
   temp=Adc_get_10_bit_result();
   
}

zhaomq 发表于 2013-7-4 22:24:51

加一条这个 ADCSRA|=(1<<ADSC)

ADC必须被启动一次,后续自动转换。

另外中断中加一条这个         TIFR0 = TIFR0;                                // OCF0A:T/C0 输出比较 A 匹配标志,此位在中断服务程序里硬件清零,也可以对其写 1 来清零
T0中断源旗号要清零,准备下次T0的触发转换



• Bit 6 – ADSC: ADC 开始转换
在单次转换模式下,ADSC 置位将启动一次 ADC 转换。在连续转换模式下,ADSC置位
将启动首次转换。第一次转换 ( 在 ADC 启动之后置位 ADSC,或者在使能 ADC 的同时置
位 ADSC) 需要 25 个 ADC 时钟周期,而不是正常情况下的 13 个。第一次转换执行 ADC
初始化的工作。
页: [1]
查看完整版本: timer0溢出adc自动触发中,为何adc一直没有产生中断?