ATMEGA128 0번핀과1번핀 스위치를 누르면 LED점등 속도 제어
페이지 정보
작성자 dfas123 작성일22-05-11 15:40 조회1,062회 댓글3건본문
CTC모드와 외부인터럽트를 이용해서 0번 스위치를 누르면 1초간격으로 LED패턴이 바뀌고,
1번 스위치를 누르면 0.5초간격으로 패턴이 바뀌는것을 프로그래밍 해보았으나, 스위치를 눌러도 반응이 없습니다. 어디부분이 잘못된 것일까요?
#include <mega128.h>
unsigned char led = 0xfe;
unsigned int cnt, delaytime, delaymax, delaymin, step;
interrupt [EXT_INT0] void exint0(void)
{
if(delaytime + step <= delaymax) delaytime += step;
}
interrupt [EXT_INT1] void exint1(void)
{
if(delaytime - step >= delaymin) delaytime -= step;
}
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
if(cnt-- ==1 ) //(10USEC=10X10^-6 X 50000)= 500ms=0.5 (msec= 10^-3) (usec= 10^-6) (1초=1000ms)
{
cnt = delaytime;
if(led!=0x7f) led = (led << 1) | 0x01;
else led = 0xfe;
}
OCR2 = 159; PORTC = led;
}
void main(void)
{
DDRC = 0xff;
PORTC = led;
SREG |= 0x80;
TIMSK |= 0x80;
TCCR2 |= 1;
TCCR2 |= 0x08;
OCR2 = 159; //10USEC= 1*(1+159)/16
delaytime=50000;
cnt = delaytime;
delaymax=100000;
delaymin=50000;
step=50000;
for(;;);
}
댓글 : 3
조회수 : 1,062
master님의 댓글
master 작성일
delaymax=100000;
unsigned int의 범위를 벗어납니다. 0~65535
master님의 댓글
master 작성일
#include <mega128.h>
//
unsigned char led=0xfe;
unsigned int cnt=0,delaytime=1000;
//
interrupt [EXT_INT0] void exint0(void){ delaytime=1000; }
interrupt [EXT_INT1] void exint1(void){ delaytime= 500; }
//
interrupt [TIM2_COMP] void timer2_comp_isr(void){ // 1ms
if(++cnt>=delaytime){ cnt=0;
if(led!=0x7f)led=(led<<1)|1;
else led=0xfe;
}
PORTC=led;
}
//
void main(void){
DDRC=0xff; PORTC=led;
TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1ms
SREG=0x80;
for(;;);
}
dfas123님의 댓글
dfas123
정말 감사합니다 덕분에 문제가 해결되었습니다!