Atmega 128A의 버튼 (기초)
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. 구현 영상
※ 마무리
- 동일한 소스 코드라고 해도 회로를 어떻게 구성하느냐에 따라 전혀 다른 결과가 발생할 수 있기 때문에
이 점을 유의해서 공부하도록 하자.