본문 바로가기
EmbeddedSystem/AVR

[AVR] MCU 기초 - GPIO 사용

by TSpoons 2024. 9. 25.

https://www.microchip.com/en-us/product/atmega1281

 
MCU : ATmega1281
 

GPIO 사용을 위해 알아야 할 개념

마이크로컨트롤러(MCU)에서 핀의 입력/출력 동작을 제어하는 중요한 레지스터들

DDR(Data Direction Register)

- 포트의 특정 핀의 방향을 결정 
- DDRE 어떤 비트 값이 1이면 해당 핀은 출력(MCU가 해당 핀으로 신호를 보낼 수 있음)
- DDRn 어떤 비트 값이 0이면 해당 핀은 입력(외부 신호를 MCU가 읽을 수 있음)
- reset 후 모든 핀은 입력으로 동작하도록 설정
 

PORT(register)

- 대응되는 핀이 출력으로 설정되면 PORTxn에 저장된 값이 해당 핀으로 출력됨
- 대응되는 핀이 입력으로 설정되(DDRn == 0)면 PORTxn 값이 1일 때 pull-up 저항 활성화
 

PIN (register)

- 핀의 논리값(만)을 읽을 수 있음 (쓰기 불가)
- PORT 레지스터의 값은 읽진 않음
 
입력 핀에 버튼이 연결되어 있다면, PIN 레지스터를 읽어서 버튼이 눌렸는지(1인지 0인지) 확인 가능
 
 

Masking 

Q. 대입(PORTE = 0x40;) 을 하는 것과 무엇이 다를까?
A. 대입을 하게 되면, 원래 의도와 다르게 다른 bit를 그냥 0으로 만들기 때문에 이전 PIN의 상태값을 무시하게 된다.
 
1로 마스킹 : 

PORTE |= 0x40; // 3번째 bit 1로 마스킹

 
0으로 마스킹:

PORTE &= ~0x40 ;
PORTE &= 0xbf ;

 
toggle

PORTE ^= 0x40; // 3번째 bit toggle

 
 

AVR MCU (my atmega1281 board)

 

 
 
PE7에 연결되어 있는 SW2를 누르면 켜지고 아니면 LED가 꺼지는 예제

// define PINs
#define LED1 PC0
#define LED2 PC1
#define LED3 PC2
#define LED4 PC3
#define SW2 PE7


#include <avr/io.h>
int main(void){
	DDRC = _BV(LED1) | _BV(LED2) | _BV(LED3) | _BV(LED4);
	PORTE = _BV(SW2); // enable pull-up resistor
    
	while(1) {
		if(PINE&_BV(SW2))
			PORTC |= _BV(LED1) | _BV(LED2) | _BV(LED3) | _BV(LED4);
		else
			PORTC &= ~(_BV(LED1) | _BV(LED2) | _BV(LED3) | _BV(LED4));
	}
}

 
 

'EmbeddedSystem > AVR' 카테고리의 다른 글

[AVR] Microchip studio Tutorial  (1) 2024.10.24
[AVR] External Interrupts 2  (1) 2024.10.15
[AVR] External Interrupt  (1) 2024.10.14
[AVR] atmega1281 - switch로 LED 점멸 제어  (0) 2024.10.02
[AVR] atmega1281 - switch / delay 함수  (2) 2024.09.30