본문 바로가기
PRACTICE/Basic

[C] 입출력장치 레지스터 조작 (인터럽트 서비스 루틴)

by 1005 2025. 3. 14.

ATmega128 GPIO 관련 레지스터 (미리 정해져있는 레지스터임)

 

GPIO(General-Purpose Input/Output)

: 마이크로컨트롤러나 컴퓨터의 칩에서 주변 장치와 상호 작용하기 위해 사용하는 핀(Pin).

🔹 GPIO의 주요 특징

  1. 범용성(General-Purpose)
    • 특정 기능이 정해져 있지 않으며, 프로그래밍을 통해 입력(Input) 또는 출력(Output)으로 설정할 수 있음.
  2. 입력(Input) 모드
    • 버튼, 센서 등에서 신호를 받아들이는 용도로 사용됨.
    • 예: 스위치를 눌렀을 때 HIGH(1) 또는 LOW(0) 감지
  3. 출력(Output) 모드
    • LED, 모터, 부저 등 외부 장치를 제어하는 데 사용됨.
    • 예: LED를 켜고 끄거나 모터를 회전시키기
  4. 디지털 신호 처리
    • GPIO는 0V(LOW) 또는 3.3V/5V(HIGH)와 같은 디지털 신호를 사용함.

🔹 GPIO가 사용되는 대표적인 장치

  • 라즈베리파이 (Raspberry Pi)
  • 아두이노 (Arduino)
  • ESP32, ESP8266 등의 IoT 보드
  • 임베디드 시스템 (예: STM32, BeagleBone 등)

🔹 GPIO의 실제 활용 예시

LED 켜고 끄기
버튼 입력 감지하기
모터 제어
센서 데이터 읽기
I2C, SPI, UART 통신을 통해 외부 기기와 연결

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
volatile unsigned char data = 0b00000000;
 
SIGNAL(SIG_INTERRUT4) { // SIG_INTERRUT4는 스위치 1번에 해당함.
    data = ~data;   // "모든 비트를 뒤집어라"라는 뜻.
}
 
void display_led(int data) {
    PORTA = data;   // 11111111 은 turn on
    _delay_ms(300);
}
 
int main() {
    DDRA = 0b11111111// A에 해당하는 포트를 전부 출력하겠다. (DDRA는 LED를 의미함.)
    DDRE = 0b11101111// 스위치 1번이 연결되어있는 부분인 PE4번만 입력으로 판단하겠다는 뜻. 
 
    EICRB = 0x02;
 
    EIMSK = 0b00010000// INT4 interrupt enable (인터럽트 마스크 레지스터 External interrupt MaSK register)
    SREG I = 1<<7;      // SREG bit7 = I (interrupt enable) == sei(); (상태 레지스터 flag register)
}
 
while (1) { // true
    display_led(data);
}
cs

 

인터럽트 기반으로 입출력 작업을 수행할때도 직접적으로 레지스터를 건드리는 부분이 아주 밑단에서 이루어짐.

댓글