使用马老师的实验板,ADC实验通不过了,求教
连线是这样的:B口8根线分别连到LED的JA上,JU7上3个跳线接上,JD1连到PA0上。
融丝位为SUT1,SUT0,CKSEL3,CKSEL1,CKSEL0打钩。
程序如下:
#include <iom16v.h>
#include <macros.h>
#pragma interrupt_handler adc_isr:15
unsigned int adc_data;
void adc_isr(void)//中断服务程序
{
unsigned char temp;
adc_data = ADC;//读取10位的数据
temp=(adc_data>>2);
PORTB=temp;
ADCSRA|=0x40;
}
void main (void)
{
OSCCAL=0xad;
PORTA=0x00;
DDRA=0x00;
DDRB=0xff;
ACSR=0x80;
ADMUX=0x00;
ADCSRA=0xce;
SREG=0x80;
do{
;
} while(1);
}
已经多次阅读了DATASHEET,应该说在ADC转换时,使用的只有ADMUX,ADCSRA,ADCH,ADCL。我现在使用的中断只是想用单一转换模式,所以不考虑SFIOR。其实ACSR根据书上所写,都好象不必要赋值。这是最简化的ADC转换,但却一直通不过,想不通。论坛上对于ADC的讨论我都看过了,但还是找不到答案。很多都不是使用中断写的,也就是根据ADIF的状况来判断。使用中断初始化的,我都实验过了,通不过。
在ADC转换的过程中,关于时序方面,好象没有说到延时的问题。只是说ADC要的时间较长。 还有,根据DATASHEET说的,ADC转换在ADSC置位的随后的ADC的CLOCK第一个时钟周期的上升沿进行转换,是不是也可以理解为只要ADSC被置位(且ADEN=1),转换就开始进行。那么如果设置了SREG=0X80;就会立即跳到中断服务程序里了。而没有其他条件的限制。那么其他需要条件的中断如何进入他们自己的中断程序呢,时间都被ADC中断占用了。
我看了几个论坛上关于ADC的查询方式的转换,都是用的ADIF来判断转换是否完成,可时序图上的ADIF在以后的(除了第一次)转换中是可以为1的,我用ADSC的位来查询,也取的成功。 如果是ADC转换结束后才产生中断,那么是否13.5这么长的转换时间,在简单的实验情况下不足以完成转换过程。必须要在中断发生前处理其他的地方把这个时间度过呢。明天在看看。 AVR的ADC转换是硬件完成的,从开始启动到转换结束需要13个DC时钟,在这个时间你的程序当然可以做其它的事情。简单的方法是启动ADC转换后,程序去执行其它的事情,然后再查询ADC转换是否完成。当然最好的方式是使用ADC完成中断,这样可以提高系统程序的效率,但对系统程序编写的能力要求高。 您好,我正在想做的是您说的第2步,因为用查询的方式,已经在实验板上通过了。您是不是说,使用中断的话,必须很好的理解程序运行的各个步骤的时间关系。您的书上还没有ADC转换的例子,期待中 。 您好,问题已经解决(从5V处连根线到AREF上就可以显示了)。但我还是有点不明白。
使用中断,ADMUX=0X00;ADCSR=0XCE;AREF的电位为0。
使用查询,ADMUX=0X00;ADCSRA=0XC7;ADREF=5V。
WHY?
-----此内容被wsmcjm于2006-04-26,14:56:41编辑过 AREF引脚是用于外接ADC参考电源的。一般情况下,AREF引脚只须对地加个电容,参考电源通过设置可使用内部参考。可能你的ADC初始化有些问题。请仔细看看AVR手册的ADC部分。
页:
[1]