Добрый день, по ходу работы над 7-ми сегментными часами на ATmega8515 вылезла проблема с прерываниями, по счетчику. Перелопатил кучу информации и даташит, но в данном виде программы прерывания не работают, в чем может быть проблема?
Раздел: AVR
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define digit_display_time 10
unsigned char milliseconds, seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours;
ISR(TIMER1_COMPA_vect)
{
milliseconds++;
TCNT1H=0x00;
TCNT1L=0x00;
if (milliseconds >= 1000 )
{
milliseconds = 0;
seconds++;
};
if (seconds >= 10)
{
seconds = 0;
ten_seconds++;
};
if (ten_seconds >= 6)
{
ten_seconds = 0;
minutes++;
};
if (minutes >= 10)
{
minutes = 0;
ten_minutes++;
};
if (ten_minutes >= 6)
{
ten_minutes = 0;
hours++;
};
if (hours >= 10)
{
hours = 0;
ten_hours++;
};
if (ten_hours >= 2 && hours == 4)
{
ten_hours = 0;
hours=0;
};
}
void timer_init()
{
//OCR1A=125;
OCR1AH = 0b00000000;// 125
OCR1AL = 0b01111101;
//Предделитель на х64
TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10);
//Прерывание по совпадению TC1 A
TIMSK=(1<<OCIE1A);
sei();
}
int main(void)
{
timer_init();
unsigned char digits[10] = {63,6, 91, 79, 102, 109, 125, 7, 127, 111};
DDRA = 0b11111111;
DDRC = 0b11111111;
PORTC = 0b00000000;
while(1)
{
PORTA = digits[seconds];
DDRC = 0b00001000;
_delay_ms(digit_display_time);
PORTA = digits[ten_seconds];
DDRC = 0b00000100;
_delay_ms(digit_display_time);
PORTA = digits[minutes];
DDRC = 0b00000010;
_delay_ms(digit_display_time);
PORTA = digits[ten_minutes];
DDRC = 0b00000001;
_delay_ms(digit_display_time);
}
}
Прикрепленные файлы:
Раздел: AVR