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 |