【问题标题】:ATMega328P ADCSRA register issueATMega328P ADCSRA 寄存器问题
【发布时间】:2021-10-23 16:43:31
【问题描述】:

我想在 Microchip Studio 中设置我的 Arduino 的 ADC0 通道,但遇到了一个奇怪的问题。我想初始化 ADCSRA 寄存器中除 ADIF 之外的所有位。我通过在我的 main 中调用一个 init-Function 来做到这一点,该函数在外部源文件中定义。我尝试了几种方法来写这些位,结果总是一样的,所以假设我这样做很平淡

ADCSRA = 0xEF;

无论我如何写入这些位,当我调试这一步时,寄存器中的值在 Autos 窗口中显示为 -81,而在数据寄存器中的 Hex-Wert 显示为 0xAF。但是,根据数据手册,0xEF 被写入寄存器 0x​​18,该寄存器是为系统保留的。

在这之前的一步,我将 ADMUX 寄存器设置为 ADMUX |= (1 << ADLAR);,效果很好。

我不知道这里发生了什么。如果有人能引导我找到解决方案,那将不胜感激。提前致谢。

【问题讨论】:

  • 0xAF0xEF - 0x40。那是ADSC位。检查该位的数据表。
  • 但是为什么不设置呢?我发现唯一的事情是第一次转换会比平时花费更长的时间,但是只要转换正在进行,该位就应该读为 1,对吧?

标签: arduino cpu-registers atmega adc atmelstudio


【解决方案1】:

当您将0xEF 写入ADCSRA 时,您设置为1 的位之一被命名为ADSC。这是位置 6 中的位,因此它有一个对应的位掩码(1 << 6),即0x40。 ADSC 位是一个特殊位,因为它触发 ADC 开始转换。转换完成后,硬件将该位清零。你没有说你使用什么样的调试或模拟工具来查看ADCSRA寄存器,但也许它是一个工具,即使 CPU 暂停,你的 ADC 也可以全速运行,所以转换会在几微秒内完成,ADSC 会在你看到它为 1 之前为 0。

【讨论】:

  • 感谢您的回复,如果有帮助的话,我正在使用 Microchip Studio 的“板载”模拟器。