繁体   English   中英

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

[英]How to read an input value from atmega32 pin?

我正在尝试从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
        }
    }
}

我在这里发现一个逻辑错误:

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

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

if (PINA&0b00000010)  // button pressed

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

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

您应该更改硬件设置,并使按钮处于低电平有效,这意味着按下按钮会将GPIO引脚接地。 与其将按钮连接到5V电池的正极,不如将其连接到负极。 这样一来,您就可以利用可在GPIO上激活的内部上拉电阻。 完成此操作后,应将代码更改为如下所示:

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

#define LED_BIT 0
#define BTN_BIT 1

int main(void) 
{
    DDRA  = (1 << LED_BIT); // PA0 output
    PORTA = (1 << BTN_BIT); // enable internal pull up on PA1

    while (1) {
        if (!(PINA & (1 << BTN_BIT))) {  // button pressed
            PORTA |= (1 << LED_BIT);   // turn led on
        }
    }
}

请注意,现在if语句会检查PA1是否为0,因为将按钮设置为在按下按钮时接地。 还要注意,在其中有一个新行,该行启用了内部上拉功能,这使PA1在未按下按钮时读为1。 如果您未将按钮更改为低电平有效配置,则必须使用外部下拉电阻才能使代码正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM