qhtony 发表于 2005-7-1 10:03:45

请教马老师,为什么我的程序进行过第一次模数转换后就再也进不了模数转换了?

//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);

   

}

}





}

machao 发表于 2005-7-1 12:56:32

将主循环中的

ADCSRA |= BIT(ADSC)改成 ADCSRA |= BIT(ADEN)|BIT(ADSC)试一下。



如果能行,请说明原因,告诉大家。

qhtony 发表于 2005-7-1 13:13:19

主要原因在我采用单步调试,在第一次进入中断后却没办法进入中断。

调试的时候用中断能发觉能进入模数转换完成后的中断。但现在的问题是采样到的数据有问题。采样到的数据在60-90之间,但实际应该采样到的数据应该是930左右

machao 发表于 2005-7-1 13:26:51

实际上你对ADC还是不熟悉。

首先你要考虑准备使用ADC的连续转换方式还是单次转换方式。

不管使用哪种方式,正确读ADC的转换值应该在ADC转换完成后,转换中间读的数不会正确。

软件调试ADC有一定的困难,最好采用实际系统运行调试。



“第一次进入中断后却没办法进入中断”,单次ADC转换只完成一次转换,产生一次中断。正确的方式是:在ADC中断中读ADC的数据,然后启动下一次的ADC转换。



你在主程序中不断启动ADC,一次ADC转换还没有完成,又让你重新启动了,有问题。

qhtony 发表于 2005-7-1 13:38:13

刚才那个程序已经改过了,现在也没有不断启动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);

}



}

}

qhtony 发表于 2005-7-1 13:45:58

马老师,我问一个问题,读出来的ADC里面的数据会不会是补码?我发觉用1024-现在读出来的数据反而是我要的那个值。
页: [1]
查看完整版本: 请教马老师,为什么我的程序进行过第一次模数转换后就再也进不了模数转换了?