AVR ADC中的ADIE位处于自由运行模式

时间:2012-12-10 01:02:21

标签: arduino microcontroller avr atmel atmega

我一直在编写自己的“库”来处理AVR芯片上的不同内容。但是,我坚持ADCSRA寄存器中ADIE位的操作(数据表中的第261页)。数据表并没有真正解释ADIE的工作原理。但是,每当ADIE设置为0时,我都无法读取ADC。为什么会这样?我认为ADC就像定时器一样工作 - 即使没有使能中断,它仍然会用读数更新ADC寄存器。

这是罪魁祸首代码,只要“中断”设置为除1以外的任何值,ADC就不起作用。有趣的是,与其他中断不同,如果ISR(ADC_vect)例程中没有代码,芯片就不会卡住。

if(interrupt){ADCSRA|=1<<ADIE;}//enable the ADC conversion complete interrupt
else{ADCSRA&=~1<<ADIE;}

1 个答案:

答案 0 :(得分:1)

此代码缺少一些括号,因此它不会按照您的想法执行。看起来好运可能是做对了。

if(interrupt){ADCSRA|=1<<ADIE;}//enable the ADC conversion complete
interrupt else{ADCSRA&=~1<<ADIE;}


~1<<ADIE != ~(1<<ADIE)

数据表似乎很明确:

  

ADCSRA Bit 3 - ADIE:ADC中断使能

     

当该位写入一位时   并且SREG中的I位置1,ADC转换完成中断   被激活了。

这意味着如果第4位ADIF(标志)变为1,则ADC中断向量​​将运行(并清除该标志)。

但是如果你不打算使用中断,你就不需要使用它了。如果您将其设置为1,并且没有注册中断,则设备将重置。

也许您需要更多关于ADC工作原理的解释。

您可以通过写入ADCSRA的第6位开始转换。转换需要一些时间,如果您不想使用中断,可以通过轮询第4位来判断它何时就绪。当它变为1时,从ADCL和ADCH读取结果。确保通过将1写入第4位来清除该标志。