Часы со счетом времени на МК – Часть 2

June 27, 2010 by admin Комментировать »

Программа

Полный текст программы часов приведен в приложении 4 (разд. «Программа для часов»). Все подробности приведены в качестве комментариев к тексту программы, здесь мы разберем только общее построение и принцип работы.

При включении питания процессора программа начинает работу с команды по метке RESET. Здесь она устанавливает соответствующие порты на выход (все, кроме двух входов компаратора и входа кнопки Кн1), затем делает нуж­ные установки для таймеров и разрешает соответствующие прерывания.

Восьмиразрядный Timer О у нас будет по событию переполнения управлять разрядами в режиме динамической индикации. При заданной частоте на вхо­де Timer О, равной 1/8 от тактовой частоты (4 МГц), частота управления раз­рядами получится равной 1/256 от 4 МГц/8 = 500 кГц, то есть чуть меньше 2 кГц, а каждый из четырех разрядов будет включаться с частотой почти 500 Гц, что однозначно превышает порог заметности мигания.

Заметки на полях

Заметим, что при проектировании питания подобных устройств следует учиты­вать еще одно обстоятельство: в динамическом режиме нельзя использрвать для питания индикаторов пульсирующее напряжение (как в схеме со статиче­ской индикацией вроде термометра из главы 17)— обязательно возникнут биения между частотой питающего напряжения и частотой переключения раз­рядов, и яркость свечения будет пульсировать. Потому напряжение +12 В не­обязательно должно быть стабилизированным, но для него обязательно нали­чие сглаживающего фильтра. На самом деле в данной конструкции это условие соблюдается aBT0MatH4ecKH, так как те же +12 В подаются и на вход стабилизатора +5 В, но могут встретиться и конструкции, в которых питание индикаторов осуществляется от отдельной обмотки трансформатора, и там об этом забывать не следует.

16-разрядный Timer 1 у нас будет управлять собственно отсчетом времени по прерыванию сравнения, как это делалось в предыдущей главе. Для этого в регистры сравнения загружается число 62500, а предварительный коэффици­ент деления задается равным 1/64, тогда прерывание таймера будет возни­кать с частотой 4 МГц/64/62500 = 1 Гц. На практике число для сравнения подгоняется под конкретный кварц, и обычно почему-то меньше теоретиче­ской величины 62 500 (так, в моем случае оно было равно 62 486),

Подробности

Как быстро подобрать коэффициент деления? Можно воспользоваться высо­коточным частотомером (мультиметры, позволяющие измерять частоту, не по­дойдут решительно, а большинство радиолюбительских частотомеров могут использоваться лишь для ориентировочной прикидки) для измерения дли­тельности секундного импульса на выводе 0С1А. При отсутствии такого при­бора нужно воспользоваться следующим приемом: установить часы с каким-то определенным коэффициентом (например, с теоретическим значением 62500) по точным часам, например, по компьютерному времени, которое несложно выставить через Интернет очень точно. Так как небольшая ошибка все равно может сохраниться (см. далее процедуру установки), то после установки от­метьте точную разницу в секундах ме>кду моментом смены показаний минут нашей конструкции и точных часов и запишите ее. Потом выдержите часы дос­таточно длительный промежуток времени (чем длиннее, тем точнее). Снова точно установите компьютерное время и опять запишите разницу в момент смены минут.

Таким образом вы получите величину ухода часов — пусть, например, она со­ставляет 200 секунд в месяц в сторону отставания. Это значит, что у нас се­кундный интервал длиннее необходимого на 200/2 592 ООО = 7,7-10"^ часть, то есть на 77 микросекунд (число 2 592 ООО есть число секунд за 30 дней, про­верьте). Эту же величину мы можем получить и с помощью частотомера. Настолько следует уменьшить период «тиков» таймера, для чего нужно умень­шить наш коэффициент деления на величину 62 5007,7Ю"^« 5, то есть в ре­гистры таймера необходимо записать число 62 495. То же число можно полу­чить, исходя из того, что при коэффициенте деления 1:64 и кварце 4 МГц ка>кдый такт таймера длится 16 микросекунд. Отметьте, что несмотря на ка­жущуюся достаточно высокую величину коэффициента деления 62 500, изме­нение его на всего на единицу изменит ход часов на целых 40 секунд в месяц, то есть более, чем на секунду в сутки это является следствием использова­ния 16-разрядных счетчиков-таймеров и крупнейшим недостатком использова­ния МК для отсчета времени. Далее мы увидим, что для более тонкой под­стройки нам придется изощряться, придумывая всякие хитрости.

Кроме этого, в процедуре инициализации разрешается прерывание от кнопки Кн1 (INT1). Для кнопки Кн2 отдельного прерывания не требуется, ее состоя­ние отслеживается в непосредственно в процессе установки (см. далее). По окончании установок разрешаются прерывания (команда sei), и далее про­грамма переходит к выполнению бесконечного цикла, во время которого производится мониторинг состояния определенных узлов.

Основная логика работы часов следующая. Каждую секунду, когда происхо­дит прерывание Timer 1, счетчик секунд зек увеличивается на 1 (см. про­цедуру обработки прерывания TIM1 по метке mtime). Если его значение не равно 60, то больше ничего не происходит, если равно, то регистр зек обну­ляется, и далее по цепочке обновляются значения текущего времени, храня­щиеся в регистрах emin, dmin, ehh и dhh (см. их определения в начале про­граммы).

Прерывание по переполнению Timer О для управления разрядами происходит независимо от прерывания Timer 1 и использует установленные в последнем значения часов. По Timer О обнуляются все выходы всех портов, управляю­щие индикацией, затем проверяется значение счетчика POS, отсчитывающего последовательные номера разрядов (от О до 3). Чтобы не тратить время на всякие проверки и обнуления, для организации счетчика до 4 здесь использу­ется тот факт, что число 4 совпадает с числом комбинаций первых двух бит. Тогда для последовательного непрерывного счета (0-1-2-3-0-1…) достаточно каждый раз увеличивать счетчик на единицу (см. команду inc POS в конце процедуры), а в начале ее лишь обнулять старшие шесть бит (команда andi PCS, 3). Далее в зависимости от значения счетчика (cpi pos,…) устанав­ливаем питание нужного индикатора (зы PortD,…) и вызываем процедуру установки маски сегментов segset, где в зависимости от значения данного разряда в часах, устанавливается и маска.

В процедуре seg_set и собственно в процедурах установки маски (оитх) я предлагаю вам разобраться самостоятельно. Есть и другие способы— на­пример, непосредственного задания маски рисунков цифр через загрузку констант командой ipm для чтения констант из памяти, тогда не потреб^уется длинной процедуры установку бит по отдельности (см. далее). Но такую маску удобно использовать, если у вас выводы управления разрядами идут подряд (к примеру, когда биты О—7 порта D соответствуют битам маски О—7). Тогда маску достаточно приложить к регистру порта, и программа резко со­кращается. А здесь это сделать трудно — перестраивание маски под выводы различных портов займет не меньше места, чем простая и понятная прямая установка выводов.

Процедура установки часов накладывается на всю эту картину и работает следующим образом. При коротком нажатии на Кн1 возникает прерывание INT1 (процедура по метке intti), в котором первым делом проверяется, есть ли сетевое питание (бит 1 регистра Flag, см. далее), иначе и сама установка не требуется. Далее запрещается само прерывание INT1 во избежание дре­безга. Разрешается оно в прерывании Timer 1 (см. начало текста процедуры TIM1), которое, как мы уже знаем, происходит каждую секунду. Таким обра­зом время нечувствительности, в течении которого можно отпустить кнопку без последствий (без перескока на произвольный разряд), составляет случай­ную величину от О до 1 с. На самом это не совсем верное решение, и сделано так только для простоты — по-хорошему следовало бы пропустить одну се­кунду, и только потом разрешать, иначе вероятность дребезга все-таки оста­ется большой.

Далее в прерывании INT1 устанавливается отдельный счетчик разрядов setup, который будет считать от 1 до 4 (если он больше, то выходим из ре­жима установки), и признак режима установки (бит О регистра Flag). Если этот признак установлен, то разряд, соответствующий установленному номе­ру в счетчике set_up, будет мигать. Это достигается с помощью вспомога­тельного счетчика count (см. процедуру timi по метке conti). В этом же месте программы отслеживается состояние Кн2 — если она нажата и удер­живается, то каждую секунду происходит увеличение значения выбранного разряда на 1, в тех пределах, в которых это допускается (для единиц минут — от О до 9, для десятков минут— от О до 5, для десятков часов — от О до 2, причем предел единиц часов зависит от значения десятков), далее значение опять обращается в 0. Отпустив кнопку Кн2, вы фиксируете установленное значение, а нажав кратковременно на Кн1, переходите к следующему разря­ду. После прохождения всех разрядов, при последнем (пятом) нажатии Кн1 режим установки отменяется, то есть бит О регистра Flag сбрасывается (см. процедуру по прерыванию 1NT1).

Немаловажная особенность этой конструкции — то, что во время установки счет времени прекращается, а при выходе из режима установки счетчик се­кунд устанавливается в состояние 59 (команда idi sek, 59), то есть счет сра­зу же начинается с новой минуты. Окончание установки— это довольно важный момент, который можно организовать по-разному, но данный способ наиболее удобен, так как вам достаточно дождаться окончания текущей ми­нуты по образцовым часам, и в этот момент сделать последнее нажатие, вый­дя из режима установки, чтобы довольно точно синхронизировать время. Сравните, например, как неудобно исполнена ручная установка часов в Win­dows, где часы продолжают идти и во время установки. А если бы мы обну­ляли счетчик секунд, вместо его установки в максимальное значение, то нам пришлось каждый раз устанавливать число минут на единицу большее теку­щего, что неудобно.

Теперь об обеспечении режима автономной работы. Программа контроллера в непрерывном цикле опрашивает значение логического уровня на выводе номер 12 (РВО, он же AINH-), и когда оно становится равным нулю, принима­ет меры к снижению потребления, в первую очередь за счет отключения внешних портов (см. процедуру Disable). Как только внешнее питание вос­станавливается, автоматически возобновляется нормальный режим работы (Restore).

При перебрасывании компаратора в любою сторону происходит прерывание acompi. В нем вывод 15 (ОС1) отключается от таймера Timer 1 и устанавли­вается навсегда в единичное состояние, если состояние компаратора есть ло­гическая единица (то есть когда истощается или отключается батарейка). То­гда двоеточие горит постоянно. И наоборот, вывод этот опять подключается к автоматическому миганию, когда компаратор перебрасывается обратно в нулевое состояние.

Детали и конструкция

в качестве блока питания используем внутренности блока со встроенной вилкой, с номинальным напряжением питания 10 В и током не менее 500 мА (такие продаются для некоторых игровых консолей). Напряжение на холо­стом ходу у него будет составлять примерно 13—14 В, под нагрузкой 130 мА оно сядет как раз примерно до 11—12 В.

В качестве кнопок Кн1 и Кн2 с легким нажатием удобно использовать обыч­ные микропереключатели (известные в отечественном варианте под названи­ем МП-1), но со специальной металлической лапкой-рычагом, которая пред­назначена для того, чтобы уменьшить усилия нажатия и увеличить зону срабатывания (вообще-то такие кнопки предназначены для использования в качестве концевых выключателей). Подойдут импортные кнопки типа SM5 (см. рис. 20.3). Тогда нам не придется портить внешний вид фальшпанели кнопками или устанавливать их где-то сзади, а можно установить их прямо на плату индикаторов и просверлить в дымчатом оргстекле напротив них ма­ленькие отверстия, через которые кнопку можно нажимать зубочисткой или другим острым предметом. Чтобы отверстие в оргстекле выглядело «фир­менно», сверлить следует осторожно, на малых оборотах, затем вручную сверлом или зенковкой сделать аккуратную фаску с лицевой стороны и обра­ботать отверстие маслом, чтобы оно не белело. Подобное решение хорошо еще и тем, что случайное нажатие кнопок — беда почти всех бытовых элек­тронных устройств — совершенно исключено.

clip_image002

Рис. 20.3. Кнопка SM5 с лапкой-рычагом

После изготовления платы индикации сначала следует установить с обратной стороны разъем, а затем «обдуть» лицевую часть платы черной эмалью из баллончика, не слишком густо (достаточно одного слоя), чтобы краска не затекла в отверстия. Потом на черную плату уже монтируются индикаторы, светодиоды разделительной точки и кнопки. Светодиоды нужно выбирать, естественно, того же цвета свечения, что и индикаторы. Имейте в виду, что сама по себе характеристика «желтый» или «зеленый» еще ни о чем не гово­рит, только в таблице, приведенной в главе 7, два зеленых цвета и три крас­ных, а у разных изделий разных фирм их может быть еще больше. И чтобы разница не бросалась в глаза, приготовьтесь к тому, что покупать придется несколько разновидностей и подбирать оттенок по месту. Под индикаторы указанного типоразмера 1 дюйм подойдут светодиоды диаметром 3 мм.

обычные 5-миллиметровые будут слишком выделяться (а под меньшие инди­каторы потребуются светодиоды с еще меньшим диаметром). Светодиоды при этом желательно иметь с диффузным рассеиванием, чтобы было одина­ково видно со всех углов зрения. Так что вопрос их подбора может оказаться непростым.

Для каждого типа светодиодов придется подобрать резистор R34 (см. рис. 20.1) согласно необходимой яркости (для прозрачных номинал его будет больше, для диффузных — меньше). Устанавливать эту пару диодов следует не прямо друг над другом, а с некоторым наклоном, соответственно наклону цифры индикатора. Неплохо будет также выглядеть использование прямо­угольных светодиодов (5×2 мм), также под наклоном, только их боковые грани придется закрасить густой черной краской или аккуратно обернуть их непрозрачной липкой лентой.

Я останавливаюсь на всех этих подробностях потому, что они имеют ре­шающее значение для того, будет ли ваша конструкция выглядеть фирменно или напоминать продукт творчества членов кружка юных техников из дерев­ни Гадюкино. Затрачивать столько сил и средств на конструирование и пре­небречь при этом нюансами внешнего вида просто не имеет смысла — если вы, конечно, конструируете бытовой прибор, а не утилитарную схему для рабочих нужд. Но и в последнем случае гораздо удобнее брать в руки акку­ратную и удобную в работе конструкцию, а не голую плату с болтающимися проводами.

Когда мы соединим плату управления с платой индикации кабелем и под­ключим питание, схема заработать сразу не сможет, потому что нужно запро­граммировать МК. Для этого вы должны подключить к разъему XI програм­матор и загрузить hex-файл с программой. Часы должны «затихать» светодиодами, и показать все нули на индикаторах. Потом можно браться за установку времени.

Без сомнения, вы легко сможете доделать эту конструкцию, добавив в нее, к примеру, функции будильника. Причем это можно сделать в принципе даже без переделки схемы, если «повесить» функции установки и включения бу­дильника на те же кнопки, разделив их с простой установкой за счет отсчета времени удержания кнопки (то есть между нажатием и отпусканием). Слож­нее, правда, будет обеспечить выход на «пищалку», но ее можно «повесить» на тот же вывод «мигалки» управления разделительными светодиодами, если при срабатывании будильника заполнять включенное состояние мигалки час­тотой 2 кГц, предназначенной для управления разрядами — например, пере­ключая с этой частотой вывод 0С1 то на вход, то на выход (при этом в обыч­ном режиме «пищалка» будет еле слышно тикать). Но, разумеется, никто вас не заставляет жаться и применять именно 2313 — возьмите модель MegaS или Mega8515, где выводов гораздо больше, и все окажется куда проще. Тем более, что в этом случае можно придумать и еще что-то, например, добавить маленькие разряды секундомера в углу передней панели, а будильник допол­нить «милицейской» мигалкой, переключая красный и синий светодиоды по­переменно.

Тонкая подстройка

Как я уже говорил, собственную конструкцию имеет смысл делать только в том случае, если она «умеет» что-то такое, чего не обеспечивают покупные изделия. Все покупные часы отстают (ни разу не встречал электронных ча­сов, которые бы спешили), и чем они дешевле, тем сильнее это отставание. Может быть, мы можем улучшить свою конструкцию и обеспечить более тонкую подстройку хода часов, чем это делается с помощью изменения ко­эффициента делания счетчика, как рассказывалось ранее?

Самый простой метод— ввести коррекцию с помощью программной за­держки, как в первом варианте «мигалки» из предыдущей главы. Только для удобства (чтобы не занимать слишком много регистров общего назначения) мы модифицируем процедуру задержки по такому принципу:

/задержка на 1 мс Idi ZH,high(1000) ;кварц 4 МГЦ Idi ZL,low(1000) loop:

sbiw ZL,1 brne loop

Здесь sbiw — инструкция, которая позволяет вычесть константу (в данном случае единицу) из пары специально для этого предназначенных регистров, в качестве которых могут выступать три последние пары РОН, обозначаемые

X, Y и Z — то есть пары г27:г26, г29:г28 И г31:г30, СООТВеТСТВСННО. ИнаЧС их именуют ХН: XL, YH: YL, ZH: ZL — В ТОМ ЖС ПОрЯДКС (тО ССТЬ СТарШИМ В КВЖ-

дой паре служит регистр с большим номером). Эти пары также играют глав­ную роль при адресации памяти (SRAM), как мы увидим далее. Отметим, что операция sbiw (а также симметричная операция суммирования adiw) может быть применена и к паре регистров г25: г24, которые больше никак не выде­лены.

Особенностью операции sbiw является то, что она 16-разрядная. Занимает она два такта, и еще два такта занимает возврат на метку loop, если не дос­тигнуто нулевое значение в обоих регистрах. Таким образом, вся процедура занимает 4 такта, а задержка в одном цикле при тактовой частоте 4 МГц со­ставит 1 микросекунду. Если записать в zh:ZL максимально возможное зна­чение 65 535, то задержка составит, соответственно, 65,535 миллисекунды.

Для того чтобы обеспечить точную подстройку хода часов, мы поступим следующим образом. В регистры сравнения ocriah : ocrial мы будем запи­сывать такое число, чтобы часы заведомо спешили. Если оно равно, напри­мер, 62400, то при условии, что кварц имеет частоту, строго равную номи­нальной, это значение обеспечит уход часов вперед на величину 100 тактов таймера каждую отсчитываемую секунду. При коэффициенте деления 1:64 и кварце 4 МГц каждый такт таймера длится 16 микросекунд. Таким образом, чтобы скомпенсировать эту величину ухода, нам потребуется остановить таймер, выдержать паузу 1600 мкс и затем запустить таймер снова (задерж­ками при остановке и последующем запуске таймера пренебрегаем). Оконча­тельно следует вставить в обработчик прерывания Timer 1 (процедура по метке TIM1, см. текст программы часов в приложении 4) в самое его начало, еще до проверок всяких флагов, такие строки:

clr temp

out TCCRIB,temp ;останавливаем Timerl ;задержка на 1,б мс ldi zh,high(1600) ;кварц 4 МГЦ ldi zl,low(1600) loop:

sbiw zl,1 brne loop

ldi temp,0b01001011 /запускаем 1/64 Timerl снова out TCCRIB,temp;

Меняя величину, загружаемую в регистры zh:zl, можно очень точно подстро­ить ход часов под реальную частоту кварца. Правда, достичь реальной разре­шающей способности этого метода (1 мкс на каждую секунду, что составляет в сутки около 0,086 с или в месяц около 2,5 с) вряд ли удастся, ибо девиации час­тоты такого простого генератора, какой применяется в МК (мы его рассматри­вали в главе 16), как за счет изменения температуры, так и чисто случайные, заметно превышают точность такой подстройки. Чтобы этого избежать, квар­цевые генераторы приходится строить по значительно более сложным схемам или использовать готовые с высокой стабильностью частоты.

При применении этого метода не стоит увлекаться задержками: лучше всего заранее подсчитать примерный уход кварца, и выставить частоту прерываний поближе к длительности секунды, изменяя число в регистрах сравнения, а с помощью задержки компенсировать только оставшуюся неточность. Дело в том, что во время задержки МК «висит»: вся остальная часть обработчика прерывания выполнится за время порядка единиц или десятков микросекунд, а задержки порядка миллисекунды превышают время между тактами дина­мической индикации, которые у нас идут с частотой около 2 кГц. Потерять одно-два прерывания индикации в секунду в данном случае, конечно, не страшно, но в других случаях это может оказаться критичным.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты