请问马老师,MEGA16 ADC 不能自动转换?
马老师,在AVR单片机嵌入式系统原理与应用实践中,P318中设定ADCSRA=0XAD;是不能启动AD自动转换的;该为ADCSRA=0XED;可以,但只进行一次,以后再也不进入ADC中断,该变PA7输入电压扔显示上一个值,不会该变,请问是什么原因?(用Stido仿真,其它设定和书中一样)/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Standard
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project :
Version :
Date : 2008-5-9
Author: F4CG
Company : F4CG
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
flash unsigned char led_7={0x3F,0x06,0x5B,0X4F,0X66,0x6D,0x7D,0x07,0X7F,0X6F};
flash unsigned char position={0xfe,0xfd,0xfb,0xf7};
unsigned char dis_buff={0,0,0,0};
unsigned char posit;
bit time_2ms_ok;
unsigned int txdata,result;
unsigned char txdata_bl,txdata_bh;
void adc_to_disbuffer(unsigned int adc)
{
unsigned char i,j;
j=adc;
for(i=0;i<=3;i++)
{
dis_buff=adc%10;
j=dis_buff;
adc/=10;
j=adc;
}
}
// Timer 0 output compare interrupt service routine
interrupt void timer0_comp_isr(void)
{
// Place your code here
time_2ms_ok=1;
//ADCSRA|=0XFD;
//putchar(txdata);
//putchar(txdata_bl);
//putchar(txdata_bh);
//putchar(result);
}
// ADC interrupt service routine
// with auto input scanning
interrupt void adc_isr(void)
{
unsigned int adc_data,adc_v;
adc_data=ADCW;
txdata_bl=ADCL;
txdata_bh=ADCH;
txdata=ADCW;
adc_v=((long int)adc_data*5000/1024;
result=adc_v;
adc_to_disbuffer(adc_v);
}
void display(void)
{
PORTA|=0X0F;
PORTC=led_7];
if(posit==1)
PORTC|=0X80;
PORTA&=position;
if(++posit>=4)posit=0;
}
// Declare your global variables here
void main(void)
{
PORTA=0x0f;
DDRA=0x0f;
PORTC=0x00;
DDRC=0xff;
TCCR0=0x0b;
TCNT0=0x00;
OCR0=0xfc;
TIMSK=0x02;
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
ADMUX=0x47;
SFIOR&=0x1F;
SFIOR|=0x60;
ADCSRA=0xED;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if(time_2ms_ok)
{
display();
time_2ms_ok=0;
}
};
}
ISIS仿真图:1
ISIS仿真图.bmpourdev_293113.jpg(文件大小:2.93M,只有300K以内的图片才能直接显示) (原文件名:ISIS仿真图.bmp.jpg) 在interrupt void timer0_comp_isr(void) 中加ADCSRA|=1<<ADSC;后功能就正常了,仿真也能通过,请问马老师为何AD不自动转换呢?(注:图中PA0-PA3接线顺序接反了) 回复【1楼】lidewangatan
----------------------------------------------------------------------
顶,同题,同问 LZ,仿真不行,我用的是7.2SP6版本也遇到这个问题,烧到硬件上就可以了。 mark 馬克帕克。
页:
[1]