代码之家  ›  专栏  ›  技术社区  ›  Nithin Varghese

无法使用PINxn从Arduino Mega读取引脚值

  •  0
  • Nithin Varghese  · 技术社区  · 8 年前

    使用Arduino Mega 2560的寄存器,我试图获取端口的信息。我提到了 datasheet (第69-72页)并理解我必须使用PINxn(PINA)来实现这一点。但我得到的是0作为输出。我已将pin连接到LED。

    代码

    #define F_CPU 16000000
    #include <avr/io.h>
    
    int main(void) {
      DDRA = (1 << DDA0); // sets the pin OUTPUT
      __asm__("nop\n\t");
      PORTA = 0x01; // Sets it HIGH
      unsigned int i = PINA;
      Serial.println(i);
    }
    

    0
    

    如果我漏掉了任何东西,无论是强调过度还是强调不足,请提前感谢您的时间。请在评论中告诉我。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Yunnosch    8 年前

    如果您想读回之前写入输出的值,我建议从您写入的寄存器中读取它,即。 PORTA

    13.2.4 数据方向位DDxn的设置,端口引脚 可以

    在写下另一个值后立即读回旧值的一个可能解释可能是同一章中的以下部分:

    如果物理引脚在内部时钟边缘附近改变值,则需要避免亚稳态,但它也会引入 一 延迟 .


    查看可用库和可用计时器硬件提供的计时功能。
    但作为概念证明,我建议通过

    • PINA 之前
    • 将反转值写入 波尔塔 (当然,只反转相关位)
    • 读取并打印 (希望您的标题使用 volatile

    我希望你会看到一些旧的价值观,然后是新的价值观。

    取决于打印的方式(忙着等待?),一次就够了。
    NOP ( __asm__("nop\n\t"); )可能被设计为进行适当的等待。但我认为它放错地方了(应该在写了新值之后),而且可能太短了。如果它来自示例代码,那么就足够了。移动它,也许做两次,以确保第一次尝试。这可能是有效的。

        2
  •  0
  •   AterLux    8 年前

    中间的 (即,在时钟发生器的下降边缘) 时钟周期。

    因此,从PINx读取总是延迟0.5到1.5个时钟周期。 如果某个系统时钟中的逻辑电平在其中间之前发生变化(即在时钟生成器的下降沿之前),则该值将立即被锁存,并可用于在下一个系统时钟周期读取PINx寄存器。因此,延迟为0.5个周期

    C编译器非常适合优化,因此,两个带有PORTA赋值和PINA读取的后续行被编译为两个后续行 在ryy,PINA