lidewangatan 发表于 2008-5-26 11:12:13

请问马老师,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)

lidewangatan 发表于 2008-5-26 18:40:34

在interrupt void timer0_comp_isr(void) 中加ADCSRA|=1<<ADSC;后功能就正常了,仿真也能通过,请问马老师为何AD不自动转换呢?(注:图中PA0-PA3接线顺序接反了)

xunpianzhen 发表于 2009-12-26 17:05:25

回复【1楼】lidewangatan
----------------------------------------------------------------------
顶,同题,同问

nuno 发表于 2010-2-22 11:28:03

LZ,仿真不行,我用的是7.2SP6版本也遇到这个问题,烧到硬件上就可以了。

xtaens 发表于 2010-9-27 17:53:23

mark

cos 发表于 2012-6-13 12:48:58

馬克帕克。
页: [1]
查看完整版本: 请问马老师,MEGA16 ADC 不能自动转换?