【问题标题】:Reading a pin on Arduino Uno does not work, need help on avr-gcc在 Arduino Uno 上读取 pin 不起作用,需要 avr-gcc 的帮助
【发布时间】:2015-10-09 07:25:10
【问题描述】:

我正在尝试控制 Arduino Uno 板上的三个 LED。这些 LED 连接到端口 D 的引脚 3、4、5 作为输出。

端口 D 的 2 号针连接到一个按钮,并且已配置 作为输入。

整个电路已经使用默认的 Arduino 代码进行了测试,并且功能齐全。然而,使用下面给出的代码(没有 arduino 库),无论按钮的状态如何,输入引脚(端口 D 上的引脚 2)总是读取为高电平。

任何帮助将不胜感激。

#include <avr/io.h>
#include <util/delay.h>

#define IS_LOW(reg, pin)  ((reg) & (1 << (pin)) == 0)
#define SET_BIT(reg, pin) do{(reg) |= 1 << (pin);} while(0)
#define CLEAR_BIT(reg, pin) do{(reg) &= ~(1 << (pin));} while(0)

int main (void)
{
    DDRD &= ~(1 << DDD2); //pin 2 on port D as INPUT
    DDRD |= 1 << DDD3;    //pin 3 on port D as OUTPUT
    DDRD |= 1 << DDD4;    //pin 4 on port D as OUTPUT
    DDRD |= 1 << DDD5;    //pin 5 on port D as OUTPUT

   while(1) 
   {
       if (IS_LOW(PIND, PD2))
       {
           SET_BIT(PORTD, PD3);
           CLEAR_BIT(PORTD, PD4);
           CLEAR_BIT(PORTD, PD5);
       }
       else
       {
           CLEAR_BIT(PORTD, PD3);
           CLEAR_BIT(PORTD, PD4);
           SET_BIT(PORTD, PD5);

           _delay_ms(250);

           SET_BIT(PORTD, PD4);
           CLEAR_BIT(PORTD, PD5);

           _delay_ms(250);
       }
    }
}

【问题讨论】:

  • 你确定输入pullup/pulldown吗?
  • 你写的PIN2是指PORTD的第二个pin还是PORTD的第三个pin?

标签: c arduino embedded avr avr-gcc


【解决方案1】:

很遗憾,&amp; 运算符的优先级低于== 运算符之一。

您应该像这样定义IS_LOW 宏:

#define IS_LOW(reg, pin) (((reg) &amp; (1 &lt;&lt; (pin))) == 0)

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多