我一直在编写自己的“库”来处理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;}
答案 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位来清除该标志。