请教马老师,为什么我的程序进行过第一次模数转换后就再也进不了模数转换了?
//ICC-AVR application builder : 2005-6-30 16:28:29// Target : M64
// Crystal: 8.0000Mhz
#include <iom64v.h>
#include <macros.h>
unsigned int adc_demo;
void port_init(void)
{
PORTA = 0x00;
DDRA= 0x00;
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00; //m103 output only
DDRC= 0x00;
PORTD = 0x00;
DDRD= 0x00;
PORTE = 0x00;
DDRE= 0x00;
PORTF = 0x00;
DDRF= 0x00;
PORTG = 0x00;
DDRG= 0x00;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV= 0x00; //xtal divider
XMCRA = 0x00; //external memory
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
port_init();
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void init_adc(void)
{
ADCSRA=0x00;
ADMUX|=BIT(REFS1)|BIT(REFS0)|(MUX0);
ACSR|=BIT(ACD);
ADCSRA|=(BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1));
ADCSRB|=0x00;
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
adc_demo=ADC;
ADMUX|=BIT(REFS1)|BIT(REFS0)|(MUX0);
ADCSRA|=BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1);
}
void main(void)
{
init_devices();
init_adc();
DDRF|=BIT(DDF2);
PORTF|=BIT(PF2);
ADCSRA|=BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1);
while(1)
{
ADCSRA|=BIT(ADSC);
if (adc_demo>=0x3E7)
{
PORTF|=~BIT(PF2);
}
}
} 将主循环中的
ADCSRA |= BIT(ADSC)改成 ADCSRA |= BIT(ADEN)|BIT(ADSC)试一下。
如果能行,请说明原因,告诉大家。 主要原因在我采用单步调试,在第一次进入中断后却没办法进入中断。
调试的时候用中断能发觉能进入模数转换完成后的中断。但现在的问题是采样到的数据有问题。采样到的数据在60-90之间,但实际应该采样到的数据应该是930左右 实际上你对ADC还是不熟悉。
首先你要考虑准备使用ADC的连续转换方式还是单次转换方式。
不管使用哪种方式,正确读ADC的转换值应该在ADC转换完成后,转换中间读的数不会正确。
软件调试ADC有一定的困难,最好采用实际系统运行调试。
“第一次进入中断后却没办法进入中断”,单次ADC转换只完成一次转换,产生一次中断。正确的方式是:在ADC中断中读ADC的数据,然后启动下一次的ADC转换。
你在主程序中不断启动ADC,一次ADC转换还没有完成,又让你重新启动了,有问题。 刚才那个程序已经改过了,现在也没有不断启动ADC。我现在在主循环里面每1ms启动一次ADC。可能我读取数据的时候有问题,但我是在模数转换完成后的中断里面读取数据的。
这是我现在的程序:
//ICC-AVR application builder : 2005-6-30 16:28:29
// Target : M64
// Crystal: 8.0000Mhz
#include <iom64v.h>
#include <macros.h>
void delay_nus(unsigned int n);
unsigned int adc_demo;
void port_init(void)
{
PORTA = 0x00;
DDRA= 0x00;
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00; //m103 output only
DDRC= 0x00;
PORTD = 0x00;
DDRD= 0x00;
PORTE = 0x00;
DDRE= 0x00;
PORTF = 0x04;
DDRF= 0x00;
PORTG = 0x00;
DDRG= 0x00;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV= 0x00; //xtal divider
XMCRA = 0x00; //external memory
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
port_init();
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void init_adc(void)
{
ADCSRA=0x00;
ADMUX|=BIT(MUX0);
ACSR|=BIT(ACD);
ADCSRA|=(BIT(ADEN)|BIT(ADSC)|BIT(ADIE)|BIT(ADPS2)|BIT(ADPS1)|BIT(ADPS0));
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
adc_demo = ADCL;
adc_demo +=(ADCH&0x03)*256;
//ADMUX|=BIT(REFS1)|BIT(REFS0)|BIT(MUX0);
}
void main(void)
{
init_devices();
init_adc();
DDRF|=BIT(DDF2);
while(1)
{delay_nus(10);
ADCSRA|=BIT(ADSC);
if (adc_demo>=0x2BA)
{
PORTF|=BIT(PF2);
}
}
} 马老师,我问一个问题,读出来的ADC里面的数据会不会是补码?我发觉用1024-现在读出来的数据反而是我要的那个值。
页:
[1]