簡體   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