1. AVR128DB48 GPIO 모듈 개요
Microchip의 AVR128DB48은 AVR DB 시리즈의 8비트 마이크로컨트롤러로, 저전력 애플리케이션, 센서 인터페이스, LED 제어, 모터 제어 등 다양한 GPIO(General Purpose Input/Output) 애플리케이션에 적합합니다. GPIO 모듈은 유연한 입출력 설정, 풀업 저항, 인터럽트, 그리고 주변 장치 멀티플렉싱 기능을 제공합니다. 이 문서에서는 AVR128DB48의 GPIO 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.
주요 사양
- 포트 : PORTA, PORTB, PORTC, PORTD, PORTE, PORTF (최대 48개의 GPIO 핀)
- 핀당 기능 :
- 디지털 입출력
- 풀업 저항 설정
- 인터럽트 (상승/하강/양방향 에지, 저레벨)
- 멀티플렉스드 주변 장치 (UART, SPI, TWI 등)
- 클럭 소스 : 시스템 클럭 (최대 24MHz, OSCHF 내부 오실레이터)
- 인터럽트 : 각 포트별 인터럽트 지원 (PORTx_INT)
- 주요 레지스터 :
- DIR: 입출력 방향 설정
- OUT: 출력 데이터 설정
- IN: 입력 데이터 읽기
- PINxCTRL: 핀별 제어 (풀업, 인터럽트, 반전)
- PORTCTRL: 슬루율 제한
- 전력 관리 : 저전력 모드에서 GPIO 동작 지원
- 전압 레벨 : 1.8V~5.5V 동작 지원
2. GPIO Bitfield 설정 상세
AVR128DB48의 GPIO 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:
2.1 DIR (방향 레지스터)
- bit.PINx : 핀 방향 설정 (0: 입력, 1: 출력, x=0~7)
- 예 : PORTA.DIRSET = PIN0_bm (PA0 출력 설정)
2.2 OUT (출력 데이터 레지스터)
- bit.PINx : 출력 값 설정 (0: Low, 1: High)
- 예 : PORTA.OUTSET = PIN0_bm (PA0 High 출력)
2.3 IN (입력 데이터 레지스터)
- bit.PINx : 입력 값 읽기 (0: Low, 1: High)
- 예 : PORTB.IN & PIN0_bm (PB0 입력 상태 확인)
2.4 PINxCTRL (핀 제어 레지스터, x=0~7)
- bit.ISC : 인터럽트 감지 설정
- 0: 비활성화
- 2: 상승 에지
- 3: 하강 에지
- 4: 양방향 에지
- 5: 저레벨
- bit.PULLUPEN : 풀업 저항 활성화 (1: 활성화)
- bit.INVEN : 출력 반전 (1: 반전)
2.5 PORTCTRL (포트 제어 레지스터)
- bit.SRLEN : 슬루율 제한 활성화 (1: 활성화, 전력 소모 감소)
3. GPIO 설정 절차
- 시스템 초기화 :
- set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
- 인터럽트 비활성화 (cli())
- 포트 클럭 활성화 :
- AVR128DB48에서는 별도의 포트 클럭 활성화 불필요 (항상 활성화)
- 방향 설정 :
- PORTx.DIRSET 또는 PORTx.DIRCLR로 입출력 방향 설정
- 출력 설정 :
- PORTx.OUTSET 또는 PORTx.OUTCLR로 출력 값 설정
- 입력 설정 :
- PORTx.PINxCTRL.bit.PULLUPEN으로 풀업 저항 설정
- 인터럽트 설정 (필요 시) :
- PORTx.PINxCTRL.bit.ISC로 인터럽트 조건 설정
- PORTx.INTFLAGS로 인터럽트 플래그 확인
- 포트 실행 :
- 설정 후 즉시 동작 (별도 활성화 불필요)
4. GPIO 설정 고려사항
- 클럭 설정 : 시스템 클럭(24MHz) 및 XOSC32K 안정화 확인
- 풀업 저항 : 입력 핀에서 노이즈 방지용 권장
- 인터럽트 : 다중 핀 인터럽트 시 우선순위 주의
- 저전력 : 슬루율 제한(PORTCTRL.SRLEN)으로 전력 소모 감소
- 멀티플렉싱 : GPIO 핀을 다른 주변 장치(UART, SPI 등)로 사용할 경우 충돌 주의
5. 실용적인 GPIO 예제 코드 (Bitfield 구조)
아래는 AVR128DB48 GPIO를 Bitfield 구조로 설정한 5개의 예제 코드입니다. 각 예제는 Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다.
5.1 예제 1: 기본 GPIO 출력 (LED 제어)
// File: gpio_basic_output.c
// Description: AVR128DB48 GPIO 기본 출력 예제 (LED 점멸)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)
void set_system_clock(void) {
// 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
// CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_ENABLE_bm: XOSC32K 활성화
// CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
// XOSC32K가 안정될 때까지 대기
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
}
// 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
// CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
// CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
// OSCHF를 시스템 클록 소스로 설정
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
// CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
// 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
// CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}
void gpio_init(void) {
// PB3(LED0)를 출력으로 설정
PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
PORTB.OUTSET = PIN3_bm; // PB3 초기값 High (LED 켬)
}
int main(void) {
set_system_clock(); // 시스템 클록 설정 함수 호출
gpio_init(); // GPIO 설정 함수 호출
while (1) {
PORTB.OUTTGL = PIN3_bm; // PB3의 출력 상태를 토글하여 LED를 켜고 끔
_delay_ms(500); // 500ms 지연 (LED 깜빡임 주기 조정)
}
return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}
설명:
- 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸
- 설정 : PB3 출력 설정, 초기 High, 토글로 점멸
- 출력 : PB3에 LED 점멸 출력
5.2 예제 2: GPIO 입력 (버튼 읽기)
// File: gpio_input_button.c
// Description: AVR128DB48 GPIO 입력 예제 (버튼으로 LED 제어)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)
void set_system_clock(void) {
// 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
// CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_ENABLE_bm: XOSC32K 활성화
// CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
// XOSC32K가 안정될 때까지 대기
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
}
// 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
// CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
// CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
// OSCHF를 시스템 클록 소스로 설정
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
// CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
// 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
// CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}
void gpio_init(void) {
// PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
PORTB.DIRCLR = PIN0_bm; // PB0 핀을 입력으로 설정 (Curiosity Nano의 SW0)
PORTB.PIN0CTRL |= PORT_PULLUPEN_bm; // PB0에 풀업 저항 활성화
}
int main(void) {
set_system_clock(); // 시스템 클록 설정 함수 호출
gpio_init(); // GPIO 설정 함수 호출
while (1) {
if (!(PORTB.IN & PIN0_bm)) { // PB0가 Low일 때 (버튼 누름)
PORTB.OUTSET = PIN3_bm; // PB3 High (LED 켬)
} else {
PORTB.OUTCLR = PIN3_bm; // PB3 Low (LED 끔)
}
_delay_ms(10); // 디바운싱을 위한 10ms 대기
}
return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}
설명:
- 기능 : PB0에 연결된 버튼 입력에 따라 PB3 LED 제어
- 설정 : PB3 출력, PB0 입력(풀업 저항), 버튼 Low 감지
- 출력 : 버튼 누름 시 LED ON, 놓을 시 LED OFF
5.3 예제 3: GPIO 인터럽트 (버튼 트리거)
// File: gpio_interrupt.c
// Description: AVR128DB48 GPIO 인터럽트 예제 (버튼으로 LED 토글)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤der 파일
#include <avr/interrupt.h> // 인터럽트 처리 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의
volatile uint8_t led_state = 0; // LED 상태를 저장하는 전역 변수 (인터럽트에서 사용)
void set_system_clock(void) {
// 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
// CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_ENABLE_bm: XOSC32K 활성화
// CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
// XOSC32K가 안정될 때까지 대기
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
}
// 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
// CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
// CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
// OSCHF를 시스템 클록 소스로 설정
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
// CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
// 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
// CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}
void gpio_init(void) {
// PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
PORTB.DIRCLR = PIN0_bm; // PB0 핀을 입력으로 설정 (Curiosity Nano의 SW0)
PORTB.PIN0CTRL |= PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc; // PB0 풀업 및 양방향 에지 인터럽트
}
ISR(PORTB_PORT_vect) {
// PORTB 인터럽트 서비스 루틴
led_state ^= 1; // LED 상태 토글 (0->1, 1->0)
if (led_state) {
PORTB.OUTSET = PIN3_bm; // PB3 High (LED 켬)
} else {
PORTB.OUTCLR = PIN3_bm; // PB3 Low (LED 끔)
}
PORTB.INTFLAGS = PIN0_bm; // PB0 인터럽트 플래그 클리어
}
int main(void) {
set_system_clock(); // 시스템 클록 설정 함수 호출
gpio_init(); // GPIO 설정 함수 호출
sei(); // 글로벌 인터럽트 활성화
while (1) {
// 무한 루프: 인터럽트로 LED 제어
}
return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}
설명:
- 기능 : PB0 버튼의 에지 변화로 PB3 LED 토글
- 설정 : PB3 출력, PB0 입력(풀업, 양방향 에지 인터럽트)
- 출력 : 버튼 누름/놓음 시 LED 상태 토글
5.4 예제 4: 슬루율 제한 (저전력 출력)
// File: gpio_slew_rate.c
// Description: AVR128DB48 GPIO 슬루율 제한 예제 (저전력 LED 제어)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)
void set_system_clock(void) {
// 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
// CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_ENABLE_bm: XOSC32K 활성화
// CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
// XOSC32K가 안정될 때까지 대기
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
}
// 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
// CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
// CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
// OSCHF를 시스템 클록 소스로 설정
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
// CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
// 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
// CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}
void gpio_init(void) {
// PB3(LED0)를 출력으로 설정, 슬루율 제한 활성화
PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
PORTB.PORTCTRL |= PORT_SRLEN_bm; // PB3 슬루율 제한 활성화 (저전력)
PORTB.OUTSET = PIN3_bm; // PB3 초기값 High (LED 켬)
}
int main(void) {
set_system_clock(); // 시스템 클록 설정 함수 호출
gpio_init(); // GPIO 설정 함수 호출
while (1) {
PORTB.OUTTGL = PIN3_bm; // PB3의 출력 상태를 토글하여 LED를 켜고 끔
_delay_ms(500); // 500ms 지연 (LED 깜빡임 주기 조정)
}
return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}
설명:
- 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸, 슬루율 제한 적용
- 설정 : PB3 출력, 슬루율 제한 활성화, 초기 High
- 출력 : PB3에 저전력 LED 점멸 출력
5.5 예제 5: 다중 핀 출력 (LED 패턴)
// File: gpio_multi_pin.c
// Description: AVR128DB48 GPIO 다중 핀 출력 예제 (LED 패턴)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)
void set_system_clock(void) {
// 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
// CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_ENABLE_bm: XOSC32K 활성화
// CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
// XOSC32K가 안정될 때까지 대기
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
}
// 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
// CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
// CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
// OSCHF를 시스템 클록 소스로 설정
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
// CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
// CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
// 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
// CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}
void gpio_init(void) {
// PA0, PA1, PA2를 출력으로 설정
PORTA.DIRSET = PIN0_bm | PIN1_bm | PIN2_bm; // PA0, PA1, PA2 핀을 출력으로 설정 (LED 연결)
}
int main(void) {
set_system_clock(); // 시스템 클록 설정 함수 호출
gpio_init(); // GPIO 설정 함수 호출
while (1) {
PORTA.OUT = PIN0_bm; // PA0 ON, PA1/PA2 OFF
_delay_ms(500); // 500ms 지연
PORTA.OUT = PIN1_bm; // PA1 ON, PA0/PA2 OFF
_delay_ms(500); // 500ms 지연
PORTA.OUT = PIN2_bm; // PA2 ON, PA0/PA1 OFF
_delay_ms(500); // 500ms 지연
}
return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}
설명:
- 기능 : PA0, PA1, PA2에 연결된 LED를 순차적으로 점등
- 설정 : PA0~PA2 출력 설정, 순차적 패턴 출력
- 출력 : LED가 순차적으로 점등 (500ms 간격)
6. 사용 방법
6.1 환경 설정
- AVR-GCC 설치 : Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
- 헤더 파일 : <avr/io.h>, <avr/interrupt.h>, <util/delay.h> 포함
- 프로젝트 설정 : AVR128DB48 타겟으로 프로젝트 생성
- 클럭 정의 : #define F_CPU 24000000UL로 시스템 클록 설정
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 다른 예제 코드 주석 처리
- Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱
6.3 하드웨어 준비
- LED 출력 : PB3, PA0, PA1, PA2에 LED 및 전류 제한 저항(예: 330Ω) 연결
- 버튼 입력 : PB0에 버튼 및 풀업/풀다운 저항 연결
- 디바운싱 : 버튼 입력 시 10ms 이상 대기
- 전원 : 1.8V~5.5V 전원 공급
6.4 디버깅
- Atmel Studio/MPLAB X IDE의 디버거 사용
- PORTx.IN, PORTx.OUT, PORTx.INTFLAGS 레지스터 확인
- 오실로스코프 또는 로직 분석기로 GPIO 신호 점검
7. 추가 팁
- 클럭 설정 : set_system_clock()로 XOSC32K 안정화 및 24MHz 설정 확인
- 노이즈 감소 : 입력 핀에 풀업 저항 사용, 외부 디바운싱 회로 추가
- Microchip 리소스 : Microchip AVR128DB48 데이터시트, Application Notes (AN), AVR-GCC 예제
- 문제 해결 :
- 출력 없음: PORTx.DIRSET 및 PORTx.OUTSET 설정 확인
- 인터럽트 실패: PORTx.PINxCTRL 및 PORTx.INTFLAGS 확인
- 버튼 입력 불안정: 디바운싱 처리(소프트웨어/하드웨어) 추가
- 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고
8. 결론
이 문서는 AVR128DB48 GPIO 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 다양한 애플리케이션에 적용 가능하도록 구성했습니다. 초보자는 기본 LED 제어 예제부터 시작하고, 숙련자는 인터럽트 및 다중 핀 제어를 활용하여 복잡한 시스템을 구현할 수 있습니다.
키워드 : AVR128DB48, GPIO, AVR, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, LED 제어, 버튼 입력, 인터럽트, 풀업 저항, 슬루율 제한, 다중 핀
'MCU > AVR' 카테고리의 다른 글
[AVR128DB48] Watchdog 사용 방법 및 예제 코드 (0) | 2025.08.19 |
---|---|
[AVR128DB48] SPI 사용 방법 및 예제 코드 (0) | 2025.08.19 |
[AVR128DB48] I2C 사용 방법 및 예제 코드 (0) | 2025.08.19 |
[AVR128DB48] UART 사용 방법 및 예제 코드 (1) | 2025.08.19 |
[AVR128DB48] 프로젝트 설정 절차 및 기본 프로그램 작성 (0) | 2025.08.18 |
[AVR128DA48] I2C Bit-bang을 STM32 HAL 스타일로 코드 구현 (1) | 2025.08.05 |
[ATMega128A]SPI Bit-Bang 을 STM32 HAL 스타일로 구현 (Implementing SPI Bit-Bang in STM32 HAL Style on ATMega128A) (0) | 2025.08.02 |
[ATMega128A] I2C Bit-Bang을 STM32 HAL 스타일로구현 (Implementing I2C Bit-Bang in STM32 HAL Style on ATMega128A) (0) | 2025.08.02 |