Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: библиотека таймеров на мегу8
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Метценгерштейн
Кто-нибудь использует подобную библиотеку для работы с таймерами? Т.е. в прерывании одна переменная крутится, а работа с библиотекой выглядит, например,
нужен однократный таймер. указываем время, запускаем его, передаем указатель на ф-ю. Через установленное время срабатывает таймер, вызывается коллбэк ф-я, что передавалась при инициализации, и уже выполняется код, что в этой ф-ии.
Кто-нибудь сталкивался с таким подходом? Может есть у кого готовое решение на мегу?
megajohn
Цитата(Метценгерштейн @ Feb 26 2015, 22:54) *
Может есть у кого готовое решение на мегу?


есть такой опенсорсный проект для детской машинки под IAR и mega48

там в algo.c написано

Код
    buzz_handler.init( buzz_func, period_10ms, 2 );
    systimer_add( &buzz_handler );

    algo_handler.init( algo_func, period_100ms, 3 );
    systimer_add( &algo_handler );


что означает, что в buzz_func будешь попадать каждые 20 мс, а в algo_func каждые 300 мс

чтобы однократно, то в конце каждой функции поставить buzz_handler.pause() и algo_handler.pause()

для твоей задачи, можно всё упростить, но не забывать что в прерывании нежелательно долго сидеть, а ты собираешся еще кучу функций вызывать
demiurg1978
Цитата(megajohn @ Feb 27 2015, 10:03) *
...

Плохой совет. Такой способ - мина замедленного действия.

Я сделал так: системный тик 1 мс. В прерывании таймера выставляется флаг. В основном цикле типа служба программных таймеров. Если флаг сброшен, то выход. Если флаг установлен, то перебор очереди таймеров. Структура программного таймера - статус, 2 байтный счетчик. Если таймер включен, декремент счетчика. Если не ноль, следующий таймер. Если ноль, установка флага статуса, следующий таймер.

Но, чтобы пользоваться такой службой таймеров, нужно следовать следующим правилам. Модульность программы. Никаких долгих циклов. Задачи дробятся условиями, флагами, использованием конечных автоматов. Выполнение основного цикла должно уложиться в системный тик с запасом.
st232bd
Я много лет назад на асме делал на MSP430. Циклограммы бил на цепочки функций. У 430 call с косвенной адресацией работает. Каждая функция грузит время следующего прерывания, указатель на следующую функцию и делает че надо. Типа односвязного списка с указателями. На си - указатель на функцию. Не нужна библиотека, все элементарно. Самый банальный пример - регенерация жки-двухстрочника. Образ памяти, и на каждое прерывание по символу, чтобы не ждать задержку. В образ пишешь быстро.
megajohn
Цитата(demiurg1978 @ Mar 12 2015, 12:25) *
Плохой совет. Такой способ - мина замедленного действия.
Я сделал так: системный тик 1 мс. В прерывании таймера выставляется флаг.

Так ведь и сделано. Что-то вы попутались.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.