标题: AVR内部AD模块的求助!各位大虾们帮个忙吧…… [打印本页]

作者: 海浩    时间: 2011-8-15 19:08
标题: AVR内部AD模块的求助!各位大虾们帮个忙吧……

 各位大侠们,我想用ATmega128的内部AD的,我选用的编译器是IAR AVR,程序如下:

#include <ioavr.h>
#include <intrinsics.h>
#define  unchar unsigned char
#define  unint  unsigned int

unchar vol;

#define    REFS1    7
#define    REFS0    6
#define    ADLAR    5
#define    MUX4     4
#define    MUX3     3
#define    MUX2     2
#define    MUX1     1
#define    MUX0     0

#define    ADEN     7
#define    ADSC     6
#define    ADFR     5
#define    ADIF     4
#define    ADIE     3
#define    ADPS2    2
#define    ADPS1    1
#define    ADPS0    0

#define rs_L()  (PORTD &= ~(1<<7))
#define rs_H()  (PORTD |= (1<<7))

#define rw_L()  (PORTD &= ~(1<<6))
#define rw_H()  (PORTD |= (1<<6))

#define en_L()  (PORTD &= ~(1<<5))
#define en_H()  (PORTD |= (1<<5))

void delay_ms(unint x)  //12M 1ms延时程序
{
  unint y;
  for(;x>0;x--)
    for(y=0;y<120;y++);
}

void w_com(unchar com)
{
  unint i;
 PORTC=com;

 rs_L();
  
 rw_L();
  
 en_L();
 i=10;
 while(i--);
 en_H();
 i=10;
 while(i--);
}

void w_data(unchar dataa)
{
  unint i;
 PORTC=dataa;
 
 rs_H();
 
 rw_L();
 
 en_L();
 i=10;
 while(i--);
 en_H();
 i=10;
 while(i--);
}

void L1602_init()
{
 w_com(0x01);
 w_com(0x38);
 w_com(0x0c);
 w_com(0x06);
 w_com(0xd0);
}

void L1602_char(unchar hang,unchar lie,char sign)
{
 unchar a;
 if(hang==1) a=0x80;
 if(hang==2) a=0xc0;
 a=a+lie-1;
 w_com(a);
 w_data(sign);
}

void L1602_string(unchar hang,unchar lie,unchar *p)
{
 unchar a;
 if(hang==1) a=0x80;
 if(hang==2) a=0xc0;
 a=a+lie-1;
 w_com(a);
 while(1)
 {
  if(*p=='\0') break;
  w_data(*p);
  p++;
 }
}

unchar BIT(unchar x)
{
  unchar temp;
  temp = (0x01<<x);
  return temp;
}

/*
*函数功能:ADC模块的初始化程序
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void init_adc()
{
  ADCSR=0X00;     //设置ADC前,禁止ADC
  ADMUX=BIT(REFS1)|BIT(REFS0);   //设置ADC内置参考电压为2.56V的片内基准电源
  ADMUX|=BIT(ADLAR);     //ADC转换结果左对齐,直接取ADCH的8位数据
  ADCSR=BIT(ADEN)|BIT(ADPS1)|BIT(ADPS0)|BIT(ADPS2);  //ADC使能,128分频
}

unsigned char get_adcdata(void)
{
  unsigned char volt;
//  ADMUX=BIT(MUX0)|BIT(MUX1)|BIT(MUX2)|BIT(MUX3);           //选择通道3,电池电压通道
  ADMUX|=0;
  ADCSR|=BIT(ADSC);  //启动单次ADC转换
  while (!(ADCSR&BIT(ADIF)));  //等待转换结束
  ADCSR&=~(BIT(ADIF));    //清楚ADIF位
  volt=ADCH;
  return volt;
}

void L1602_display1()
{
  L1602_char(1,9,vol/100%10+48);
  L1602_char(1,11,vol/10%10+48);
  L1602_char(1,12,vol%10+48);
}

 


void main()
{

 
  DDRC=0xff;
  PORTC=0xff;
  DDRD=0xff;
  PORTD=0xff;
  DDRF=0x00;
  PORTF=0x00;
  L1602_init();
  L1602_string(1,1,"   IN0: 0.00V   ");
  L1602_string(2,1,"   IN1: 0.00V   ");
  init_adc();
  while(1)
  {
    vol = get_adcdata();
    vol=(vol/256)*500;
    L1602_display1();
    delay_ms(1000);
  }
}

 

我用IAR模拟运行了一下,发现就是死在了 while (!(ADCSR&BIT(ADIF)));  这边,这说明AD一直都在转换,就是没转换好!这是为什么呢?劳烦各位大侠留步帮小弟解决下!有劳了各位了……

[此贴子已经被作者于2011-8-15 19:14:36编辑过]

作者: shja995    时间: 2012-3-28 15:57
while (!(ADCSR&BIT(ADIF))); 这句话本身有问题吧。。。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1