- Родительская категория: Проекты
- Категория: Электроника
- Автор: ARV
- Просмотров: 21663
Многоканальный таймер
Предлагаю вниманию проект под рабочим названием "Многоканальный универсальный таймер". Этот проект является реинкарнацией моего неудачного проекта "Супер-пупер-мега-таймер", или СПМТ, о котором остались лишь не очень приятные воспоминания.
Теперь я решил рискнуть и вернуться к этой теме с учетом прошлых ошибок, поэтому хотел дать проекту название СПМТ2 или "супер-пупер-мега-таймер возвращается".
Почему такое странное название? Да потому, что этот таймер обладает очень-очень гибкими возможностями по заданию интервалов управления до восьемью независимыми каналами. По-моему, просто не существует аналогов с такими же возможностями!
И при всем при этом мой таймер достаточно прост и недорог, т.к. не содержит ничего дефицитного или дорогостоящего.
Пока что проект на 100% не закончен и представляет собой скорее только рабочую программу (прошивку МК), а схема существует только в виде проекта PROTEUS.
На схеме показаны только самые важные элементы - номера пинов для подключения органов управления и индикации, а все остальное оставлено (пока) на усмотрение тех, кто захочет повторить в реале эту конструкцию. PORTA - это 8 выходных каналов, младший разряд соответствует каналу №1, старший - каналу №8. Резистор R1 подтягивает 0-. линию PORTB к общем проводу. Этот пин используется в качестве датчика пропадания сетевого питания - при разработке полной схемы питание МК должно осуществляться от литиевой батарейки 3В и от сетевого источника (например, через диодную развязку), а питание всей остальной части схемы - только от сетевого источника. На резистор R1 должно подаваться питание только от сетевого источника, поэтому при пропадании сетевого напряжения на этом резисторе устанавливается лог.0, что и служит микроконтроллеру сигналом для перехода в экономичный режим. Я планирую разработать полную схему позже, а пока что буду рад проконсультировать любого желающего проявить самостоятельность в этом вопросе.
Теперь несколько слов о технических параметрах таймера.
Количество независимых каналов управления | до 8 |
Минимальный отрабатываемый интервал времени | 0,25 секунды |
Максимальный отрабатываемый интервал времени | 99 лет 11 месяцев 30 дней 23 часа 59 минут 59 секунд |
Количество включений и отключений канала в течение суток | неограничено* |
* теоретически, на практике ограничивается объемом доступной для программы памяти EEPROM - см. далее.
Программирование таймера осуществляется путем ввода строки, задающей условие включения канала. При записи программы используются следующие правила:
1. Условие состоит из одного или более выражений.
2. Выражение задает влияющую на условие переменную и диапазон ее значений. Условие считается соблюденным, если значение выбранной переменной находится в заданных пределах.
3. Переменная – это буква, означающая (в скобках – диапазон допустимых значений):
W – текущий день недели (1 – понедельник, 7 – воскресенье);
D – текущий день (в зависимости от текущего месяца от 1 до 31);
M – текущий месяц (1 – январь, 12 – декабрь);
Y – текущий год (последние 2 цифры года);
h – текущий час (от 0 до 23);
m – текущая минута (от 0 до 59);
s – текущая секунда (от 0 до 59);
q – текущая четверть секунды (от 0 до 3).
4. Диапазон значений переменной задается либо одним конкретным числовым значением, либо указанием начального и конечного значения, разделенными знаком интервала. Например, выражение W=5 означает «если пятница», а W=1-5 означает «с понедельника по пятницу включительно» (т.е. «по будням»).
5. Отдельные выражения могут объединяться в сложное выражение при помощи запятой, эквивалентной союзу И, либо символа "/", эквивалентного союзу ИЛИ. Сложное выражение соответствует условию, которое получается буквальным его чтением, например, W=1-5,h=7,m=0 является буквальной записью следующего условия: «если день недели находится в промежутке с понедельника по пятницу, и 7 часов, и 0 минут» - иначе говоря «по будням в 7:00».
6. Союзы И и ИЛИ в выражении не равнозначны: ИЛИ сильнее, чем И, связывает выражения слева и справа от себя, т.е. W=1-5,h=7/m=0 будет означать «с понедельника по пятницу, когда или 7 часов, или 0 минут». «Или 7 часов или 0 минут» - это значит «одна минута в начале каждого часа», т.е. упоминание про 7 часов - лишнее.
7. Для изменения порядка анализа условий используются скобки. Их действие полностью аналогично математическому смыслу: любое сложное выражение в скобках будет воспринято как одно целое. Например, (m=0,W=1-5)/(h=10,W=6-7) будет означать, что канал активируется или на одну минуту каждый час по будням, или по выходным в 10 утра на 1 час.
Следует использовать знак ИЛИ при записи условий, определяющих интервалы времени, начинающиеся и/или заканчивающиеся не целым часом (минутой, секундой и т.п.). Например, условие для включения канала с 8:30 до 13:25 придется записать так: (h=8,m=30-59)/h=9-12/(h=13,m=0-25). То есть весь требуемый интервал времени работы канала разбивается на три: от 30 до 59 минут при значении часа 8, для значения часа от 9 до 12 и для первых 25 минут при значении часа 13. Аналогично можно оформить и интервал нецелого количества месяцев: (M=1,D=15-31)/M=2-3/(M=4,D=1-15) – с 15 января по 15 апреля.
Используя этот нехитрый набор символов, можно задавать очень гибкие условия для включения каналов, реализуя заковыристые алгоритмы. Например, канал используется для включения лампы, чтобы подавать сигнал SOS азбукой Морзе ровно в полночь. Вот как запишется условие для этого: h=0,m=0,((s=0,(q=0/q=2))/(s=1,q=0))/(s=2-4,q=0-2)/((s=5,(q=0/q=2))/(s=6,q=0)). Короткая вспышка и промежутки между ними длятся ¼ секунды, а длинные ¾ секунды.
Единственное ограничение на запись условия со скобками – это количество подряд идущих незакрытых скобок не более 5 (в вышеприведенном примере было 3 незакрытых скобки подряд).
После включения СПМТ2 на дисплее будет показано текущие время и дата:
В этом режиме кнопка ОК включает режим коррекции даты/времени: после ее нажатия на дисплее появляется курсор, который можно сдвигать кнопками со стрелками влево-вправо (LT и RT на схеме), а кнопками вверх-вниз (UP и DN на схеме) можно изменять значение того, на что указывает курсор. Таким образом, можно установить правильные показания календаря и часов, после чего следует нажать ОК - показания часов будут установлены. Если ничего не делать примерно 20 секунд - режим коррекции выключится, сохранится прежние установки времени и календаря. Так же в любой момент можно отказаться от сделанных изменений, нажав кнопку CANCEL.
В основном режиме СПМТ2 для просмотра программ каналов нужно нажать CANCEL. Изображение на дисплее в этом случае станет таким:
В первой строке показан номер текущего канала (К1), затем длина в байтах программы этого канала (L:), а затем остаток свободной памяти в байтах (F:). Во второй строке показана собственно заданная программа этого канала, просмотреть которую целиком (если она длинная) можно при помощи кнопок влево-вправо.
Нажатием кнопок вверх-вниз можно перейти к предыдущему или следующему номеру канала:
На рисунке показана ситуация, когда для 2-го канала программа не задана (он будет постоянно выключен).
Во время просмотра программ нажатие кнопки ОК включает режим ввода/изменения программы, изображение на дисплее при этом меняется:
В первой строке так же сначала указан номер канала, но затем через дробную черту показаны номер текущей позиции курсора и общее количество символов строки в текущей программе. Далее, в первой строке при помощи специальных символов показаны допустимые действия в текущий момент.
Если показан Х - программа содержит ошибки, т.е. нажать кнопку ОК для завершения редактирования не получится. Если присутствуют символы "<" и ">", это означает, что можно нажимать кнопки влево-вправо (в перспективе эти символы планируется заменить на стрелочки). Буквой "I" условно показана возможность нажимать кнопки вверх-вниз (в перспективе вместо буквы будет символ со стрелками вверх-вниз).
Во второй строке имеется курсор, указывающий на текущий редактируемый символ, нажимая кнопки ввер-вниз, его можно менять. Кнопка вправо сдвигает курсор вправо, а кнопка влево удаляет все символы правее курсора - это следует иметь ввиду!
В СПМТ2 предпринят ряд мер по контролю правильности ввода условий, в частности, невозможно задать выражение с незакрытыми скобками, но из-за ограниченности ресурсов МК такой контроль действует не во всех случаях. В частности, можно ввести недопустимый интервал дат (задать для февраля 30-е число) или указать 99 секунд, либо начало интервала задать больше, чем конец. Не смотря на бессмысленность подобных выражений, обрабатываются они корректно: ошибочное m=30-99 будет равносильно верному m=30-59, т.к. правильный интервал является частью неправильного; m=99 не наступит никогда и поэтому условие с этим выражением либо не сработает никогда (если остальные выражения объединены с этим союзами И), либо будет всегда проигнорировано (если объединение выражений сделано союзами ИЛИ). Некорректные значения не только могут дать ложный алгоритм работы, но и напрасно занимают память, поэтому следует их всячески избегать.
Особенности программы текущей версии СПМТ2:
1. Использование асинхронного таймера МК для счета времени.
2. Встроенный календарь учитывает високосность года автоматически, однако день недели по дате не вычисляется.
3. Тактирование ядра от встроенного RC-генератора 8МГц с «разгоном» до максимально возможной частоты этого генератора при помощи «калибровочного» регистра OSCCAL.
4. В рабочем режиме СПМТ2 питается от сетевого источника 5 вольт, но при его отключении все цепи, кроме МК, обесточиваются, а МК питается от батарейки (литиевой) 3В. В этом случае МК постоянно спит, просыпаясь только по прерыванию асинхронного таймера счета времени 4 раза в секунду. Причем при пробуждении RC-генератор запускается на минимально возможной частоте. Если отказаться от счета четвертей секунды, то можно просыпаться только 1 раз в секунду, что снизит в 4 раза потребляемый в этом режиме ток. Разумеется, без сетевого питания ведется только счет времени, никаких иных функций не выполняется. После восстановления нормального питания СПМТ2 снова включает турбо-режим и работает в соответствии с обычным алгоритмом.
5. Каждый канал может управляться программой, для записи которой используется не более 254 символов.
6. Наибольшую сложность в СПМТ2 для пользователя представляет система редактирования управляющих программ: вместо полноценной клавиатуры имеется всего 6 кнопок. Однако, ввод программы не сложнее ввода при помощи джойстика имени игрока в древних компьютерных играх (фанаты Dendy и ZX Sinclair меня поймут).
7. Для упрощения освоения СПМТ2 и принятой системой программирования имеется возможность загрузить в память несколько образцов программ управления путем перекомпиляции программы с соответствующими настройками. Возможны три демо-примера: будильник в 7 утра по будням, рассмотренный ранее сигнализвтор SOS и функция "часы с боем" (выдача в начале каждого часа номера этого часа от 1 до 12 в виде импульсов на выходе).
Наконец, несколько слов о программе.
Полный исходный текст представлен в архиве. Он рассчитан на компиляцию при помощи Atmel AVR Toolchain - WinAVR не подойдет (подойдет Atmel Studio)! Так же можно собрать проект и при помощи AVR-GCC версии не ниже 3.4. Для сборки проекта нужно перейти в папку Release и выполнить команду make all. Пересборка проекта потребуется, если нужно будет изменить распиновку МК или использовать другой тип МК вместо показанного на схеме atmega16 (проект умещается в atmega8). Файл avr_helper.h нужно поместить в системную папку include компилятора - пригодится вам и в будущем!
Кто не желает пересобирать проект самостоятельно, в папке Release имеется готовая прошивка (hex-файл) для atmega16, как показано на схеме. Там же есть и ELF-файл для экспериментов в PROTEUS.
Все особенности схемы (назначение пинов и т.п.) задаются через h-файлы. Наиболее глобвально важные настройки задаются в файле config.h. Весь исходник очень детально прокомментирован, надеюсь, все будет понятно. Если что - на форуме помогу всем. Очень надеюсь, что с вашей помошью проект будет доведен до полного совершенства!