Страница 1 из 1

Как организовать параллельную работу таймеров на 6 каналов?

Добавлено: Вс сен 08, 2013 21:16:49
Ghostgkd777
Ребят,помогите советом неопытному коту...
Нужно считать по очереди 3 выдержки времени параллельно по 6 каналам. Еслиб было наоборот - 6 выдержек одна за одной по 3-м каналам (вывод на порт), то вопросов не возникло-бы. Но тут... Мучаю мегу2560. В распоряжении 4 16-битных и 2 8-битных счетчика. Требуется организовать параллельный подсчет времени по 6-ю каналам (с выводом конечной информации на 24 реле т.е. 6 каналов по 4 реле, все каналы работаю независимо друг от друга). Диапазон задержек составляет от 0,1 до 40 секунд. Потому как я понял (а верно-ли я понял????) использование в этих целях 8-битных таймеров не выйдет и 16 битных явно мало для реализации этой задачи аппаратными методами. Как лучше выполнить данную задачу? У кого какие мысли-идеи на этот счет? Сам склоняюсь к подсчету интервалов 0,1 секунда в таймере и организации шести программных счетчиков до требуемых величин выдержек, работающих одновременно при поступлении прерывания с таймера на 0,1 сек. Основной цикл программы хочу закольцевать на опросе кнопок ввода данных с клавиатуры. Выполнение действия по результату нажатия кнопок или достижения программными таймерами своих установленных величин хочу выполнить в подпрограммах по прерываниям.
Извините, если объяснил расплывчато.... Первый самостоятельный проект на МК. 13 лет назад писал проги под Z80, но тут совсем другая история!
P.S. Ах,да, совсем забыл! Еще требуется пара счетчиков на выдержку для устранения дребезга кнопок и выдержка на мигание 7-сегментным светодиодным табло. Потому имеющиеся 2+4 аппаратных счетчика для поставленной задачи считаю недостаточно.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 07:50:56
pyzhman

Код: Выделить всё

// в обработчике прерывания, срабатывающего каждые 0,1 сек
if(counter_1) --counter_1; // если переменная отлична от нуля, то декремент
if(counter_2) --counter_2;
if(counter_3) --counter_3;
if(counter_4) --counter_4;
if(counter_5) --counter_5;
if(counter_6) --counter_6;
.
.
.
// в теле программы
counter_1= 10; // задаем выдержку 1 сек
if(!counter_1)
    {
// время истекло

    }
Что-то вроде такого.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 08:26:46
Аlex
Ghostgkd777 писал(а):Сам склоняюсь к подсчету интервалов 0,1 секунда в таймере и организации шести программных счетчиков до требуемых величин выдержек, работающих одновременно при поступлении прерывания с таймера на 0,1 сек.
Верно мыслите, так и нужно делать. pyzhman привёл уже пример, так будет правильнее.
Посмотрите ещё в сторону ОСРВ, как раз для Вашего случая. Вот, для примера - http://www.pic24.ru/doku.php/osa/ref/intro , сам ей пользуюсь, отличная операционка.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 09:12:55
Ghostgkd777
Ну слава Кошачьим Богам,я хоть в нужном направлении пошел! Вот только языком С пока,к сожалению, не владею, потому писать буду в ассамблере и приведенный выше примерчик в общих чертах лишь понятен :(

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 09:32:50
akl
Ghostgkd777 писал(а):...Еще требуется пара счетчиков на выдержку для устранения дребезга кнопок и выдержка на мигание 7-сегментным светодиодным табло. Потому имеющиеся 2+4 аппаратных счетчика для поставленной задачи считаю недостаточно.
По мне, если ОДНИМ таймером отмерять 10 мс интервал, то его будет совершенно достаточно. В каждом прерывании обслуживается динамическая индикация; в каждом 10-м прерывании дополнительно обслуживается выдержка времени 0,1 сек и клавиатура.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 10:16:09
pyzhman
akl писал(а):...10 мс интервал...В каждом прерывании обслуживается динамическая индикация
Смотря сколько разрядов индикации. Нужно чтобы все укладывались в 20 мсек, чтобы не моргало.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 11:20:03
akl
Совершенно верно. Полный период обслуживания всех индикаторов должен быть менее 10 мс. При 20 мс визуально идет волна из-за биений между 50Гц сети и частотой смены индикации. Но, речь идёт сейчас не об этом. :)

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 13:37:07
Ghostgkd777
Насчет мерцания табло и опроса клавиатуры тоже интересует любая инфа. Дисплей 3-х разрядный с точками. Клавиатура 7 кнопок, отдельно 12 кнопок и 6 конечников.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 14:13:51
akl
Можно выбрать частоту полной смены индикации 125 Гц, т.е. период 8000 мкс. Тогда при 3-х индикаторах будет 2666,(6) мкс. Преобразуете в такты контроллера, заносите полученное число в регистр сравнения таймера, работающего в режиме CTC. Через 125 прерываний таймера получаете период 0,1 сек.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 21:14:54
Аlex
Можно не раздумывая брать за системную частоту - 1Кгц (1 Мс такт). И на индикацию нормально будет и программные таймеры хорошо расчитывать в миллисекундах.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 22:11:11
Ghostgkd777
Аlex писал(а):Можно не раздумывая брать за системную частоту - 1Кгц (1 Мс такт). И на индикацию нормально будет и программные таймеры хорошо расчитывать в миллисекундах.
Не маловата-ли величина 1мс? По поводу программных таймеров - нужно будет организовывать 16-битные т.к. требуемые выдержки времени составляют до 40 секунд т.е. 40000мс. 8-битные счетчики установить проще :) Требуемый шаг изменения выдержки составляет 0,1сек. Вот такую выдержку и думаю поставить на таймер для программных счетчиков ну и возможно использовать его для подавления дребезга. Ну и как выше советовали, 10мс таймер на вывод информации на табло.
Ребят, может кто может подсказать алгоритм организации вложенных прерываний? Т.е. выполняется обработка прерывания с клавиатуры, в это время приходит прерывание с таймера, требуется незамедлительно вывести данные в порт или провести обновление информации дисплея. Но сразу оговорюсь: СИ пока совсем не владею :( Только ассамблер. И достаточно будет просто алгоритм работы без участков программ...
P.S. блин, сейчас дошло :facepalm: -не получится одним лишь 8битным счетчиком обойтись т.к. при шаге регулировки 0,1сек потребуется максимальное значение счетчика в 400. Будем думать насчет 16битного счетчика.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Пн сен 09, 2013 22:20:36
Аlex
8-битные счетчики установить проще
На Си пофиг, что 8 бит, что 16 :) Про атомарность только не забывать, и всё будет пучком.
Делайте по 1 мс, нормально получается. И индикация хорошая, не мерцающая, и таймеры хорошо считаются. Пригодятся эти тики...

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Вт сен 10, 2013 12:27:06
zero648
Все вышеперечисленное можно повесить на один 8 битный таймер без всяких вложенных прерываний, он еще будет успевать перекуры делать, тем более на 16 мегагерцах.

Re: Как организовать параллельную работу таймеров на 6 канал

Добавлено: Вт сен 10, 2013 13:09:31
pyzhman
Ghostgkd777 писал(а):подсказать алгоритм организации вложенных прерываний
Бросьте эту затею. Здесь это совершенно не к месту.
Ghostgkd777 писал(а):не получится одним лишь 8битным
А кто-то мешает использовать хоть 1234567-битный? Памяти ОЗУ - вагон.