Данная конструкция может, использована в самых различных целях по вашему усмотрению. В энергонезависимую память таймера можно записать 32 значения моментов времени, в которые включится (выключится) исполнительное устройство. Дискретность установки -1 мин. Поскольку исполнительных устройств может быть много, то для определенности будем называть их просто будильником.
Будильники имеют следующие режимы звонков:
• “непрерывный режим” — непрерывное звучание будильника (т. е. работа устройства) от одного запрограммированного времени до следующего, затем пауза до следующего установленного времени и т. д.;
• режим “1 минута” — звучание будильника 1 мин;
• режим “5 секунд” — звучание будильника 5 с;
• режим “1 секунда” — звучание будильника 1 с.
Имеется возможность устанавливать ограничения работы будильников по дням:
• работа будильников все дни;
• работа все дни, кроме 6 и 7-го дня;
• работа все дни, кроме 7-го дня;
• отключение всех будильников. Кроме этого, в таймере имеются следующие режимы работы:
• обнуление всех установок будильников;
• коррекция хода часов за неделю в пределах ± 4 с;
• ручная коррекция хода часов по сигналам точного времени;
• ежедневная автоматическая коррекция хода часов по сигналам точного времени в диапазоне ± 10 с от полуночи;
• установка и индикация дней недели;
• работа индикации в попеременном режиме: индикация текущего времени — 10 с, затем индикация значения запрограммированного времени будильника, следующего за сработавшим — 2 с.
Рис.1.
Естественно, цифровые значения можно легко изменить в программе под конкретные требования.
Для использования всех перечисленных возможностей пришлось полностью изменить программу микроконтроллера, хотя принципиальная схема от такой переработки пострадала мало.
Рассмотрим укрупненный алгоритм работы программы, который представлен на рис. 1.
После пуска и выполнения всех предварительных установок включается предделитель с коэффициентом деления, равным 16.
По переполнению таймера TMRO, имеющего коэффициент деления 256, происходит прерывание и инкрементируется регистр делителя на 250.
Если регистр делителя переполняется, последовательно инкрементируются значения регистров секунд, минут, часов и дней.
Таким образом, с учетом машинного цикла общий коэффициент деления составляет 4x16x256x250 = 4096000, и регистр секунд инкрементируется с частотой 1 Гц.
После инициализации программа переходит к индикации нулевого разряда. Нулевым разрядом считается младший, т. е. единицы секунд. Индикация всех разрядов происходит одинаково, и достаточно подробно рассмотреть индикацию нулевого разряда. Сначала значение нулевого регистра индикации переписывается во временный регистр индикации.
Временный регистр в подпрограмме индикации дополняется в случае необходимости установкой запятой и включением будильника. После выполнения подпрограммы индикации процессор переходит к выполнению функций таймера, которые установлены после этого разряда. Закончив работу по сравнению и установкам, программа ожидает прерывания.
После отработки прерывания вся процедура повторяется со следующим разрядом. После последнего, пятого, разряда программа возвращается к индикации нулевого разряда. Таким образом, индикация каждого разряда длится 4 мс. За это время можно выполнить 4096 команд.
Чтобы не загружать таймер выполнением всех функций после, одного разряда, они распределены следующим образом:
• при индикации нулевого разряда происходит сравнение установленных значений будильников с текущим временем;
• при индикации первого разряда проверяется запрет будильников по дням;
• при индикации второго разряда проверяется значение часов для коррекции по сигналам точного времени в полночь;
• при индикации третьего разряда проверяется состояние кнопок, и выполняются установки по нажатым кнопкам;
• в четвертом разряде происходит смена индикации при изменении режима работы.
Каждую из перечисленных функций можно проиллюстрировать своим алгоритмом работы, но ничего интересного они представлять не будут. Единственное, на что можно обратить внимание, это запись в память 64-х регистров информации из регистров, которые по числу превышают Flash-память в два раза. Поскольку во всех регистрах записи занято только четыре разряда из восьми, то при записи в память старшие четыре разряда занимают десятки (минут, часов), а в младшие четыре разряда записывается значение единиц.
Сравнение записанных значений времени с текущими производится в том же формате, что значительно экономит ресурсы при проверке всей Flash-памяти. Чтобы не возникало путаницы при считывании и записи, значения минут записываются в память с номером от 0 до 31, а адрес часов увеличен на 32. Сначала проверяется совпадение минут, затем, если произошло совпадение, проверяется адрес, увеличенный на 32, на совпадение часов.
Рис.2.
Принципиальная схема таймера показана на рис. 2. Как видно, она мало отличается от схемы в [1] и, если вы уже сделали часы, то минимальные доработки позволят вам сделать таймер.
В том и преимущество микроконтроллеров, что изменив программу, можно придать устройству совершенно новые потребительские свойства.
Эта схема оставлена из-за своей универсальности, т. е. возможности установки различных семисегментных индикаторов.
Для этого необходимо только заменить микросхемы дешифраторов, как это хорошо описано в различной литературе [2].
Выходы RAO—RA2 микроконтроллера управляют дешифратором DD3 индицируемого номера разряда, а выходы RBI—RB4 — преобразователем DD1 двоичного кода в семисегментный. Выход RB5 запрограммирован для управления запятой. Выход RB6 управляет исполнительным устройством.
Выходы RB7, RA3, RA4 используются как входы включения записи, разряда и установки соответственно. Вывод установки ALA используется для включения будильника. Выход RBO, который в часах использовался для гашения, имеет постоянный уровень лог.0 для разрешения работы микросхемы мультиплексора DD3. Гашение в программе не используется, но выход оставлен для преемственности. В