Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196583
  • 博文数量: 20
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 346
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-23 14:37
文章分类
文章存档

2016年(2)

2015年(3)

2014年(11)

2013年(4)

我的朋友

分类: 嵌入式

2014-01-22 13:11:50

        我不知道大家有没有出现过这个问题:就是代码写好了,编译过了,采样也OK,但是输出采样结果的时候就是0xFF,就是说各位上都是1,不管采样电压是多少都是这么个值。
        这个问题困扰了我很久,不论我怎么改就是不行,最后在跑别人的程序的时候发现了问题所在。
        顺便说一下:我是用的Arduino的leonardo开发板,当然不是用IDE那个开发环境,用的是winavr和studio搭配,ICE mkii的isp烧录。
        后来问题出在预分频那里,我原来的代码都是预分频分为2,也就是ADCSRA寄存器的后三位设的是0,我试过了设为0或者1都是输出0xFF,最少要分为4才不会有问题。我的晶振是8M的,估计这个晶振对于采样来说频率有点高。其他部分正常设置就行。
        这里贴一个让我发现问题的代码
    
#define F_CPU 8000000UL		//定义,保证delay函数的准确

#include
#include
#include
#include

int num_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int num=0;
void led_num( num)
{
	unsigned char temp,i;
	for(i=0;i<4;i++)
	{
		PORTB=0XFF;
		temp=num%10;
		PORTA=num_tab[temp]&0xfe;
		PORTB=~(1<<(3-i));
		_delay_us(20);
		num/=10;
	}
}

void IO_init(void)
{
	PORTA=0Xfe;
	PORTB=0XFF;
	PORTC=0XFF;
	PORTD=0Xaf;
	DDRA=0XFe;
	DDRB=0XFF;
	DDRC=0XFF;
	DDRD=0Xff;
}

void adc_enable(void)
{
	ADMUX=0Xc0;
	ADCSRA=0X86;
	ADCSRA|=0X40;
}
int read_adc(void)
{
	char a,b;
	int c=0;
	ADCSRA|=0X40;
	while(1)
	{
		if(ADCSRA&0X10)
		{
			a=ADCL;
			b=ADCH;
			c=(b<<8)|a;
			return c;
		}
	}
}

int main(void)
{
	int a,b=0,c;
	IO_init();
	adc_enable();			
	while(1)
	{
		b=read_adc();
		b=(b*256)/1024;
		for(c=0;c<100;c++)
			led_num(b);
	}
}
阅读(3295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~