1. AVR128DB48 Watchdog 모듈 개요
Microchip의 AVR128DB48 마이크로컨트롤러는 Watchdog Timer(WDT)를 포함하여 시스템 안정성을 높이는 데 유용한 기능을 제공합니다. Watchdog 타이머는 소프트웨어 오류나 시스템 멈춤 시 마이크로컨트롤러를 리셋하여 안정적인 동작을 보장합니다. 이 문서에서는 AVR128DB48의 Watchdog 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.
주요 사양
- 타이머 : 32.768kHz RTC 클럭 또는 내부 1.024kHz 오실레이터 기반
- 타임아웃 기간 : 8ms ~ 8s (8가지 설정 가능)
- 동작 모드 :
- 일반 모드: 타임아웃 시 시스템 리셋
- 윈도우 모드: 특정 시간 창 내에서만 리셋 가능
- 레지스터 :
- WDT.CTRLA: Watchdog 제어 및 타임아웃 설정
- WDT.STATUS: Watchdog 상태 및 동기화 플래그
- 전력 관리 : 저전력 모드에서 동작 지원
- 인터럽트 : 윈도우 모드에서 조기 경고 인터럽트 지원
- 전압 레벨 : 1.8V~5.5V 동작 지원
2. Watchdog Bitfield 설정 상세
AVR128DB48의 Watchdog 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:
2.1 WDT.CTRLA (제어 레지스터 A)
- bit.PERIOD : 타임아웃 기간 설정
- 0x0: 비활성화
- 0x1: 8ms (8 사이클, 1.024kHz 기준)
- 0x2: 16ms
- 0x3: 32ms
- 0x4: 64ms
- 0x5: 128ms
- 0x6: 256ms
- 0x7: 512ms
- 0x8: 1s
- 0x9: 2s
- 0xA: 4s
- 0xB: 8s
- bit.WINDOW : 윈도우 모드 타임아웃 설정 (윈도우 모드에서 사용, PERIOD와 동일한 값 사용)
- bit.LOCK : Watchdog 잠금 (1: 설정 후 변경 불가)
- 예: WDT.CTRLA = WDT_PERIOD_1S_gc; (1초 타임아웃 설정)
2.2 WDT.STATUS (상태 레지스터)
- bit.SYNCBUSY : 동기화 진행 중 플래그 (1: 동기화 중)
- bit.LOCK : Watchdog 잠금 상태 (1: 잠김)
3. Watchdog 설정 절차
- 시스템 초기화 :
- 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
- 인터럽트 비활성화 (cli())
- Watchdog 비활성화 :
- 초기 설정 시 Watchdog 비활성화 (_PROTECTED_WRITE(WDT.CTRLA, 0);)
- 타임아웃 설정 :
- WDT.CTRLA에 PERIOD 값 설정
- 윈도우 모드 설정 (옵션) :
- WDT.CTRLA에 WINDOW 값 설정
- Watchdog 잠금 (옵션) :
- WDT.CTRLA.bit.LOCK = 1로 설정 변경 방지
- Watchdog 활성화 :
- 설정 후 즉시 동작
- Watchdog 리셋 :
- wdt_reset() 매크로 호출로 타이머 초기화
4. Watchdog 설정 고려사항
- 클럭 소스 : 1.024kHz 내부 오실레이터 안정화 확인
- 타임아웃 선택 : 애플리케이션 요구사항에 맞는 타임아웃 기간 설정
- 윈도우 모드 : 너무 짧은 윈도우 설정 시 리셋 실패 가능성 주의
- 잠금 기능 : LOCK 비트 설정 후 변경 불가, 신중히 사용
- 저전력 모드 : Watchdog은 슬립 모드에서도 동작
- 인터럽트 : 윈도우 모드에서 조기 경고 인터럽트 활용 가능
5. Watchdog 예제 코드 (Bitfield 구조)
아래는 AVR128DB48 Watchdog를 Bitfield 구조로 설정한 3개의 예제 코드입니다. 각 예제는 Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다.
5.1 예제 1: 기본 Watchdog 설정 (1초 타임아웃)
// File: wdt_basic.c
// Description: AVR128DB48 Watchdog 기본 설정 예제 (1초 타임아웃)
// 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);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // XOSC32K 안정화 대기
}
// 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00); // 프리스케일러 비활성화
}
void wdt_init(void) {
// Watchdog 비활성화 (안전한 설정을 위해)
_PROTECTED_WRITE(WDT.CTRLA, 0);
// Watchdog 1초 타임아웃 설정
_PROTECTED_WRITE(WDT.CTRLA, WDT_PERIOD_1S_gc);
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
wdt_init(); // Watchdog 초기화
// PB3(LED0)를 출력으로 설정
PORTB.DIRSET = PIN3_bm;
PORTB.OUTSET = PIN3_bm;
while (1) {
// Watchdog 리셋 (타이머 초기화)
wdt_reset();
PORTB.OUTTGL = PIN3_bm; // LED 토글
_delay_ms(500); // 500ms 지연
}
return 0;
}
설명:
- 기능 : 1초 타임아웃으로 Watchdog 설정, PB3 LED를 500ms 간격으로 점멸
- 설정 : Watchdog 1초 타임아웃, PB3 출력 설정
- 출력 : Watchdog 리셋 호출로 정상 동작 시 LED 점멸, 1초 내 리셋 없으면 시스템 리셋
5.2 예제 2: 윈도우 모드 Watchdog
// File: wdt_window_mode.c
// Description: AVR128DB48 Watchdog 윈도우 모드 예제 (1초 타임아웃, 500ms 윈도우)
// 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) {
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // XOSC32K 안정화 대기
}
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
}
void wdt_init(void) {
// Watchdog 비활성화
_PROTECTED_WRITE(WDT.CTRLA, 0);
// 윈도우 모드: 500ms 윈도우, 1초 타임아웃
_PROTECTED_WRITE(WDT.CTRLA, WDT_WINDOW_512MS_gc | WDT_PERIOD_1S_gc);
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
wdt_init(); // Watchdog 초기화
// PB3(LED0)를 출력으로 설정
PORTB.DIRSET = PIN3_bm;
PORTB.OUTSET = PIN3_bm;
while (1) {
_delay_ms(600); // 600ms 대기 (윈도우 내 리셋)
wdt_reset(); // Watchdog 리셋
PORTB.OUTTGL = PIN3_bm; // LED 토글
}
return 0;
}
설명:
- 기능 : 500ms 윈도우, 1초 타임아웃으로 윈도우 모드 설정, PB3 LED 점멸
- 설정 : 윈도우 모드 활성화, 600ms 간격으로 리셋 호출
- 출력 : 윈도우(500ms~1s) 내 리셋 시 정상 동작, 그렇지 않으면 시스템 리셋
5.3 예제 3: Watchdog 잠금 및 LED 제어
// File: wdt_lock.c
// Description: AVR128DB48 Watchdog 잠금 예제 (2초 타임아웃, 잠금 활성화)
// 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) {
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
; // XOSC32K 안정화 대기
}
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
}
void wdt_init(void) {
// Watchdog 비활성화
_PROTECTED_WRITE(WDT.CTRLA, 0);
// 2초 타임아웃 설정, 잠금 활성화
_PROTECTED_WRITE(WDT.CTRLA, WDT_PERIOD_2S_gc | WDT_LOCK_bm);
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
wdt_init(); // Watchdog 초기화
// PB3(LED0)를 출력으로 설정
PORTB.DIRSET = PIN3_bm;
PORTB.OUTSET = PIN3_bm;
while (1) {
wdt_reset(); // Watchdog 리셋
PORTB.OUTTGL = PIN3_bm; // LED 토글
_delay_ms(1000); // 1초 지연
}
return 0;
}
설명:
- 기능 : 2초 타임아웃, 잠금 활성화, PB3 LED를 1초 간격으로 점멸
- 설정 : Watchdog 2초 타임아웃, LOCK 비트 설정, 1초 간격 리셋
- 출력 : 2초 내 리셋 호출 시 LED 점멸, 그렇지 않으면 시스템 리셋
6. 사용 방법
6.1 환경 설정
- AVR-GCC 설치 : Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
- 헤더 파일 : <avr/io.h>, <util/delay.h> 포함
- 프로젝트 설정 : AVR128DB48 타겟으로 프로젝트 생성
- 클럭 정의 : #define F_CPU 24000000UL로 시스템 클럭 설정
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 다른 예제 코드 주석 처리
- Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱
6.3 하드웨어 준비
- LED 출력 : PB3에 LED 및 전류 제한 저항(예: 330Ω) 연결
- 전원 : 1.8V~5.5V 전원 공급
- 테스트 : Watchdog 동작 확인을 위해 리셋 호출 제거 후 시스템 리셋 확인
6.4 디버깅
- Atmel Studio/MPLAB X IDE의 디버거 사용
- WDT.STATUS 레지스터 확인 (SYNCBUSY, LOCK 상태)
- 오실로스코프 또는 로직 분석기로 리셋 신호 점검
7. 추가 팁
- 클럭 안정화 : set_system_clock()로 XOSC32K 안정화 확인
- 타임아웃 설정 : 애플리케이션 루프 시간에 맞게 PERIOD 설정
- 윈도우 모드 : 윈도우 기간이 너무 짧으면 리셋 실패 가능성 있음
- 잠금 기능 : LOCK 비트 설정 후 변경 불가, 신중히 사용
- Microchip 리소스 : AVR128DB48 데이터시트, Application Notes, AVR-GCC 예제
- 문제 해결 :
- Watchdog 동작 안 함: WDT.CTRLA 설정 및 동기화 확인
- 예기치 않은 리셋: wdt_reset() 호출 주기 확인
- 설정 변경 불가: WDT.STATUS.LOCK 확인
- 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고
8. 결론
이 문서는 AVR128DB48 Watchdog Timer의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 시스템 안정성을 높이는 데 활용할 수 있도록 구성했습니다. 초보자는 기본 Watchdog 설정부터 시작하고, 숙련자는 윈도우 모드와 잠금 기능을 활용하여 복잡한 시스템을 구현할 수 있습니다.
키워드 : AVR128DB48, Watchdog, WDT, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, 시스템 리셋, 윈도우 모드, 잠금 기능, 저전력
'MCU > AVR' 카테고리의 다른 글
[AVR128DB48] OPAMP 및 아날로그 비교기 사용 방법 및 예제 코드 (0) | 2025.08.20 |
---|---|
[AVR128DB48] PWM 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] 이벤트 시스템 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] ADC 및 DAC 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] SPI 사용 방법 및 예제 코드 (0) | 2025.08.19 |
[AVR128DB48] I2C 사용 방법 및 예제 코드 (0) | 2025.08.19 |
[AVR128DB48] UART 사용 방법 및 예제 코드 (1) | 2025.08.19 |
[AVR128DB48] GPIO 사용 방법 및 예제 코드 (0) | 2025.08.18 |