거북이처럼 천천히

Atmega 128A의 버튼 (기초) 본문

Embedded Programming/Atmega 128A (실습)

Atmega 128A의 버튼 (기초)

유로 청년 2024. 5. 26. 20:54

1. 환경 : Microchip Studio

2. 목표 : 1) PD0에 버튼을 연결, 2) Pull-UP 회로 구성

               3) PORTF에 LED의 연결 한 뒤, 3번째 핀만 출력으로 사용

               ==> 버튼을 누르기 전 상태는 LED가 꺼져 있지만, 버튼을 누르면 LED가 켜지도록 설계

3. 선행 지식

- 프로그래밍 하기전, 회로를 구성함에 따라 동작 결과는 전혀 다르게 나타나기 때문에 회로에 대한

  기초 지식이 필요하다.

- Floating, Pull-up, Pull-down 에 대해서 이해할 필요가 있다.

- https://jbhdeve.tistory.com/147 

 

Floating, Pull-up, Pull-down

목표) 다음과 같은 궁금증을 알아보도록 하겠다.         1. 왜 일반적으로 스위치를 MCU와 연결할 때, Floating 현상을 접하게 되는가?          2. 이 때, Floating 문제를 해결하기 위해 10K Ohm 저항

jbhdeve.tistory.com

 

 

4. Source code

- 해당 코드는 풀 업 회로를 구성한 뒤, 아래와 같은 동작하도록 설게했다.

  ● 버튼이 눌렀을 때, PORT F의 3번째 다이오드가 켜진다.

   버튼을 누르지 않으면, PORT F의 3번째 다이오드는 꺼진다.

 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

// Substitute constant
#define BUTTON_DDR DDRD
#define LED_DDR DDRF
#define LED_PORT PORTF

int main(void) {
   // 포트 D에서 0핀에 Button을 연결할 것이기 때문에
   // 포트 D의 0핀을 통해 입력을 받을 것이기 때문에
   // DDRD = xxxx xxx0 으로 설정
   BUTTON_DDR &= ~(1<<0);
   
   // 포트 F에서 4번핀 만 LED를 출력시키겠다.
   // DDRF = xxxx 1xxx 으로 설정
   LED_DDR |= (1<<3);
   
   while(1) {
      // 현재 회로는 Pull Up 형식으로 구성한 상태이다.
      // 버튼을 누르기 전까지는 Button은 Open 상태이기 때문에 
      // PIND에 5V (= High level)이 인가되는 상태이다.
      // 따라서 (PIND & (1<<0)) == True이다.
      // 즉, 버튼을 누르지 않으면 항상 True이다.
      // 하지만, Pull-down으로 회로를 구성하면 말이 달라진다.
      if(PIND & (1<<0)) LED_PORT &= ~(1<<3);
      else LED_PORT |= (1<<3);
      
      // 하지만, 버튼을 누르면 Pull-up 회로를 기준으로 Vcc를 통해 공급되던 
      // 전류가 Button을 통해 GND로 가기 때문에 PD0를 통해 공급되던 전류의 값은 0A가 된다.
      // 따라서 (PIND & (1<<0)) == False가 된다.
   }
}

 

5. 구현 영상

 

Pull-up 회로임을 명시.

 


※ 마무리

- 동일한 소스 코드라고 해도 회로를 어떻게 구성하느냐에 따라 전혀 다른 결과가 발생할 수 있기 때문에 

   이 점을 유의해서 공부하도록 하자.

'Embedded Programming > Atmega 128A (실습)' 카테고리의 다른 글

Interrupt - 기초 (1)  (0) 2024.05.29
GPIO - LED control (3)  (0) 2024.05.29
Data Direction Register의 비트 단위로 Control  (0) 2024.05.26
궁금증 정리 노트 - Atmega128A  (0) 2024.05.25
Pointer  (0) 2024.05.25