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

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

Сообщение 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 аппаратных счетчика для поставленной задачи считаю недостаточно.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение 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)
    {
// время истекло

    }
Что-то вроде такого.
Docendo discimus
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

Сообщение Ghostgkd777 »

Ну слава Кошачьим Богам,я хоть в нужном направлении пошел! Вот только языком С пока,к сожалению, не владею, потому писать буду в ассамблере и приведенный выше примерчик в общих чертах лишь понятен :(
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Ghostgkd777 писал(а):...Еще требуется пара счетчиков на выдержку для устранения дребезга кнопок и выдержка на мигание 7-сегментным светодиодным табло. Потому имеющиеся 2+4 аппаратных счетчика для поставленной задачи считаю недостаточно.
По мне, если ОДНИМ таймером отмерять 10 мс интервал, то его будет совершенно достаточно. В каждом прерывании обслуживается динамическая индикация; в каждом 10-м прерывании дополнительно обслуживается выдержка времени 0,1 сек и клавиатура.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

akl писал(а):...10 мс интервал...В каждом прерывании обслуживается динамическая индикация
Смотря сколько разрядов индикации. Нужно чтобы все укладывались в 20 мсек, чтобы не моргало.
Docendo discimus
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Совершенно верно. Полный период обслуживания всех индикаторов должен быть менее 10 мс. При 20 мс визуально идет волна из-за биений между 50Гц сети и частотой смены индикации. Но, речь идёт сейчас не об этом. :)
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

Сообщение Ghostgkd777 »

Насчет мерцания табло и опроса клавиатуры тоже интересует любая инфа. Дисплей 3-х разрядный с точками. Клавиатура 7 кнопок, отдельно 12 кнопок и 6 конечников.
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно выбрать частоту полной смены индикации 125 Гц, т.е. период 8000 мкс. Тогда при 3-х индикаторах будет 2666,(6) мкс. Преобразуете в такты контроллера, заносите полученное число в регистр сравнения таймера, работающего в режиме CTC. Через 125 прерываний таймера получаете период 0,1 сек.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Можно не раздумывая брать за системную частоту - 1Кгц (1 Мс такт). И на индикацию нормально будет и программные таймеры хорошо расчитывать в миллисекундах.
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

Сообщение Ghostgkd777 »

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

Сообщение Аlex »

8-битные счетчики установить проще
На Си пофиг, что 8 бит, что 16 :) Про атомарность только не забывать, и всё будет пучком.
Делайте по 1 мс, нормально получается. И индикация хорошая, не мерцающая, и таймеры хорошо считаются. Пригодятся эти тики...
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Все вышеперечисленное можно повесить на один 8 битный таймер без всяких вложенных прерываний, он еще будет успевать перекуры делать, тем более на 16 мегагерцах.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Ghostgkd777 писал(а):подсказать алгоритм организации вложенных прерываний
Бросьте эту затею. Здесь это совершенно не к месту.
Ghostgkd777 писал(а):не получится одним лишь 8битным
А кто-то мешает использовать хоть 1234567-битный? Памяти ОЗУ - вагон.
Docendo discimus
Контактная информация:
Ответить

Вернуться в «AVR»