Всем привет. Проблема в следующем. Вот код:
___________________________________________________________________________
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int a=0,b=0,c=0,d=0,sek=0,razryad=0;
ISR(TIMER1_COMPB_vect) //обработчик прерывания первого таймера: совпадение
{
TCNT1L=0;
TCNT1H=0;
sek++;
if (sek>60) {a++; sek=0;}
}
ISR(TIMER2_OVF_vect) //обработчик прерывания второго таймера: переполнение
{
TCNT2=0;
if (razryad>3) razryad=0;
if (razryad==0)
{PORTB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(0<<PB3);
PORTD=a;}
if (razryad==1)
{PORTB=(1<<PB0)|(1<<PB1)|(0<<PB2)|(1<<PB3);
PORTD=b;}
if (razryad==2)
{PORTB=(1<<PB0)|(0<<PB1)|(1<<PB2)|(1<<PB3);
PORTD=c;}
if (razryad==3)
{PORTB=(0<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
PORTD=d;}
razryad++;
}
int main(void)
{
//Настройка 16-bit Timer/Counter1(счет секунд)
TCCR1B=(1<<CS12)|(0<<CS11)|(0<<CS10); //делитель CLK/256
OCR1B=28800; //считаем до ... (46875)
TIMSK=(1<<OCIE1B); //разрешаем прерывание по совпадению
//Настройка 8-bit Timer/Counter2(вывод на дисплей)
TCCR2=(1<<CS22)|(0<<CS21)|(1<<CS20); //делитель CLK/1024
TIMSK=(1<<TOIE2); //разрешаем прерывание по переполнению
sei(); //разрешаем прерывания глобально
DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4);
DDRD=(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3);
a=2;
b=4;
c=1;
d=3;
while(1)
{
if (sek%2==0) PORTB=(1<<PB4); //мигание точкой(если секунда четная то включить точку, иначе - выключить
else PORTB=(0<<PB4);
}
}
___________________________________________________________________________
Ожидаемый результат: дерганье одной из ног раз в секунду(светодиод) и вывод на четыре ноги цифры в двоичном виде от 0 до 9, которые потом подаются на дешифратор и на четырехразрядный семисегментник.
В результате: вместо дерганья постоянное горение светодиода и вместо цифр на индикаторе слабо горящие восьмерки.
Пробовал ставить задержку в прерывании второго счетчика и в бесконечном цикле. Это привело к тому, что все начало моргать часто... Напрашивается вывод: велика скорость. Но пробовал запускать прерывания отдельно с теми же настройками таймеров - все работает так как и нужно: цифры видны отлично, без морганий и точка моргает как и положено раз в секунду. А вот вместе - каша... Такое чувство, что одно прерывание мешает другому...
Чувствую себя 100%-м дубом((( Помогите
Раздел: AVR
___________________________________________________________________________
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int a=0,b=0,c=0,d=0,sek=0,razryad=0;
ISR(TIMER1_COMPB_vect) //обработчик прерывания первого таймера: совпадение
{
TCNT1L=0;
TCNT1H=0;
sek++;
if (sek>60) {a++; sek=0;}
}
ISR(TIMER2_OVF_vect) //обработчик прерывания второго таймера: переполнение
{
TCNT2=0;
if (razryad>3) razryad=0;
if (razryad==0)
{PORTB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(0<<PB3);
PORTD=a;}
if (razryad==1)
{PORTB=(1<<PB0)|(1<<PB1)|(0<<PB2)|(1<<PB3);
PORTD=b;}
if (razryad==2)
{PORTB=(1<<PB0)|(0<<PB1)|(1<<PB2)|(1<<PB3);
PORTD=c;}
if (razryad==3)
{PORTB=(0<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
PORTD=d;}
razryad++;
}
int main(void)
{
//Настройка 16-bit Timer/Counter1(счет секунд)
TCCR1B=(1<<CS12)|(0<<CS11)|(0<<CS10); //делитель CLK/256
OCR1B=28800; //считаем до ... (46875)
TIMSK=(1<<OCIE1B); //разрешаем прерывание по совпадению
//Настройка 8-bit Timer/Counter2(вывод на дисплей)
TCCR2=(1<<CS22)|(0<<CS21)|(1<<CS20); //делитель CLK/1024
TIMSK=(1<<TOIE2); //разрешаем прерывание по переполнению
sei(); //разрешаем прерывания глобально
DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4);
DDRD=(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3);
a=2;
b=4;
c=1;
d=3;
while(1)
{
if (sek%2==0) PORTB=(1<<PB4); //мигание точкой(если секунда четная то включить точку, иначе - выключить
else PORTB=(0<<PB4);
}
}
___________________________________________________________________________
Ожидаемый результат: дерганье одной из ног раз в секунду(светодиод) и вывод на четыре ноги цифры в двоичном виде от 0 до 9, которые потом подаются на дешифратор и на четырехразрядный семисегментник.
В результате: вместо дерганья постоянное горение светодиода и вместо цифр на индикаторе слабо горящие восьмерки.
Пробовал ставить задержку в прерывании второго счетчика и в бесконечном цикле. Это привело к тому, что все начало моргать часто... Напрашивается вывод: велика скорость. Но пробовал запускать прерывания отдельно с теми же настройками таймеров - все работает так как и нужно: цифры видны отлично, без морганий и точка моргает как и положено раз в секунду. А вот вместе - каша... Такое чувство, что одно прерывание мешает другому...
Чувствую себя 100%-м дубом((( Помогите
Раздел: AVR