Таймеры Счетчики

8-09-2013, 11:19 От: admin Посмотрели: 771
Всем привет. Проблема в следующем. Вот код:



___________________________________________________________________________

#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

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Таймеры Счетчики все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031