BASIC4MCU | 질문게시판 | ATmega128 출력비교인터럽트 질문
페이지 정보
작성자 Dkliekeun 작성일2024-04-09 13:01 조회4,404회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=23684
본문
#include <mega128.h>
unsigned char led = 0xFF; // LED 출력 초기값
unsigned char cnt = 0; // 타이머/카운터0 인터럽트 발생 횟수
void main(void)
{
// 포트 초기화
DDRC = 0xFF;
PORTC = led;
// 인터럽트 초기화
TIMSK = 0x01;
TCCR0 = 0x0B; // CTC 모드, 분주비 64
OCR0 = 155;
TCNT0 = 0x00;
SREG = 0x80;
EIMSK = 0b00110000;
EICRB = 0b00001010; // 상승 에지에서 인터럽트 발생 설정
while(1); // 대기
}
interrupt [EXT_INT4] void external_int4(void)
{
TCNT0 = 0x0; // 타이머/카운터0 초기화
cnt = 0; // cnt 초기화
// LED를 0.5초마다 한 번씩 쉬프트
led = led << 1;
if(led == 0xFE) led = 0xFF; // 최하위 비트를 1로 설정하여 반복
PORTC = led; // LED 출력
}
interrupt [EXT_INT5] void external_int5(void)
{
TCNT0 = 0x0; // 타이머/카운터0 초기화
cnt = 0; // cnt 초기화
// LED를 1초마다 한 번씩 쉬프트
led = led << 1;
if(led == 0xFE) led = 0xFF; // 최하위 비트를 1로 설정하여 반복
PORTC = led; // LED 출력
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
cnt++; // cnt 증가
// 0.5초(31) 또는 1초(62) 간격으로 LED를 제어
if(cnt == 31 || cnt == 62) {
led = led << 1;
if(led == 0xFE) led = 0xFF; // 최하위 비트를 1로 설정하여 반복
PORTC = led; // LED 출력
}
인터럽트 4,5 동작이 안되는데 제가 놓친부분이 있을까요ㅠ?
댓글 2
조회수 4,404master님의 댓글
master 작성일
EICRB = 0b00001010; // 상승 에지에서 인터럽트 발생 설정
상승엣지가 아니라 하강엣지입니다.
PE4,PE5핀에 풀업저항이 연결되어 있어야겠죠
master님의 댓글
master 작성일
TCCR0 = 0x0B; // CTC 모드, 분주비 64
OCR0 = 155;
64분주가 아니라 32분주 아닌가요?
312us 주기의 짧은 인터벌로 타이머 인터럽트를 실행 시키는 이유는 뭘까요
31번 카운트해서 500ms가 되려면 500ms/31=16.12903225806452ms
TCCR0=0x0F; OCR0=249; TIMSK=2; //16000000/1024/(1+249),16ms
61ms 인터벌은 이렇게 설정해야 합니다.