0

我一直在编写自己的“库”来处理 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;}
4

1 回答 1

1

这段代码缺少一些括号,所以它并没有像你想象的那样做。看起来它可能正在做正确的事情,祝你好运。

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


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

数据表似乎非常明确:

ADCSRA 位 3 – ADIE:ADC 中断使能

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

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

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

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

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

于 2012-12-10T02:02:31.923 回答