Например TDA7294

Форум РадиоКот :: Просмотр темы - Как мне обстоять с таймерами?
Форум РадиоКот
https://radiokot.ru/forum/

Как мне обстоять с таймерами?
https://radiokot.ru/forum/viewtopic.php?f=57&t=77518
Страница 1 из 1

Автор:  Protobear [ Вс сен 02, 2012 21:31:43 ]
Заголовок сообщения:  Как мне обстоять с таймерами?

Ребята коты, всем привет! Хочу сделать отсчет времени в мк атмега8, но проблема в том что помимо этого еще хочу чтоб выполнялся мой код. На сколько я понимаю прерывание начнет выполнять код с того места где (допустим по обнулению таймера) оно ушло на код обработчика прерывания, но в таком случае тот же вывод на экран не выполнится, т.к. до того как выполнится код выводящий информацию на экран, таймер опять прервет его.

Есть ли в Атмегах какой - нибудь способ независимо считать а при надобности брать набежавшее значение? т.е. допустим запустили таймер- он считает себе и можно выполнять другие команды, но в опр момент можно забрать значение таймера. Заранее благодарен.
PS Поправлюсь, я имею в виду более длительный таймер нежели клок/1024 и все это заполняет (в случае 8 бит) 256 значений. т.е. шибко такой таймер не поможет если речь идет о секундах. - как сделать таймер более вместительным?

Автор:  Jack_A [ Вс сен 02, 2012 22:56:07 ]
Заголовок сообщения:  Re: Как мне обстоять с таймерами?

Не совсем ясна задача. Если просто вести отсчет времени до определенного события - это одно, а вести и выводить постоянно, к примеру, на экран - это другое.
Допустим, второй вариант. Вывод времени на LED индикаторы динамический. Настраиваем таймер, к примеру, на 1 мс. Каждую миллисекунду в прерывании во-первых, инкрементируем значение времени - мс - сек - мин - час , и когда изменится значение сек - мин - час ,
обновляем буфер вывода ; во-вторых, циклически выводим инфу из упомянутого буфера вывода в позиции знакомест индикаторов, получим частоту обновления 166Гц, что больше чем достаточно, и не занимает много процессорного времени.
Можно по другому. Один таймер занимается только обслуживанием индикаторов, второй - подсчетом времени, и когда ( см. выше ) - он выставляет флаг, по которому второй таймер, отвлекшись от стробирования разрядов, обновляет буфер вывода.
Вариантов может быть много. Главное - в прерывании производить минимально необходимые действия, чтобы оставить время основной программе.

Автор:  Protobear [ Пн сен 03, 2012 01:34:19 ]
Заголовок сообщения:  Re: Как мне обстоять с таймерами?

Так вот одна неувязочка - я помоему жестко затупил и подумал что прерывание заново весь код гонит, но ведь оно просто будет потихонечку вклиниваться и делать свое дело, а код дальше продолжаться ведь так?
В таком случае прошу помочь с кодом:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
volatile char timer2=0;
ISR(TIMER0_OVF_vector)
{
timer2=105;//пока о ++ не идет речь, 105 хотя бы вывести)
}
int main()
{
TCCR0=0x05;//clk/1024
TIMSK=0x01;//прерывания
while (1)
{

itoa(timer2,&mass[0],10)/вывод на экран
вывод(mass);
}
}
/*Такой код у меня не работает почему то :?
PS Может fuse есть какой - то за прерывание отвечающий, или с глобальным разрешением прерывания что - то не то:(
*/

Автор:  pokk [ Пн сен 03, 2012 07:47:09 ]
Заголовок сообщения:  Re: Как мне обстоять с таймерами?

Protobear писал(а):
....или с глобальным разрешением прерывания что - то не то:(

Да вот его что-то не видно в CodeVisionAVR это так #asm("sei"). По пробуйте что нибудь такое поставить перед циклом.

Автор:  Protobear [ Пн сен 03, 2012 08:25:36 ]
Заголовок сообщения:  Re: Как мне обстоять с таймерами?

pokk писал(а):
Protobear писал(а):
....или с глобальным разрешением прерывания что - то не то:(

Да вот его что-то не видно в CodeVisionAVR это так #asm("sei"). По пробуйте что нибудь такое поставить перед циклом.

в WInAVR это так на сколько я понял sei(); поставил, но мой основной код вообще перестал выполнятся, а ножка D5 не знаю как остальной порт Д, начала дрыгаться(у меня на нее стоит включение подсветки LCD) Впрочем код по прерыванию тоже не выполняется видно 0 в первой строке и все, и пропорционально частоте мигает подсветка.
вот так поставил:
TCCR0=0x05;//clk/1024
TIMSK=0x01;//прерывания
sei();//////////////////////////вот она
DDRD=0x20;
PORTD|=0x20;// А вот тут вопрос - почему дрыгается лапка при включенном sei();Это таймер/счетчик 1 но я его вообще не включал.
while (1)
{

itoa(timer2,&mass[0],10)/вывод на экран
вывод(mass);
}
}

Автор:  Protobear [ Вт сен 04, 2012 01:37:08 ]
Заголовок сообщения:  Re: Как мне обстоять с таймерами?

Protobear писал(а):
ISR(TIMER0_OVF_vector)
{
timer2=105;//пока о ++ не идет речь, 105 хотя бы вывести)
}

*/

Ув. Protobear, вы не правильно написали, а затем напечатали код - при переписывании из ДШ возможно по ошибке на писали vector, вместо vect
PS ISR(TIMER0_OVF_vect) Вот так работает) - Остается страшной тайной что такое vector и почему его пропустил компилятор и за что он тогда отвечает.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/