kancboom.ru

AVR. Учебный Курс. Асинхронный режим таймера. Часы на микроконтроллере AVR с DS1307 Часы на avr и lcd

Эта схема была опубликована еще в 2008 году, на сайте http://radiokot.ru/circuit/digital/home/33/ , и не смотря на явные схемотехнические ошибки - схема работает, многие за это время ее повторили, там же на сайте есть большая тема форума, где обсуждается это устройство. Кроме авторскйо прошивки, на форуме есть еще наборы прошивок. В том числе и для вариантов схемы при использовании различных индикаторов, как с собщим катодом, так и с общим анодом. Архив с проверенными прошивками и их исходными текстами в конце страницы.

Я вспомнил об этой схеме, когда мне потребовались простые "первичные часы". Схема была повторена в точности, с единственным изменением - вместо индикатора установлен разъем, к которому будет подключаться силовая часть "больших часов". Для того, чтобы убедиться в том, что часы работают - подключен первый, попавшийся под руку индикатор: XYLNH 420401B-0 - понятия не имею что эта надпись на корпусе означает, но индикатор по распиновке полностью совпадает с рекомендуемым авторм индикатором CC56-12SRWA, только синего свечения.

Управление часами очень простое: Кнопкой S2 устанавливают минуты, а кнопкой S3 - часы. Кнопка сброс (S1), позволяет установить время на полночь, иногда бывает полезно, хотя ее можно не устанавливать. Точка, разделяющая часы и минуты, моргает с частотой 1,25 Гц, то есть 0,4 секунды горит, 0,4 сек. нет.

В целом - схема работает. Но, если предполагается использовать ее так как она есть, то я бы все-таки посоветовал увеличил сопротивление резисторов R4-R11 до, хотя бы 330 Ом, и поставил бы транзисторы в цепь управления катодами. ATtini2313 процессор конечно живучий, но думаю не следует его мучать в таком режиме.

И пару слов о программировании МК. Я использовал программатор Программатор AVR ISP mkII с программой AVRDUDE_PROG 3.2

Данная статья описывает конструкцию цифровых часов на микроконтроллере Attmega8 , которые снабжены секундомером, будильником, таймером обратного отсчета. В часах реализована функция отображения дня недели и даты с возможностью комбинированного отображения даты и времени. Имеется автоматическое переключение на летнее и зимнее время, а так же учет високосного года.

Дисплей построен на шести 7-сегментных светодиодных индикаторов с регулировкой яркости. Часы также оснащены резервным питанием от батарей.

Описание конструкции микроконтроллерных часов

Как уже было сказано выше, часы имеют шестизначный дисплей, состоящий из двух трехзначных дисплеев T-5631BUY-11, работающий в мультиплексном режиме. Аноды индикаторов сгруппированы по разрядам и переключаются с помощью транзисторов Т1…Т6.

Катоды сгруппированы в сегменты и питаются непосредственно от микроконтроллера IO1 Attmega8. Частота мультиплексирования составляет 100Гц.

Часы контролируется низкочастотным кварцевым резонатором X1 с частотой 32768 Гц. В результате активации бита CKOPT, разрешающего использование внутренних конденсаторов 36пф для кварца, отпадает необходимость в использовании внешних конденсаторов.

В случае возникновении проблем с запуском генератора, можно попробовать подключить 2 конденсатора по 22пф. Для еще большей точности часов можно вообще отключить внутренние конденсаторы (сбросить бит СKOPT) и оставить только внешние.

Пъезоизлучатель REP1 издает звуковой сигнал будильника и сигнализирует о завершении работы таймера. Во время звукового сигнала на выводе 16 (порт PB2) появляется лог.1. Этот сигнал можно использовать для управления какой-либо нагрузкой.

Управление часами производится тремя кнопками — минуты, часы и режим. Кнопки подключены через резисторы, которые защищают порты микроконтроллер Attmega8. Схема питается от источника 5 вольт (7805). Потребление тока в основном зависит от числа активных индикаторов, а так же от степени настройки яркости.

При максимальной яркости ток потребления доходит до 60 мА. Часы снабжены резервной батареей питания. Во время работы от батареи, часы переходят в экономичный режим, при котором дисплей выключен. Так же в этом режиме не активны и кнопки за исключением случая, когда необходимо отключить звуковой сигнал.

Напряжение резервного питания от 3 до 4,5 В. Это может быть одна батарея на 3В, три NiMH или NiCd по 1,2 В или один аккумулятор Li-Pol или Li-Ion (от 3,6 до 3,7 В). Ток потребления от 3В батареи составляет всего лишь 5…12мA. Время автономной работы часов в экономичном режиме от батареи 3В типа CR2032 со стандартной емкостью 200mAh теоретически должно хватить примерно на 2,5 — 3 лет.

Программное обеспечения для микроконтроллера находится в конце статьи. Биты конфигурации необходимо выставить следующим образом:

Управление часами

Часы управляются с помощью TL1-минута, час-TL2 и TL3-режим. Кнопки часы и минуты используются в режиме часов для назначения часов и минут. В других режимах они имеют различные функции. Кнопка режима переключает между различными режимами, которых в общей сложности 8:

Режим 1-й — Часы

В этом режиме на дисплее отображается текущее время в формате «ЧЧ.ММ.СС». Кнопка часов используется для установки часов. Кнопка минут для установки минут. При ее нажатии происходит сброс секунд.

Режим 2-й — Включение перехода на летнее время и установки года

Здесь Вы можете включать и выключать автоматический переход между летним и зимним временем и установить год. Данные следующего формата «AC ‘RR» (АС – автоматическое время, пробел, последние две цифры года).

Режим 3-й — Таймер обратного отсчета

Это режим позволяет организовать обратный отсчет от заданного значения до нуля. По истечении этого времени раздастся звуковой сигнал и светится светодиод LED1. Звуковой сигнал может быть остановлен нажатием кнопки Режим. Данные следующего формата «ЧЧ.ММ.СС». Максимально возможное значение составляет 99.59.59 (почти 100 часов).

Режим 4-й – Комбинированный вывод информации

В этом режиме, попеременно показывается:

  1. текущее время в формате «ЧЧ.ММ.СС»
  2. дата в формате «AA.DD.MM.»

Каждый формат отображается в течение 1 секунды. В этом режиме используются кнопки Часов и Минут, для регулировки яркости дисплея (Часы-, Минуты+). Яркость изменяется логарифмически в 6 этапов: 1/1, 1/2, 1/4, 1/8, 1/16 и 1/32-й. По умолчанию установлено 1/2

Режим 5-й — Установка дня недели и режим работы будильника

В этом режиме можно установить день недели — с понедельника по воскресенье (отображается как пн, вт, ср, чт, пт, сб, вс), включать будильник и выбирать его режим работы. Данные следующего формата «AA AL._» (день недели, пробел, AL., Настройка будильника).

Кнопка часов устанавливает день недели. Кнопка минут используется для включения/выключения звукового сигнала будильника и выбора режима его работы: «AL._» = будильник не активный, «AL.1″ = будильник сигналит 1 раз (затем автоматически переходит в положение»AL._»), «AL.5» = сигнал будильника только в будние дни (пн-пт, кроме сб-вс), «AL.7» = будильник звонит каждый день

Режим 6-й – Установка дня недели и даты

Кнопка часов позволяет установить день месяца. Кнопка минут позволяет установить месяц.

Режим 7-й — Секундомер

Секундомер позволяет измерять время с точностью 0,1 сек. Максимальное время измерения составляет 9.59.59.9 (почти 10 часов). Данные следующего формата «H.MM.SS.X». Кнопка минут используется для запуска и остановки секундомера. Кнопка часов используется для сброса.

Режим 8-й — Будильник

Этот режим используется для отображения и установить время будильника (ALARM). Данные следующего формата «HH.MM.AL». Кнопка Минуты устанавливает минуту будильника, кнопку Часы устанавливает час будильника.

Ниже приведена схема аналогичных часов, имеющие индикатор с общим катодом

(скачено: 812)

Иногда полезно иметь в системе часы отсчитывающие время в секундах, да еще с высокой точностью. Часто для этих целей применяют специальные микросехмы RTC (Real Time Clock) вроде . Вот только это дополнительный корпус, да и стоит она порой как сам МК, хотя можно обойтись и без нее. Тем более, что многие МК имеют встроенный блок RTC. В AVR его правда нет, но там есть асинхронный таймер, служащий полуфабрикатом для изготовления часиков.

Первым делом нам нужен часовой кварц на 32768Герц.

Почему кварц именно 32768Гц и почему его зовут часовым? Да все очень просто — 32768 является степенью двойки. Два в пятнадцатой степени. Поэтому пятнадцати разрядный счетчик, тикающий с частотой 32768 Гц, будет переполняться раз в секунду. Это дает возможность строить часы на обычной логической рассыпухе без каких либо заморочек. А в микроконтроллере AVR организовать часы с секундами можно почти без использования мозга, на рефлексах периферии.

Асинхронный режим таймера
Помните как работают таймеры? Тактовая частота с основного тактового генератора (RC внешняя или внутренняя, внешний кварц или внешний генератор) поступает на предделители, а с выхода предделителей уже щелкает значениями регистра TCNT. Либо сигнал на вход идет с счетного входа Тn и также щелкает регистром TCNT

Для этого на выводы TOSC2 и TOSC1 вешается кварцевый резонатор. Низкочастотный, обычно это часовой кварц на 32768Гц. На он смонтирован справа от контроллера и подключается перемычками. Причем тактовая частота процессора должна быть выше как минимум в четыре раза. У нас тактовая от внутреннего генератора 8Мгц, так что нас это условие вообще не парит:)

И не нужно высчитывать количество тактов основного кварца, а если его нет, то заморачиваться на плавающую частоту встроенного RC генератора. Часовой кварц имеет куда более компактные размеры чем обычный кварц, да и стоит дешевле.


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

Конфигурирование
Для включения надо всего лишь установить бит AS2 регистра ASSR — и все, таймер работает в асинхронном режиме. Но есть тут одна фича которая мне стоила много головняков в свое время. Дело в том, что при работе от своего кварца все внутренние регистры таймера начинают синхронизироваться по своему же кварцу. А он медленный и основная программа может менять уже введенное значение гораздо быстрей чем оно обработается таймером.

Т.е., например, предустановил ты значение TCNT2, таймер на своей 32кгц молотилке его еще даже прожевать не успел, а твой алгоритм уже пробежал и снова туда что то записал — в результате в TCNT2 наверняка попадет мусор. Чтобы этого не случилось запись буфферизируется. Т.е. это ты думаешь, что записал данные в TCNT2, но на самом деле они попадают во временный регистр и в счетный попадут только через три такта медленного генератора.

Также буфферизируется регистры сравнения OCR2 и регистр конфигурации TCCR2

Как узнать данные уже внеслись в таймер или висят в промежуточных ячейках? Да очень просто — по флагам в регистре ASSR. Это биты TCN2UB, OCR2UB и TCR2UB — каждый отвечает за свой регистр. Когда мы, например, записываем значение в TCNT2 то TCNUB становится 1, а как только наше число из промежуточного регистра таки перешло в реальный счетный регистр TCNT2 и начало уже тикать, то этот флаг автоматом сбрасывается.

Таким образом, в асинхронном режиме, при записи в регистры TCNT2, OCR2 и TCCR2 сначала нужно проверять флаги TCN2UB, OCR2UB и TCR2UB и запись проводить только если они равны нулю. Иначе результат может быть непредсказуемым.

Да, еще один важный момент — при переключениях между синхронным и асинхронным режимом значение в счетном регистре TCNT может побиться. Так что для надежности переключаемся так:

  • Запрещаем прерывания от этого таймера
  • Переключаемся в нужный режим (синхронный или асинхронный)
  • Заново настраиваем таймер как нам нужно. Т.е. выставляем предустановку TCNT2 если надо, заново настраиваем TCCR2
  • Если переключаемся в асинхронный режим, то ждем пока все флаги TCN2UB, OCR2UB и TCR2UB будут сброшены. Т.е. настройки применились и готовы к работе.
  • Сбрасываем флаги прерываний таймера/счетчика. Т.к. при всех этих пертурбациях они могут случайно установиться
  • Разрешаем прерывания от этого таймера

Несоблюдение этой последовательности ведет к непредсказуемым и трудно обнаруживаемым глюкам.

Спящие режимы и асинхронный таймер
Т.к. асинхронный таймер часто используется в разных сберегающих режимах, то тут возникает одна особенность, раскладывающая целое поле из граблей.

Суть в том, что таймер, работающий от медленного кварца, не успевает за главным процессором, а в том дофига зависимостей от периферии — те же прерывания, например. И когда проц спит, то эти зависимости не могут реализоваться, в результате возникают глюки вроде неработающих прерываний или поврежденных значений в регистрах. Так что логика работы с асинхронным таймером и спящим режимом должна быть построена таким образом, чтобы между пробуждением и сваливаеним в спячку асинхронный таймер успел отработать несколько своих тактов и выполнил все свои дела.

Примеры:
Контроллер использует режим энергосбережения и отключения ядра, а пробуждается по прерываниям от асинхронного таймера. Тут надо учитывать тот факт, что если мы будем изменять значения регистров TCNT2, OCR2 и TCCR2, то уход в спячку нужно делат ТОЛЬКО после того, как флаги TCN2UB, OCR2UB и TCR2UB упадут. Иначе получится такая лажа — асинхронный таймер еще не успел забрать данные из промежуточных регистров (он же медленный, в сотни раз медленней ядра), а ядро уже отрубилось. И ладно бы конфигурация новая не применилась, это ерунда.

Хуже то, что на время модификаций регистров TCNT или OCR блокируется работа блока сравнения, а значит если ядро уснет раньше, то блок сравнения так и не запустится — некому его включить будет. И у нас пропадет прерывание по сравнению. Что черевато тем, что событие мы прошляпим и будем их терять до следующего пробуждения из спячки.
А если контроллер будится прерыванием по сравнению? То он уснет окончательно. Опаньки!
Вот и лови такой глюк потом.

Так что перед уходом в режимы энергосбережения надо обязательно дать асинхронному таймеру прожевать введенные значения (если они были введены) и дождаться обнуления флагов.

Еще один прикол с асинхронным режимом и энергосбережением заключается в том, что подсистема прерываний при выходе из спячки стартует за 1 такт медленного генератора. Так что даже если мы ничего не меняли, то обратно в спячку сваливаться нельзя — не проснемся, т.к. прерывания не успеют запуститься.

Так что выход из спячки и засыпание по прерыванию асинхронного таймера должно быть в таком виде:

  • Проснулись
  • Что то сделали нужное
  • Заснули

И длительность операции между Проснулись и Заснули НЕ ДОЛЖНА БЫТЬ МЕНЬШЕ чем один тик асинхронного таймера. Иначе анабиоз будет вечным. Можешь delay поставить, а можешь сделать как даташит советует:

  • Проснулись
  • Что то сделали нужное
  • Ради прикола записали что то в любой из буфферизиуемых регистров. Например, в TCNT было 1, а мы еще раз 1 записали. Ничего не изменилось, но произошла запись, поднялся флаг TCN2UB который продержится гарантированно три такта медленного генератора.
  • Подождали пока флаг упадет
  • Уснули.

Также не рекомендуется при выходе из спячки сразу же читать значения TCNT — можно считать лажу. Лучше подождать один тик асинхронного таймера. Или сделать прикол с записью в регистр и ожиданием пока флаг спадет, как было написано выше.

Ну и последний, но важный, момент — после подачи питания, или выхода из глубокой спячки, с отключением не только ядра, а вообще всей периферии, пользоваться медленным генератором настоятельно рекомендуется не раньше чем через 1 секунду (не миллисекунду, а целая секунда!). Иначе генератор может еще быть нестабильным и в регистрах будет еще каша и мусор.

И, в завершение статьи, небольшой примерчик. Запуск асинхронного таймера на Atmega16 (Как полигон используется плата )

Проект типовой, на базе диспетчера, одно лишь отличие — диспечтер переброшен на таймер0, чтобы освободить таймер2.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int main(void ) { InitAll() ; // Инициализируем периферию InitRTOS() ; // Инициализируем ядро RunRTOS() ; // Старт ядра. UDR = "R" ; // Маркер старта, для отладки SetTimerTask(InitASS_Timer, 1000 ) ; // Так как таймер в асинхронном режиме // запускается медленно, то делаем // Выдержку для запуска инициализации таймера. while (1 ) // Главный цикл диспетчера { wdt_reset() ; // Сброс собачьего таймера TaskManager() ; // Вызов диспетчера } return 0 ; }

int main(void) { InitAll(); // Инициализируем периферию InitRTOS(); // Инициализируем ядро RunRTOS(); // Старт ядра. UDR = "R"; // Маркер старта, для отладки SetTimerTask(InitASS_Timer,1000); // Так как таймер в асинхронном режиме // запускается медленно, то делаем // Выдержку для запуска инициализации таймера. while(1) // Главный цикл диспетчера { wdt_reset(); // Сброс собачьего таймера TaskManager(); // Вызов диспетчера } return 0; }

Сама процедура инициализации таймера в асинхронном режиме сделана в виде конечного автомата. При первом запуске она взводит бит асинхронного режима и делает приготовления, после запускает сама себя снова же, через диспетчер, чтобы дать возможность еще чему либо проскочить в очереди, не блокируюя систему на ожидание.

При последующих входах проверяются флаговые биты готовности регистров таймера. Если они все по нулям, то мы на всякий случай зануляем флаги прерывания таймера, чтобы не было глюков и ложных срабатываний, а потом разрешаем нужное нам прерывание. И выходим.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void InitASS_Timer(void ) { if (ASSR & (1 << AS2) ) //Если это второй вход то { if (ASSR & (1 << TCN2UB | 1 << OCR2UB | TCR2UB) ) // проверяем есть ли хоть один бит флаговый { SetTask(InitASS_Timer) ; // Если есть, то отправляем на повторный цикл ожидания } else // Если все чисто, то можно запускать прерывания { TIFR |= 1 << OCF2 | 1 << TOV2; // Сбрасываем флаги прерываний, на всякий случай. TIMSK |= 1 << TOIE2; // Разрешаем прерывание по переполнению return ; } } TIMSK &= ~(1 << OCIE2 | 1 << TOIE2) ; // Запрещаем прерывания таймера 2 ASSR = 1 << AS2; // Включаем асинхронный режим TCNT2 = 0 ; TCCR2 = 5 << CS20; // Предделитель на 128 на 32768 даст 256 тиков в секунду // Что даст 1 прерывание по переполнению в секунду. SetTask(InitASS_Timer) ; // Прогоняем через диспетчер, чтобы зайти снова. }

void InitASS_Timer(void) { if(ASSR & (1<

ISR(TIMER2_OVF_vect) // Прерырвание по переполнению таймера 2 { UDR = i; i++; }

Можно было сделать переменные содержащие часы:минуты:секунды и щелкать этими переменными со всей их логикой переполнения часов/минут, но мне было лень. И так все понятно.

Данные часы с будильником основаны на микросхеме часов реального времени, что позволяет им работать от резервного источника питания при отсутствии основного. Заданное время будильника и режим работы хранится в энергонезависимой памяти микроконтроллера. Режим отображения - 24 часовой. Содержат имитацию «тикания» Индикация времени и режимов работы осуществляется посредством светодиодных индикаторов.

Принцип работы

Основой данных часов является микросхема DS1307 - часы реального времени, обменивающаяся информацией с управляющим контроллером посредством I2C интерфейса. Индикация времени осуществляется через 4 7-и сегментных индикатора, работающих в динамическом режиме. Ввод и корректировка времени осуществляется 5-ю кнопками: "+ минуты", "+ часы", «установка», «будильник» и «сброс». Звуковой сигнал будильника выводится через стандартный пьезоизлучатель и представляет из себя сигнал частотой 1кгц с секундными паузами.

В качестве управляющего микроконтроллера был выбран Atmega48 по причине его доступности и наличии необходимой периферии на борту(даже с избытком). Часы реального времени DS1307 подключены к аппаратным выходам I2C управляющего микроконтроллера. Для работы DS1307 в автономном режиме(в случае отключения питания главного контроллера) используется литиевая батарейка резервного питания на 3V, ресурса которой хватит на несколько лет из-за низкого энергопотребления микросхемы.

Рассмотрим подробнее управляющую программу:

Программа работает по принципу флагово-таймерного автомата: все состояния и события представлены в виде соответствующих флагов, выполняющихся в прерываниях соответствующего таймера 1с, 1мс и 263.17мс. Программа использует 2 аппаратных таймера.

Опрос часовой микросхемы и нажатие кнопок осуществляется с интервалом 263.17мс. Интервал 1мс служит для формирования звукового сигнала звонка, а 1с - для его модуляции. Секундный интервал также управляет миганием точки во 2-ом разряде индикатора, разделяющий часы и минуты и также служащим формированием «тиканья».
Рассмотрим принципиальную схему часов.

Обозначения и номиналы:
S4 - Увеличение часов
S3 - Увеличение минут
S2 - Установка
S1 - Включение будильника
S5 - Сброс

R6-R10 - 10k
R1-R5 - 510ом

Напряжение питания - 5 вольт.

Настройка и использование

Правильно собранные часы в дополнительной настройке не нуждаются. Необходимо лишь установить текущее время и будильник.
Установка текущего времени осуществляется следующим образом:
1) Кнопками S1 и S2 установить текущее время (точка между разрядами при этом не мигает)
2) Запустить часы кнопкой S3
Установка будильника:
1) Нажать S3 и убедиться в том, что загорелась точка в 1-ом разряде
2) Установить время звонка кнопками S1 и S2
3) Включить звонок кнопкой S4
Дополнительные возможности:
Включить тиканье - удерживая S4 нажать S2 до появления характерных звуков. Отключается так-же.
Отображение минут и секунд - удерживая S4 нажать S1. Если после этого нажать S3 произойдёт сброс секунд в 00. Возврат - та-же комбинация.

Фото и видео часов

Часы собраны в корпусе из под нерабочей «электроники».


Недавно спаял схему электронных часов с будильником, выполненных на популярном среди радиолюбителей . В них используется светодиодный индикатор для отображения времени. Мне надоели всевозможные ЖКИ и хочется иметь возможность видеть время из любой точки комнаты в том числе в темноте, а не только прямо с хорошим освещением. Схема содержит минимум деталей и имеет отличную повторяемость.

Схема электронных часов на микроконтроллере

Микроконтроллер является единственной микросхемой, используемой в данном устройстве. Для задания тактовой частоты используется кварцевый резонатор на 4 МГц. Для отображения времени использованы индикаторы красного цвета с общим анодом, каждый индикатор состоит из двух цифр с десятичными точками. Можно применить любые индикаторы с общим анодом, лишь бы каждая цифра имела собственный анод. Чтоб электронные часы были хорошо видны в темноте и с большой дистанции - старайтесь выбрать АЛС-ки чем покрупнее.

Индикация в часах осуществляется динамически. В данный конкретный момент времени отображается лишь одна цифра, что позволяет значительно снизить потребление тока. Аноды каждой цифры управляются микроконтроллером PIC16F628. Сегменты всех четырех цифр соединены вместе и через токоограничивающие резисторы R1 … R8 подключены к выводам порта МК. Поскольку засвечивание индикатора происходит очень быстро, мерцание цифр становится незаметным.

Для настройки минут, часов и будильника - используются кнопки без фиксации. В качестве выхода для сигнала будильника используется вывод 10, а в качестве усилителя - каскад на транзисторах VT1,2. Звукоизлучателем является пьезоэлемент типа ЗП. Для улучшения громкости вместо него можно поставить небольшой динамик. Питаются часы от стабилизированного источника напряжением 5 вольт. В часах реализовано 9 режимов индикации. Переход по режимам осуществляется кнопками "+" и "-". Перед выводом на индикацию самих показаний, на индикаторы выводится короткая подсказка названия режима. Длительность вывода подсказки примерно секунда.

Кнопкой "Коррекция " часы переводятся в режим настроек. При этом кратковременная подсказка выводится на пол секунды, после чего корректируемое значение начинает мигать. Коррекция показаний осуществляется кнопками "+" и "-". При длительном нажатии на кнопку, включается режим автоповтора, с заданной частотой. Все значения, кроме часов, минут и секунд, записываются в память и восстанавливаются после выключения питания. Если в течение нескольких секунд ни одна из кнопок не нажата, то электронные часы переходят в режим отображения времени. Нажатием на кнопку "Вкл/Выкл " включается или выключается будильник, это действие подтверждается коротким звуком. При включенном будильнике светится точка в младшем разряде индикатора. Вот прошивка и рисунок платы часов.

Загрузка...