搜索
bottom↓
回复: 5

请问马老师,MEGA16 ADC 不能自动转换?

[复制链接]

出0入0汤圆

发表于 2008-5-26 11:12:13 | 显示全部楼层 |阅读模式
马老师,在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[10]={0x3F,0x06,0x5B,0X4F,0X66,0x6D,0x7D,0x07,0X7F,0X6F};

flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7};
unsigned char dis_buff[4]={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 [TIM0_COMP] 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 [ADC_INT] 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[dis_buff[posit]];
  if(posit==1)
    PORTC|=0X80;
  PORTA&=position[posit];
  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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-5-26 18:40:34 | 显示全部楼层
在  interrupt [TIM0_COMP] void timer0_comp_isr(void) 中加ADCSRA|=1<<ADSC;后功能就正常了,仿真也能通过,请问马老师为何AD不自动转换呢?(注:图中PA0-PA3接线顺序接反了)

出0入0汤圆

发表于 2009-12-26 17:05:25 | 显示全部楼层
回复【1楼】lidewangatan
----------------------------------------------------------------------
顶,同题,同问

出0入0汤圆

发表于 2010-2-22 11:28:03 | 显示全部楼层
LZ,仿真不行,我用的是7.2SP6版本也遇到这个问题,烧到硬件上就可以了。

出0入0汤圆

发表于 2010-9-27 17:53:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-13 12:48:58 | 显示全部楼层
馬克帕克。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 07:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表