如何从atmega32引脚读取输入值?

时间:2017-06-07 21:50:28

标签: c embedded avr atmega

我试图从avr引脚读取值,但它不起作用。

我试图读取来自按钮的值,此按钮连接到5V DC电池。

当我按下按钮时,5V应该转到atmega32并将其读为1,然后if语句变为true并且led继续。

然而,当值变为true时,led将打开,但不是。

第1位是按钮 第0位是led

代码

#define DDRA (*((volatile unsigned char *)0x3A))
#define PORTA (*((volatile unsigned char *)0x3B))
#define PINA (*((volatile unsigned char *)0x39))

int main(void) {
   DDRA |= 0b00000001;         // pin 0 output

    while (1) {
        if ((PINA&0b00000010) == 1) {  // button pressed
            PORTA |= 0b00000001;   // turn led on
        }
    }
}

3 个答案:

答案 0 :(得分:3)

我在这里找到一个逻辑错误:

if ((PINA&0b00000010) == 1)  // button pressed

当设置位1时,(PINA&0b00000010) == 2。 通常,当您进行位检查时,只需执行以下操作:

if (PINA&0b00000010)  // button pressed

答案 1 :(得分:1)

为了确保,您的按钮必须有一个连接到地的上拉/下拉电阻。没有它,您无法正确读取引脚是打开还是关闭。

https://learn.sparkfun.com/tutorials/pull-up-resistors

答案 2 :(得分:1)

您应该更改硬件设置,并使按钮保持低电平,这意味着按下按钮可将GPIO引脚连接到地。不要将按钮连接到5V电池的正极侧,而是将其连接到负极侧。这样您就可以利用GPIO上可以激活的内部上拉电阻。一旦你这样做,你的代码应该改为看起来像这样:

p

请注意,if语句现在会检查PA1是否为0,因为按钮设置为在按下时连接到地面。另请注意,其中有一条新线路可以启用内部上拉,这使得PA1在按下按钮时读取1。如果不将按钮更改为低电平有效配置,则必须使用外部下拉电阻才能使代码正常工作。