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一直没有产生中断? 在调试中,ADIF一直没有置高。 没看见哪里启动了adc,
timer0的中断处理在哪里? timer0一溢出就启动ADC。应该没用到TIMER0中断处理吧? 说了半天,芯片型号? 我用的是AT90PWM3本来打算用PSC0中的OCR0RA(中心对称模式向上计数匹配OCRORA)作为ADC同步启动信号,可是调试时ADC总是没有触发中断,所以写那这个程序看看ADC自动模式该怎么操作。 #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();
} 加一条这个 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]