Общее построение схемы
Теперь общая схема. Выбираем индикаторы большого размера (с цифрой 1 дюйм, или 25,4 мм высотой), с общим анодом, т. е. типа SA10, если ориентироваться на продукцию Kingbright. Лично я предпочитаю желтое свечение (например, SC10‑21Y), но это не имеет значения. Так как падение напряжения у них может достигать 4 В, то от того же питания, что требует МК (5 В), питать их нельзя, поэтому нам потребуется два питания: одно стабилизированное +5 В и второе нестабилизированное (пусть будет +12 В). Управлять разрядами индикаторов мы будем от транзисторных ключей с преобразованием уровня (когда на выходе МК уровень +5 В, ключ подает +12 В на анод индикатора), а сегментами – от простых транзисторных ключей (при уровне +5 В вывод сегмента коммутируется на «землю» – поскольку питание индикаторов повышенное, то, к сожалению, управлять прямо от выводов процессора не получится).
В обоих случаях управление получается в положительной логике – включенному индикатору и сегменту соответствует логическая единица (это совершенно не принципиально, но удобно для простоты понимания того, что именно мы делаем).
Токоограничивающие резисторы в управлении сегментами примем равными 470 Ом, тогда пиковый ток через сегмент составит примерно 20 мА, а средний для четырех индикаторов – 5 мА. Всех восьмерок на часах быть не может, максимальное число одновременно горящих разрядов равно 24 («20:08»), потому общее максимальное потребление схемы составит 24‑5 = 120 мА, плюс примерно 10 мА на схему управления, итого 130 мА. Исходя из этого, будем рассчитывать источник питания.
Теперь подумаем о том, как сделать, чтобы часы продолжали идти при сбоях в электрической сети. Нет ничего ужасней бытового прибора, который не может сохранить установки даже при секундном пропадании напряжения питания, – вероятно, вы не раз с такими мучились. Конструкторов, выпускающих видеоплееры, музыкальные центры, магнитофоны, микроволновые печи, метеостанции и электроплиты, в которых часы при малейшем сбое в подаче электроэнергии приходится устанавливать заново, следует расстреливать без суда и следствия.
При питании в пределах 4–5 В контроллер типа 2313 потребляет около 5 мА, так что можно рассчитывать на непрерывную работу от щелочной батарейки типа АА с емкостью порядка 2 А·ч в течение не менее 2–3 недель. Так как на непрерывную работу мы не рассчитываем, а лишь на поддержку при сбоях длительностью максимум в несколько минут или часов (при длительном отключении от сети батарейку придется извлекать), то это нас устраивает. Для обеспечения работы понадобятся три таких элемента, соединенных последовательно, тогда их общее напряжение составит 4,5 В.
Переключать питание с сетевого питания на батарейки можно автоматически, с помощью простой схемы из двух развязывающих диодов (чтобы уменьшить потери, диоды должны быть с переходами Шоттки, на них меньше падение напряжения).
Чтобы сделать схему совсем «юзабельной», добавим также небольшой узел для сигнализации при необходимости замены резервной батарейки – пусть это будет наше ноу‑хау, т. к. такого почти ни у кого нет[36]. Хотя есть специальные микросхемы, которые «мониторят» питание (мы о них уже говорили в главе 18 % здесь в образовательных целях мы без них обойдемся. Схему такого узла удобно реализовать, «не отходя от процессора», на встроенном компараторе, если сравнивать напряжение батарейки с каким‑то фиксированным напряжением.
Кроме того, потребуется некий монитор питания для того, чтобы контроллер «знал», что он подключен к батарейке – при этом придется отключать выводы управления индикацией, чтобы не было дополнительного потребления (вообще‑то можно и задействовать режим пониженного энергопотребления, но в нашей конструкции он не имеет особого смысла). В этом случае у нас набирается уже целых 18 функций (12 для осуществления индикации, 2 кнопки установки, 2 входа компаратора, 1 для сигнализации состояния батарейки и еще 1 для входа монитора питания), а использовать контроллер большего размера только для этой цели не хочется. И уж совсем не хочется добавлять какие‑то внешние схемы лишь для того, чтобы контролировать батарейку, которая, может быть, сядет этак лет через пять…
Поэтому мы объединим функции выводов: используем один из входов компаратора также и под вторую кнопку, как обычный вывод порта. А на другой вход компаратора, который подсоединен к опорному источнику, «повесим» дополнительно функцию монитора – сигнализировать о пропадании внешнего питания, все равно опорный источник подключен к напряжению питания. Остается придумать, как обеспечить сигнализацию разряда батареи. Тут мы сделаем просто: пусть разделительный символ (двоеточие) мигает, когда все нормально, а когда батарея разряжена – горит все время. Таким образом мы получим наиболее экономичную схему с минимумом внешних элементов.
Теперь поглядим на схему разводки выводов ATtiny2313 (см. рис. 19.2) и выберем, что и к чему мы будем подсоединять. Во‑первых, удобно использовать вход внешнего прерывания, например, INT1 (вывод 7 ) под кнопку, которая будет вводить часы в режим установки. От порта D (портов А и С в этом микроконтроллере нет) осталось шесть разрядов, четыре из которых мы задействуем под управление разрядами индикаторов (в скобках указаны номера выводов): PD0 (2), PD1 (3), PD2 (6) и PD4 (8). Из восьми выводов порта В два задействованы под входы компаратора AIN+ (вывод 12 – к нему мы подсоединим опорный источник для контроля батареи и с него же будем снимать информацию о состоянии питающего напряжения и второй кнопки) и A1N‑ (вывод 13 – к нему подключим батарейку). Для управления миганием разделительного двоеточия удобно использовать вывод ОС1 (15), который управляется автоматически от таймера (см. главу 19 ). Под управление сегментами мы задействуем оставшиеся выводы: PD5 (9), PD6 (11), РВ2 (14) и РВ4‑РВ7 (16–19). То, что выводы для управления индикаторами расположены не по порядку – это, конечно, не здорово, нам фактически придется управлять каждым разрядом по отдельности, но обойдемся.
Схема
Вот, собственно, и все предварительные наметки – можно рисовать схему платы управления. Она показана на рис. 20.1. Некоторую громоздкость схеме придают ключи управления индикаторами, однако все равно ее можно без проблем уместить на плату примерно 70x100 мм, а с некоторыми усилиями – и на меньшую.
Рис. 20.1. Схема часов на МК ATtmy2313 (плата управления)
Как мы говорили ранее, в ней можно без внесения изменений заменить ATtiny2313 на старый AT90S2313.
Игольчатый разъем X1 типа IDC с 10‑ю контактами – программирующий, рассчитанный на описанный в главе 19 программатор от Argussoft . Его можно заменить на стандартный 6‑контактный, как и указывалось в главе 19 . Все остальные внешние соединения, кроме питания от сети, осуществляются через такой же разъем, но с 16‑ю контактами, два из которых: контакты «земля» и питание.
Обратите внимание, что программирующие выводы (кроме Reset ) здесь работают в двух режимах. В нормальном режиме эти выводы работают, как выходы на нагрузку 5,1 кОм. Не помешает ли это процессу программирования? Нет, не помешает – такая нагрузка для программатора вполне приемлема. Более того, «чистые» (более нигде не задействованные) выводы программирования все равно следует нагружать «подтягивающими» резисторами, иначе не исключены сбои (об этом мы говорили в главе 18 ). Здесь же роль гасящей помехи нагрузки играют базовые резисторы ключей управления транзисторами, и дополнительных мер принимать не приходится.
Плату индикации мы делаем отдельно (рис. 20.2).
Рис. 20.2. Схема часов на МК AT90S2313 ( плата индикации)
На ней мы ставим четыре индикатора и две управляющих кнопки (о них далее), а также в точности такой же разъем IDC‑16, как и на плате контроллера, причем он должен стоять на стороне платы, противоположной индикаторам. Разводка у него также должна быть идентичной. Эти разъемы мы соединим плоским кабелем. Изготовить такой плоский кабель с разъемами IDC‑16F самостоятельно без наличия специального инструмента практически невозможно, потому либо придется такой инструмент приобрести, либо попросить установить разъемы на ваш кабель в любой фирме, которая занимается сборкой и ремонтом компьютеров. Можно употребить и готовый кабель даже с большим количеством линий, если на плате использовать разъемы PLD (т. е., если не установлен кожух). Это решение не очень красивое, т. к. при этом кабельная часть разъема будет выходить за пределы разъема на плате, и это нужно предусмотреть в раскладке платы, иначе разъем кабеля может во что‑нибудь упереться.
Рассмотрим подробнее работу схемы платы управления. При включении питания цепочка R1C1 обеспечивает надежный Reset . Напомню (см. главу 18 ), что ставить эту цепочку необязательно – производитель МК гарантирует нормальный Reset и без каких‑либо внешних элементов, однако для лучшей защиты от помех это не помешает, ведь часы у нас должны работать по идее годами в круглосуточном режиме.
После установления питания диод VD2 «запрет» батарею, которая имеет напряжение заведомо ниже, чем на выходе стабилизатора. Оба диода – с переходом Шоттки, падение напряжения на них не превышает 0,2–0,4 В.
Теперь разберемся с нашими компараторными примочками. В нормальном режиме кнопка Кн2 (S3 на плате индикации – см. рис. 20.2) разомкнута и на работу схемы не влияет. Напряжение батареи фактически напрямую (делитель R4/R5 делит сигнал в отношении 300/301) попадает на инвертирующий вход компаратора. Это напряжение сравнивается с напряжением на стабилитроне VD3, равном примерно 3,9 В. Стабилитрон обязательно должен быть маломощный, типа КС139Г, в стеклянном корпусе, или соответствующий импортный, в противном случае сопротивление резистора R35 надо снизить примерно в два‑три раза. Когда напряжение батареи упадет ниже этого уровня (выбранного с некоторым запасом – при 3 В МК еще может нормально работать, но часть напряжения батареи упадет на диоде VD2, кроме того, следует учитывать, что смена батарейки может произойти не сразу), то компаратор перебросится в состояние логической единицы по выходу.
Программа (см. далее) зарегистрирует падение напряжения батарейки, и разделительное двоеточие (пара светодиодов VD1 и VD2 на схеме по рис. 20.2, подключенных к выводу мигания от Timer 1) перестанет мигать и будет гореть постоянно. Восстановление произойдет сразу, как только батарею сменят на свежую. Та же реакция будет, если просто отключить батарею тумблером «Бат» (S1 на рис. 20.1) или удалить ее. Для того, чтобы в этих случаях вход компаратора не оказывался «висящим в воздухе», и предназначен резистор R5. Ток через него настолько мал (около 1,5 мкА), что на разряд батареи это не оказывает влияния. С8 защищает вход от наведенных на этом резисторе помех.
Разумеется, отличить нажатие кнопки Кн2 от внезапного выключения батарейки МК не в состоянии, но «правильная» реакция на нажатие Кн2, как мы увидим далее, происходит только в режиме установки часов – когда предварительно была нажата кнопка Кн1 (S2 на рис. 20.2). Нажатие Кн2 и в самом деле будет восприниматься, как отключение батарейки – ив режиме установки, и в рабочем режиме, но только на время ее нажатия, а после отпускания состояние МК сразу восстановится. Поэтому функции друг другу не мешают, за исключением невероятного совпадения, если батарейка «захочет» разрядиться как раз в момент установки времени (и при разряженной или отключенной батарейке, увы, установку времени производить нельзя).
При пропадании внешнего питания запирается диод VD1, а диод VD2 открывается, и напряжение батареи попадает на питание МК. Резистор R6 вкупе с развязывающим конденсатором С2 служат для большей устойчивости работы МК в момент перепада напряжений при переключении питания, для той же цели служит конденсатор С7, установленный параллельно кнопке Кн1 (иначе при перепадах напряжения может спонтанно возникать прерывание, и часы войдут в режим установки, о котором далее). Одновременно с переключением питания становится равным нулю напряжение на стабилитроне, а так как при этом стабилитрон представляет собой обрыв в цепи, то установлен резистор R36, который служит тем же целям, что и резистор R5. Компаратор работать перестает (точнее, он всегда будет показывать «нормальную» батарею), но нас это не волнует, т. к. индикации все равно нет.
Тумблер «Бат» (S1 на рис. 20.1) нужен для отключения батареи в случае, если вы хотите остановить часы надолго, а вот тумблер для включения сетевого питания тут совершенно не требуется (разве что на время отладки).
Программа
Полный текст программы часов можно скачать с сайта автора по ссылке: http://revich.lib.ru/AVR/clock.zip. Все подробности приведены в качестве комментариев к тексту программы, здесь мы рассмотрим только общее ее построение и принцип работы.
При включении питания процессора программа начинает работу с команды по метке RESET. Здесь она устанавливает соответствующие порты на выход (все, кроме двух входов компаратора и входа кнопки Кн1), затем делает нужные установки для таймеров и разрешает соответствующие прерывания.
Восьмиразрядный Timer 0 у нас будет по событию переполнения управлять разрядами в режиме динамической индикации. При заданной частоте на входе Timer 0, равной 1/8 от тактовой частоты (4 МГц), частота управления разрядами получится равной 1/256 от 4 МГц/8 = 500 кГц, т. е. чуть меньше 2 кГц, а каждый из четырех разрядов будет включаться с частотой почти 500 Гц, что однозначно превышает порог заметности мигания.
* * *
Заметки на полях
Заметим, что при проектировании питания подобных устройств следует учитывать еще одно обстоятельство: в динамическом режиме нельзя использовать для питания индикаторов пульсирующее напряжение (как в схеме со статической индикацией вроде термометра из главы 17 ) – обязательно возникнут биения между частотой питающего напряжения и частотой переключения разрядов, и яркость свечения будет пульсировать. Потому напряжение +12 В необязательно должно быть стабилизированным, но для него обязательно наличие сглаживающего фильтра. На самом деле в данной конструкции это условие соблюдается автоматически, т. к. те же +12 В подаются и на вход стабилизатора + 5 В, но могут встретиться конструкции, в которых питание индикаторов осуществляется от отдельной обмотки трансформатора, и нам об этом забывать не следует.
* * *
16‑разрядный Timer 1 у нас будет управлять собственно отсчетом времени по прерыванию сравнения, как это делалось в главе 19 . Для этого в регистры сравнения загружается число 62 500, а предварительный коэффициент деления задается равным 1/64, тогда прерывание таймера будет возникать с частотой 4 МГц/64/62 500 = 1 Гц. На практике число для сравнения подгоняется под конкретный кварц, и обычно почему‑то меньше теоретической величины 62 500 (так, в моем случае оно было равно 62 486).
* * *
Подробности
Как быстро подобрать коэффициент деления? Можно воспользоваться высокоточным частотомером для измерения длительности секундного импульса на выводе ОС1А. При отсутствии такого прибора (мультиметры, позволяющие измерять частоту, не подойдут решительно, а большинство радиолюбительских частотомеров могут использоваться лишь для ориентировочной прикидки) нужно воспользоваться следующим приемом: установить часы с каким‑то определенным коэффициентом (например, с теоретическим значением 62 500) по точным часам, например, по компьютерному времени, которое несложно выставить через Интернет очень точно. Так как небольшая ошибка все равно может сохраниться (см. далее процедуру установки), то после установки отметьте точную разницу в секундах между моментом смены показаний минут нашей конструкции и точных часов и запишите ее. Потом выдержите часы достаточно длительный промежуток времени (чем длиннее, тем точнее). Снова точно установите время в компьютере и опять запишите разницу в момент смены минут.
Таким образом вы получите величину ухода часов – пусть, например, она составляет 200 секунд в месяц в сторону отставания. Это значит, что у нас секундный интервал длиннее необходимого на 200/2 592 000 = 7,7·10‑5 часть, т. е. на 77 микросекунд (число 2 592 000 есть число секунд за 30 дней, проверьте). Эту же величину мы можем получить и с помощью частотомера. На 77 микросекунд и следует уменьшить период «тиков» таймера, для чего нужно уменьшить наш коэффициент деления на величину 62 500·7,7·10‑5 ~= 5, т. е в регистры таймера необходимо записать число 62 495. То же число можно получить, исходя из того, что при коэффициенте деления 1:64 и кварце 4 МГц каждый такт таймера длится 16 микросекунд. Отметьте, что несмотря на кажущуюся достаточно высокую величину коэффициента деления 62 500, изменение его всего на единицу изменит ход часов на целых 40 секунд в месяц, т. е. более, чем на секунду в сутки – это является следствием использования 16‑разрядных счетчиков‑таймеров и крупнейшим недостатком использования МК для отсчета времени. Для более тонкой подстройки придется изощряться, придумывая всякие хитрости.
* * *
Кроме этого, в процедуре инициализации разрешается прерывание от кнопки Кн1 (INT1). Для кнопки Кн2 отдельного прерывания не требуется, ее состояние отслеживается непосредственно в процессе установки (см. далее). По окончании установок разрешаются прерывания (команда sei ), и далее программа переходит к выполнению бесконечного цикла, во время которого производится мониторинг состояния определенных узлов.
Основная логика работы часов следующая. Каждую секунду, когда происходит прерывание Timer 1, счетчик секунд sek увеличивается на 1 (см. процедуру обработки прерывания TIM1 по метке mtime ). Если его значение не равно 60, то больше ничего не происходит, если равно, то регистр sek обнуляется, и далее по цепочке обновляются значения текущего времени, хранящиеся в регистрах emin, dmin, ehh и dhh (см. их определения в начале программы).
Прерывание по переполнению Timer 0 для управления разрядами происходит независимо от прерывания Timer 1 и использует установленные в последнем значения часов. По Timer 0 обнуляются все выходы всех портов, управляющие индикацией, затем проверяется значение счетчика POS, отсчитывающего последовательные номера разрядов (от 0 до 3). Чтобы не тратить время на всякие проверки и обнуления, для организации счетчика до 4 здесь используется тот факт, что число 4 совпадает с числом комбинаций первых двух битов. Тогда для последовательного непрерывного счета (0‑1‑2‑3‑0‑1…) достаточно каждый раз увеличивать счетчик на единицу (см. команду inc POS в конце процедуры), а в начале ее лишь обнулять старшие шесть битов (команда andi POS,3 ). Далее в зависимости от значения счетчика (cpi POS…. ) устанавливаем питание нужного индикатора (sbi PortD…. ) и вызываем процедуру установки маски сегментов SEG_SET, где в зависимости от значения данного разряда в часах устанавливается и маска.
В процедуре SEG_SET и, собственно, в процедурах установки маски (OUT_х ) я предлагаю вам разобраться самостоятельно, Есть и другие способы – например, непосредственного задания маски рисунков цифр через загрузку констант командой lpm для чтения констант из памяти, тогда не потребуется длинной процедуры установки битов по отдельности (см. далее). Но такую маску удобно использовать, если у вас выводы управления разрядами идут подряд (к примеру, когда биты 0–7 порта D соответствуют битам маски 0–7). Тогда маску достаточно приложить к регистру порта, и программа резко сокращается. А здесь это сделать трудно – перестраивание маски под выводы различных портов займет не меньше места, чем простая и понятная прямая установка выводов.
Процедура установки часов накладывается на всю эту картину и работает следующим образом. При коротком нажатии на Кн1 возникает прерывание INT1 (процедура по метке INTT1), в котором первым делом проверяется, есть ли сетевое питание (бит 1 регистра Flag , см. далее), иначе и сама установка не требуется. Далее запрещается само прерывание INT1 во избежание дребезга. Разрешается оно в прерывании Timer 1 (см. в исходном тексте начало процедуры TIM1), которое, как мы уже знаем, происходит каждую секунду. Таким образом время нечувствительности, в течение которого можно отпустить кнопку без последствий (без перескока на произвольный разряд), составляет случайную величину от 0 до 1 с. На самом деле это не совсем верное решение, и сделано так только для простоты, – по‑хорошему следовало бы пропустить одну секунду, и только потом разрешать, иначе вероятность дребезга все‑таки остается большой.
Далее в прерывании INT1 устанавливается отдельный счетчик разрядов set_up , который будет считать от 1 до 4 (если он больше, то выходим из режима установки), и признак режима установки (бит 0 регистра Flag ). Если этот признак установлен, то разряд, соответствующий установленному номеру в счетчике set_up , станет мигать. Это достигается с помощью вспомогательного счетчика count (см. процедуру TIM1 по метке CONT1). В этом же месте программы отслеживается состояние Кн2 – если она нажата и удерживается, то каждую секунду происходит увеличение значения выбранного разряда на 1 в тех пределах, в которых это допускается (для единиц минут – от 0 до 9, для десятков минут – от 0 до 5, для десятков часов – от 0 до 2, причем предел единиц часов зависит от значения десятков), далее значение опять обращается в 0. Отпустив кнопку Кн2, вы фиксируете установленное значение, а нажав кратковременно на Кн1, переходите к следующему разряду. После прохождения всех разрядов, при последнем (пятом) нажатии Кн1 режим установки отменяется, т. е. бит 0 регистра Flag сбрасывается (см. процедуру по прерыванию INT1).
Немаловажная особенность этой конструкции – то, что во время установки счет времени прекращается, а при выходе из режима установки счетчик секунд устанавливается в состояние 59 (команда idi sek,59 ), т. е. счет сразу же начинается с новой минуты. Окончание установки – это довольно важный момент, который можно организовать по‑разному, но данный способ наиболее удобен, т. к. вам достаточно дождаться окончания текущей минуты по образцовым часам, и в этот момент сделать последнее нажатие, выйдя из режима установки, чтобы довольно точно синхронизировать время. Сравните, например, как неудобно исполнена ручная установка часов в Windows, где часы продолжают идти и во время установки. А если бы мы обнуляли счетчик секунд вместо его установки в максимальное значение, то нам пришлось каждый раз устанавливать число минут на единицу большее текущего, что неудобно.
Теперь об обеспечении режима автономной работы. Программа контроллера в непрерывном цикле опрашивает значение логического уровня на выводе номер 12 (РВО, он же AIN+), и когда оно становится равным нулю, принимает меры к снижению потребления, в первую очередь за счет отключения внешних портов (см. процедуру Disable ). Как только внешнее питание восстанавливается, автоматически возобновляется нормальный режим работы (Restore ).
При перебрасывании компаратора в любою сторону происходит прерывание ACOMPI. В нем вывод 15 (ОС1) отключается от таймера Timer 1 и устанавливается навсегда в единичное состояние, если состояние компаратора есть логическая единица (т. е. когда истощается или отключается батарейка). Тогда двоеточие горит постоянно. И наоборот, вывод этот опять подключается к автоматическому миганию, когда компаратор перебрасывается обратно в нулевое состояние.
Дата добавления: 2016-05-11; просмотров: 1295;