BASIC4MCU | 질문게시판 | atmega 128 timer interrupt에 관한 질문
페이지 정보
작성자 atmemem 작성일2023-12-12 01:04 조회688회 댓글0건본문
main 함수와 interrup 1,2,를 통해 얻은 second와 minute을 interrupt0가 발생하면 countdown 되는 프로그램을 구현하고싶은데, int0를 발생시켜도 작동하지 않아 도움이 필요합니다. 감사합니다.
#define F_CPU 16000000
#define INIT_SEC 0
#define INIT_MIN 0
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int fixed_minutes;int fixed_seconds;
unsigned char count_int=0;
char count=0, Seconds=INIT_SEC, Minutes=INIT_MIN;
void countdown(void);
const unsigned char Segment_Data[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F}; //"0, 1, 2, 3, 4, 5, 6, 7, 8, 9"
unsigned int COLUMN[4]={0,0,0,0};
ISR(TIMER0_OVF_vect) { // TIMER0 has overflowed
count_int++; // count_intMNOP
if(count_int == 244) {
PORTG ^= 0x03;
fixed_seconds--;
count_int=0;
}
}
ISR(INT0_vect)
{
countdown();
}
ISR(INT1_vect)
{
Minutes++;
}
ISR(INT2_vect)
{
Seconds++;
}
int main(void) {
DDRA=0xff; // PORTA Z[\]^_`
DDRC=0xff; // PORTC Z[\]^_`
DDRG = 0x03; // PORTGaD0, D1bZ[]^_`
EICRA = 0x3F; // Rising Edge detection on INT0 & INT1
EIMSK = 0x07; // Set INT0 & INT1
SREG |= 0x80; // Global Interrupt Enable
while (1) {
COLUMN[0] = (Minutes%100)/10; //
COLUMN[1] = (Minutes%10); //
COLUMN[2] = (Seconds%100)/10; //
COLUMN[3] = (Seconds%10); // .
for(int i=0;i<4;i++) {
PORTC=~(0x01<<i);// iqrefjm
PORTA = Segment_Data[COLUMN[i]];
_delay_ms(2);
}
if(Seconds>=60) { // p601c= 60p
Seconds=0;
Minutes++;
}
}
}
void countdown()
{
TCCR0 = 0x06; // Normal mode, prescale 256, 16M/256=62500Hz
TCNT0 = 0x00; // n=0, 256 count, 62500Hz/256=244.14Hz
TIMSK = 0x01; // timer0 OVERFLOW interrupt enable
while(1){
fixed_seconds=Seconds;
fixed_minutes=Minutes;
COLUMN[0] = (fixed_minutes%100)/10; //
COLUMN[1] = (fixed_minutes%10); //
COLUMN[2] = (fixed_seconds%100)/10; //
COLUMN[3] = (fixed_seconds%10); // .
for(int i=0;i<4;i++) {
PORTC=~(0x01<<i);// iqrefjm
PORTA = Segment_Data[COLUMN[i]];
_delay_ms(2);
}
if(fixed_seconds<=0) {
fixed_seconds=60;
fixed_minutes--;
}
}
}
댓글 0
조회수 688등록된 댓글이 없습니다.