ATmega16에서 디지털 입력을 어떻게 읽습니까?


18

ATmega16 에서 디지털 입력 (푸시 버튼)을 읽으려면 어떻게해야 합니까? 풀업 저항을 활성화해야합니까, 아니면 10kohm을 사용해야합니까? 간단한 코드는 무엇입니까? 간단히 'LED를 눌렀을 때 LED를 켜십시오'.

초보자 튜토리얼이 있습니까? 나는 인터넷 검색과 AVR Freaks를 시도 했지만 모든 것이 거기에서 싸움으로 진화하고 내 대답을 얻지 못합니다. 나는 실제로이 물건에 대한 자습서를 찾지 못했습니다. 내 AVR 마이크로 컨트롤러 에 대한 수 많은 구체적인 것들이지만 간단하지는 않습니다 ...


4
이것은 거의 모든 초보자의 튜토리얼에서 대답 할 것이며, 여기에 완전한 대답이 도움보다 이해력을 손상시킬 수 있다고 두려워합니다. 배우기 위해 어떤 이전의 노력을 기울였습니까?
Yann Vernier

내 게시물을 보았는지 또는 볼 수 있는지 확실하지 않습니다 (아직도이 사이트에 대해 다소 혼란 스럽습니다 ...).하지만 코드를 알고 있습니다. 제 질문은 다음과 같습니다 .GND에 핀을 연결합니까?
궁금해

2
게시물을 더 정확하게 반영하도록 수정하고 원본 게시물에 아래 게시물을 포함 시키십시오.
Amos

AVR Freaks 페이지 에서 From-Scratch AVR Tutorial을 사용해보십시오 . 거기에 더 많은 것들이 있습니다.
레온 헬러

답변:


24

브라질 인사!

우선 귀하의 모범에 대해 Joby에게 감사드립니다. 둘째, 그의 예에는 사소한 오류가 있습니다. 숫자 0x20이 올바르지 않습니다. 0x04 여야합니다. 또한 제안으로 코드에 0xFB, 0x20 또는 0x04와 같은 16 진수를 사용하지 않습니다. io.h 및 헤더 파일에서 참조하는 다른 포트에있는 PIN 포트 정의를 사용하는 것이 좋습니다. 초보자를위한 몇 가지 의견과 함께 아래 Joby의 예를 다시 작성했습니다.

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

초보자를위한 의견

댓글 # 1: (1 << PD2)는 이진수 00000100을 생성합니다. "~"연산은 모든 숫자를 뒤집습니다. 즉, 이진수는 이제 11111011입니다. 마지막으로 & =는 DDRD와 11111011 사이에 논리 "AND"를 적용하고 결과는 다시 배치됩니다. DDRD 메모리에서. 참고 : "AND"연산자는 DDRD 메모리의 각 비트에 대해 위의 이진수와 비교합니다. DDRD의 비트가 0이고 동일한 바이트 위치에있는 이진의 비트가 1 인 경우 결과 비트는 0입니다. DDRD가 1이고 이진의 비트가 1이면 결과 비트는 1이며 DDRD의 비트는 1 또는 0이고 이진의 비트는 0이며 결과 비트는 항상 0입니다. 요약하면, DDRD & = ~ (1 << PD2) 명령은 비트 PD2 만 0으로 변경하고 다른 것 (0 또는 1)은 그대로 둡니다. 조금 복잡해 보이지만 익숙해지면 다른 비트를 변경하지 않고 비트를 조금 변경하는 가장 좋은 방법입니다.

comment # 2 : (1 << PD2)는 이진수 00000100을 생성합니다. 주석 # 1에 설명 된 것과 동일한 논리 "AND"를 사용하여 "PIND & 0000100"명령은 PIND2 (푸시 버튼이 연결된 입력 핀) 만 검사합니다. to)가 높음으로 설정되어 있습니다. 이진 비트가 0으로 설정되고 이진 비트 # 2가 1로 설정되므로 다른 모든 핀은 FALSE가됩니다. PD2 입력이 high로 설정된 경우에만 IF 문이 TRUE이고 PD2 입력이 FALSE이면 IF 문이 참입니다. 낮음으로 설정하십시오.

comment # 3 : 주석 # 1에 설명 된 논리에 따라이 명령은 포트 PORTB의 출력 핀 PINB2를 고전압으로 설정합니다. ~ 300ohm의 저항으로이 핀 포트에 LED가 올바르게 연결되어 있고 해당 저항이 접지에 연결되어 있으면 LED가 켜져 야합니다.

comment # 4 : 이전 설명에서 설명한 것과 같은 이유로 LED가 꺼집니다.

최종 고려 사항 :

a) 푸시 버튼을 누르지 않을 때 (개방 회로) 입력 핀 PD2의 전압 진동을 피하려면 풀다운 저항 (1kOhm 이상)을 배치하여 실수로 LED가 켜지지 않도록하는 것이 좋습니다. 이 임의의 전압 진동에.

b) 고지 사항 : 여기에 설명 된 아이디어는 교육용으로 만 사용해야하며 전자 전문가에게 문의하기 전에 실제 시스템에서 사용해서는 안됩니다.

* /


3
이메일로 연락하면 개인 커뮤니케이션이 이루어 지므로 이메일을 보내지 않는 것이 좋습니다. 따라서 다른 누구도 혜택을 볼 수 없습니다. 그러나 개인 통신을 위해 전자 메일을 제공하려는 경우 가장 좋은 방법은 프로필입니다.
Daniel Grillo

# 3이 LED를 끄고, # 4가 LED를 켜나요?
sitilge

2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

제공된 링크에 대해 @joby Taffey에게 감사합니다. 나는 EEPROM 기능을 찾고 있었고 다음으로부터 많은 도움을 받았습니다 : mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c 대단히 감사합니다.
Bishal Paudel



0

기계식 스위치의 디지털 입력을 처리 할 때 고려해야 할 사항은 접점이 튀는 것입니다. 단일 버튼 누름을 여러 번 누르는 것으로 변경해야합니다.

버튼을 누르고있을 때 LED를 켜는 것과 같은 경우에는 수신 거부에 대해 걱정할 필요가 없습니다. 좀 더 복잡한 것 (예 : 버튼 누름으로 LED를 토글하는 것과 같은)의 경우, 디 바운싱은 필수입니다.

Jack Ganssle은 Debouncing에 대한 좋은 가이드를 가지고 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.