Простые часы на attiny 2313

Простые часы на микроконтроллере Attiny2313. Схема и описание

Наверное, даже не просто простые часы на микроконтроллере, а даже очень простые. Этот проект на микроконтроллере Attiny2313 наверно можно назвать проектом одного  дня, поскольку на создание данных часов с начало и до конца ушло чуть больше одного дня.

Для создания данных часов нам понадобятся:

  • Кварцевый резонатор на 16 МГц – 1 шт;
  • Микроконтроллер Attiny2313 -1 шт;
  • Конденсатор от  22 пф до 27 пф –  2 шт;
  • Конденсатор 220 н –  1 шт;
  • Стабилизатор 7805 – 1 шт;
  • Транзистор КТ817Б – 4 шт;
  • Индикатор SA15-11GWA  – 4 шт  ( можно любой другой с общим анодом);
  • Кнопка – 2 шт;
  • Резистор  100 Ом – 8 шт;
  • Резистор  200 Ом – 4шт;
  • Резистор  10 кОм – 1 шт.
  • Питание осуществляется от простого надежного стабилизатора на LM317.

Описание работы простых часов на Attiny2313

Микроконтроллер Attiny2313 тактируется кварцевым резонатором с рабочей частотой 16 МГц. В качестве счетчика времени, в схеме  микроконтроллера Attiny2313 запущен 16 битный таймер с предделителем 256, сконфигурированный на создание прерывания по достижении счетчиком значения 625. Следовательно, получилось прерывания 100 раз в секунду.

Временной интервал находится в глобальных переменных, и при каждом прерывании необходимо увеличить значение  миллисекунд на 1. В том случае если число миллисекунд доходит до 100, то необходимо увеличить на 1 величину секунд, а величину миллисекунд сбросить.

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

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

Поскольку количество портов микроконтроллера не так много, то используем такую особенность зрения как инерционность.

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

Быстро переключая порт B микроконтроллера, к которому подключены катоды и быстро переключая аноды,  можем организовать видимость, что отображаются все 4 цифры, несмотря на то, что единовременно работает всего лишь одна.

Другими  словами, если текущее время 10:43, то выводим цифру 1 на первый индикатор часов, через небольшой интервал времени (порядка 1 мс) выводим цифру 0 на второй индикатор, через 1 мс отображаем 4 на 3 индикатор, спустя 1 мс отображаем 3 на 4 индикатор и снова по кругу.

Кнопки управления часов опрашиваются после каждого очередного цикла отображения (приблизительно 40 раз в секунду), процесс нажатия кнопок снабжен антидребезгом и  защелкой  в виде флага, что позволяет считать собственно само нажатие, не отвлекаясь на удержание.

Скачать печатку, файл прошивки и исходник (1,2 Mb, скачано: 6 049)

Источник: http://www.joyta.ru/3283-prostye-chasy-na-mikrokontrollere-attiny2313/

Часы за два дня на attiny2313 и ds1307

Начну с того, что каждый человек живёт во времени, которое, к огромному сожалению, не возможно остановить. И раз мы живём в этом мире, то давайте следить за временем и не упускать ни минуты, тратя её впустую. Для этого я и сделал это чудесное устройство, по имени часы.

Начнём!

На улице встало солнце, я нарисовал плату и почесал на ксерокс, дабы напечатать плату

Дальше те, кто знают как изготавливаются платы поймут, что я перевёл рисунок утюгом на текстолит, протравил, залудил и т.д., а те, кто не в курсе — почитайте в интернете про изготовление плат методом ЛУТ — (Лазерно-утюжная технология).
результат я заснять забыл, но думаю, что качество будет видно и на готовой плате:

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

  • AtTiny2313 — 8ми битный микроконтроллер
  • ds1307 — микросхема-счётчик с неплохой точностью
  • часовой кварц на 32.768кГц
  • 2 резистора на 10 КОм
  • 7 резисторов на 10 Ом
  • 1 резистор на 5.2 КОм
  • 4 резистора на 1 КОм
  • 4 транзистора КТ315 (их современные братья)
  • буззер на 5 вольт
  • 2 тактовые кнопки (угловой монтаж)
  • 4 индикатора (10011-BSR) общий анод
  • тантал на 47 микрофарад
  • и гнездо питания и угловым креплением (диаметр отверстия — 5.1мм, диаметр центр. контакта — 1.5мм)

И пускай вас не смущает длина этого списка, ведь мы собираем устройство на долгие года, и оно должно быть собрано на должном уровне!
Кто желает посмотреть на плату с другой стороны, вот фото:

Программа

Как и все устройства, часы нуждаются в программе. В данном случае программа написана на языке BASIC в BASCOM AVR.

Этот язык очень удобный для программирования, так как код понятный, эффективный и занимает не много места на микроконтроллере.

Писать программу с ноля я не стал, а взял исходник одной статьи сайта паяльник. Кто интересуется — найдёт, я же просто оставлю доработанный мною код тут:

$regfile = “attiny2313.dat”
$crystal = 8000000 Dim Count As Byte
Dim Number(4) As Integer
Dim Pointmem As Byte
Dim Point As Bit
Dim Mine As Byte
Dim Hour As Byte
Dim Seco As Byte
Config Porta.1 = Output
Porta.1 = 1
Waitms 10
Porta.1 = 0
Waitms 70
Porta.1 = 1
Waitms 10
Porta.1 = 0
Config Portb = Output
Config Porta.0 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.6 = Output
Config Sda = Portd.5
Config Scl = Portd.4
Config Pind.0 = Input
Portd.0 = 1
Config Pind.1 = Input
Portd.1 = 1
Config Timer1 = Timer , Prescale = 64
On Timer1 Awake:
Config Timer0 = Timer , Prescale = 64
On Ovf0 Refresh
Dig1 Alias Porta.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.3 : Dig4 Alias Portd.6
Enable Interrupts
Enable Ovf0
Enable Timer1
Start Timer1 Hour = 0
Mine = 0 If Pind.1 = 0 And Pind.0 = 0 Then
Porta.1 = 1
Waitms 100
Porta.1 = 0
Hour = 0
Mine = 0
Seco = 1 Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Waitms 1000
Porta.1 = 1
Waitms 10
Porta.1 = 0
End If Do
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour) If Seco = 80 Then
Seco = 10
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
End If If Hour > 9 Then
Number(1) = Hour / 10
Number(1) = Abs(number(1))
Else
Number(1) = 20
End If Number(2) = Hour Mod 10 If Mine > 9 Then
Number(3) = Mine / 10
Number(3) = Abs(number(3))
Else
Number(3) = 0
End If Number(4) = Mine Mod 10 If Pind.1 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Mine = 59 Then
Mine = 0
Else
Incr Mine
End If Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Else If Pind.0 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Hour = 23 Then
Hour = 0
Else
Incr Hour
End If
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
End If
End If Waitms 250
Loop Awake:
If Point = 1 Then
Porta.1 = 1
Waitus 10
Porta.1 = 0
End If
Toggle Point
Return Refresh:
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr Count : If Count > 4 Then Count = 1
If Count = 2 And Point = 1 Then
Pointmem = Number(2) + 10
Portb = Lookup(pointmem , Digits)
Else
Portb = Lookup(number(count) , Digits)
End If
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
End Select
Return Digits: Data &B00101000 , &B01111011 , &B00110100 , &B00110010 , &B01100011
Data &B10100010 , &B10100000 , &B00101011 , &B00100000 , &B00100010
Data &B00001000 , &B01011011 , &B00010100 , &B00010010 , &B01000011
Data &B10000010 , &B10000000 , &B00001011 , &B00000000 , &B00000010
Data &B11111111

Прошиваем почти 2 килобайта кода в мк и наблюдаем как только-что ожившее устройство начало служить человеку. Чесно сказать, я испытываю невероятное удовольствие от того, что могу создать нечто такое, что для многих далёкое и не понятное)

Так выглядит устройство без корпуса, корпус буду делать после написания статьи:

И так, часы готовы, а как они работают? Это я демонстрирую в первой половине этого видео (не прошу подписки или чего-то ещё, просто материал)

Читайте также:  Простой внутрисхемный программатор

Заключение

Таким образом, за 2 дня я сделал устройство, которое покажет мне, сколько мне осталось заниматься одним делом и переходить к другому, когда пора идти, или начать что-то важное.
Ну а на этом всё, спасибо тем, кто дочитал до конца, успехов вам в ваших проектах, и как говорится: «треска вам, 47, и до встречи на других частотах! QRZ..»

Источник: http://www.pvsm.ru/svoimi-rukami/113668

Часы для мотоцикла “Simple”: LED + Attiny 2313 + DS1307

Большой сказ о том, как Серж велосипед изобретал часы делал, без кукушки, увы.

Большие корпорации жадные. Очень. Это аксиома.

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

Если помните СССР, то там на производстве постоянно вносились “рацухи”, которые позволяли высвободить N человеко-часов или сэкономить пять болтов М6 при строительстве комбайна Дон.

Так он легче станет на 125 граммов, а в масштабе страны можно будет пуд или два железа сэкономить! Тому кто подал и внедрил – полагалась денежная премия (в доле с начальником, конечно), а самым упоротым настойчивым удавалось получить авторское свидетельство и даже отжать у государства какое-то небольшое бабло.

Но я отвлекся. Инженеры Yamaha (Ямаха кабусики гайся, епрст!)создали прекрасный легкий мотоцикл YBR125. Этот драндулет нетороплив и вечен, (но при этом и своенравен!) как воды Тэнрю-гава.

При попутном ветре и тощей жопе наездника он вполне может разогнаться до 100 км/ч! Оснастили инженеры этот дришпак двигателем, колесами, тормозами, спидометром и даже рулем, но пожадничали на часы.

Раз ты такой не быстрый, значит и не спешишь, а раз не спешишь, тогда зачем тебе вообще часы? Да и вряд ли ты на ЭТОМ поедешь в закат, а в городе и на столбах часы есть.

Вообще, видно, что экономили японцы на всем как умели, спасибо что моторесурс оставили.

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

Все началось с переходника, кои у меня валялись после изготовления платы металлоискателя.

Заготовка

Именно он попался мне на глаза первым и он стал первым камнем в фундаменте будущих часов.

В переходнике есть место для монтажа микроконтроллера в корпусе SO20 и разводка его ножек на две ряда штырей с шагом 2,54 мм для имитации корпуса DIP20 плюс место для нескольких блокировочных конденсаторов по питанию. В отверстия для штырьков очень хорошо встал четырехразрядный сверхъяркий LED-индикатор (c общим анодом).

Других четырехразрядных индикаторов у меня нет.

Имея базу, стал размышлять дальше, накидывая в блокноте идейки и очертания будущего ТЗ. Питание 12-15В. Контроллер ATTiny 2313 в SO20 – некоторые подозрительные экземпляры, отбракованные мной с рабочих приборов по признаку глюкавости, вполне исправно дергают ногами в моих игрушках.

И тактовую частоту в 12 мГц вполне держат, пробовал. Видно, те сбои зависят от полноты использования флэша или EEPROM.

Автономным часам нужна крепкая память – отсюда появилась необходимость пригласить в конструкцию микросхему RTC – RealTimeClock. Собственно она и есть Главная Хранительница Времени, а процессор лишь иногда обращается к ней по шине i2c с вопросом “Который час, ваше Высочество?”, и получив цифры, спешит выплюнуть их на дисплей. Из имеющихся RTC доступной оказалась DS1307.

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

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

Любые RTC требуют двух важных компонентов, источника дежурного питания и кварца. С кварцем все понятно, ей нужен часовой, 32768 Гц, качественные образчики которых в изобилии попадаются на материнских платах – маленький цилиндрик рядом с батарейкой это он. А вот трехвольтовая батарея типоразмера 2032, это  #бандура и #дичь!

Чертеж литиевого элемента 2032

Холдеры

И так немаленькая блямба, с держателем B или D разрастается до совершенно недопустимых величин, а я все же хотел остаться в габаритах базового “бывшего переходника”. А без держателя таблетку ставить не стал, ибо ненадежно.

Батарейка не влезает!!!

Удалось спереть найти батарейку CR1225, она заметно поменьше и отлично входит в габарит корпуса вместе с держателем. Да, емкость меньше, всего 50 мА·ч, против 225 мА·ч, но даже если ее хватит только на год, я удовлетворюсь. Подпитка памяти микросхемы DS1307 требует  наноампер, так что срок службы  “таблетки” скорее сведется к саморазряду.

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

Нет, я конечно могу (самообразования для) поковырять чужой код или посношаться с таймерами и предделителями. Но в данном случае сношения излишни.

Старина Гугл по запросу %часы% %конфигурация “железа”% четко выдает подходящие мне конструкции пачками, только выбирай. А я еще и не брезглив.

Схема
Фьюз-биты

Недостатки у схемы, конечно же, есть: 1 – общие аноды подключены напрямую к процессору без внешних ключей (перегружаются четыре ноги проца), 2 – установка времени через целых две кнопки, олдскульно, но вполне достаточно одной, 3 – нет функции даты, а ее, с учетом возможностей RTC, довольно легко организовать программно (но при этом сильно нагромоздится управление, что нехорошо!), 4 – 7805 это самый мой страшный сон, греется, а с учетом внешнего  питания 14-15В оно еще и сильно греется, 5 – нет “железных” подтяжек на VCC с портов кнопок. В общем, часы делал любитель с уклоном в программизм. Тем не менее, конструкция выглядела работоспособной и удовлетворяла моим требованиям.

Прошил я прошивкой №3 “ОА с коррекцией” тиньку и отложил ее в сторону. После чего запаял индикатор, и, перерезая лишние соединения ножиком, и, наводя новые проводом МГТФ-0,07, привел “переходник” к схеме часов, соединив нужные ноги тиньки с нужными ногами индикатора, не забывая ставить резисторы типоразмера SMD 0603 на катоды сегментов. Сделав это, накинул процессор на место.

Понадобилась еще одна плата. На ней я разместил стабилизатор LM2940 (та же кренка, но LDO, ставить ее было удобнее из-за корпуса ТО263), RTC DS1307, ее кварц и батарейку. 

Первые испытания

Эту плату вырезал по размеру переходника из стеклотекстолита и вырезал нужные соединения ножиком. Соединив платы электрически, залил их лаком и слепил на двухсторонний скотч, обработав стык герметиком. Да, кнопки. 

Поставил кнопки

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

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

Режим компенсации ухода вызывается по нажатию двух кнопок одновременно и дает поставить величину ухода в секундах, именно на эту цифру будет изменяться показания часов каждые 22:00, при условии что процессор в это время будет запитан от бортсети, что вовсе необязательно.

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

Работаю над корпусом

Из остатков крышки какого-то ноута выпилил торцы корпуса, слева вывел провод питания, справа – толкатели кнопок. Бутерброд из плат вклеил на двухсторонний скотч в нижнюю половину, выровнял верхнюю и на эпоксидку наклеил торцы корпуса.

Несмотря на тщательную подготовку поверхностей, адгезия смолы к пластику вызывает у меня недоумение. Щели между верхней и нижней половинами корпуса залил, опять же, герметиком (этот липнет ко всему и засыхает намертво). А, еще момент.

Крепление на руль сделано из клипсы для водопроводной пластиковой трубы, ПП-труба 20 мм, а руль 22 мм – защелкиваются часы на руле прочно, не шевелятся даже.

Питание на часы должно подаваться по задумке с кнопки габаритов, но я не выдержал, сделал им временную запитку от АКБ через выключатель, заодно поставив рядом модуль вольтметра с алиэкспресса (были у меня вопросы к состоянию АКБ и генератора). Массу взял все там же, с руля, подсунув латунный лепесток в клипсу на руле.

одна цифра потому что выдержка короткая, а индикация динамическая

Что же, теперь я с часами.

Стоило ли столько ковыряться, спросите вы? Да, повозиться пришлось, больше всего сил ушло чтобы сделать монолитный и, наверное, герметичный “батончик” и еще больше времени, чтобы оформить все сделанное в виде поста, который вы  сейчас прочли. У китайцев, наверняка, такие часы продаются в готовом виде, но разве это путь самурая? Терпение и смирение – вот наши главные помощники, а дорога в тысячу ли всегда начинается с первого шага.


***

Труд не напрасен,Если душу ты вложишь.

Иначе он мёртв.

Источник: http://electroforpeople.blogspot.com/2017/07/simple-led-attiny-2313-ds1307.html

Часы LED-ATtiny2313-DS1307

Источник: http://c2.at.ua/publ/skhemy/chasy_led_attiny2313_ds1307/1-1-0-29

Часы на ATtiny (с печатной платой)

Источник: http://radiogid.ucoz.ru/publ/skhemy/mikrokontrollery/chasy_na_attiny_s_pechatnoj_platoj/9-1-0-832

LED часы на Attiny2313 и DS1307

Ну собственно сложностей при сборке часов возникнуть не должно. И так, принципиальная схема часов:

И так, составим список что нужно для сборки часов:

1. Микроконтроллер Attiny2313 (с любыми буквенными индексами, в DIP корпусе) – 1шт.
2. Микросхема DS1307 (в DIP корпусе) – 1шт.
3. Панелька DIP-20 – 1шт.
4. Панелька DIP-8 – 1шт. 
5. Часовой кварц на 32768 Гц – 1шт.
6. Пенал для двух пальчиковых батареек типа AAA – 1шт.

7. Пальчиковые батарейки 1,5v AAA – 2шт.
8. Резисторы 4,7 кОм – 2шт.
9. Резисторы 1 кОм – 4шт.
10. Резисторы 10 кОм – 3шт.
11. Резистор 150 Ом – 1шт.
12. Резисторы 10 Ом – 7шт.
13. Транзисторы КТ315 – 4шт.
14.

Семисегментные индикаторы REC-S12101AG с общим анодом – 4шт.
15. Конденсатор электролитический 100 мкф – 1шт.
16. Конденсатор керамический 100 нф – 1шт.
17. Кнопки тактовые, без фиксации – 2шт.
18. Корпус пластмассовый (по желанию) – 1шт.
19. ИБП RS-25-5 – 1шт.
20.

Сетевой шнур с вилкой – 1шт.
21. Текстолит (для ПП)

Собрал я всё на печатных платах, семисегментные индикаторы разместил на одной плате, всё остальное на другой. Платы лудил сплавом розе и в конце покрывал цапон лаком. Печатные платы делал с помощью ЛУТа. Чертил в программе Sprint Layout 4.0. Вот фото платы с семисегментными индикаторами:

Платы вместе соединял шлейфом, вот так:

В ход можно пустить компьютерный IDE шлейф. Вот фото основной платы:

Обратите внимение, что корпус часового кварца нужно соединить с минусом питания, это позволяет избежать сбоев и внешних помех. Всё поместил в корпус, вот что получилось:

Как вы уже заметили внутри корпуса я закреплял всё с помощью термо клея. После сборки часов необходимо прошить микроконтроллер  прошивкой ClockFirmware.HEX. Как прошить микроконтроллер и сделать программатор я писал тут и тут. После прошивки не забудьте установить следующие фьюз-биты:

Для программы SinaProg:

Я прошивал микроконтроллер с помощью программатора USBtiny и программы SinaProg. Программу (прошивку) для часов писал в среде BASCOM-AVR, исходник прилагается. У меня часы работают уже почти неделю и не на секунду не отстают. Точность хода часов зависит от кварца, его лучше купить новый.

Яркость часов зависит от резисторов R1-R8, чтобы уменьшить яркость увеличьте сопротивление этих резисторов, но следует учесть, что резисторы необходимо ставить с сопротивлением не меньше 10 Ом а резистор R3 не менее 100 Ом.

 При первом включении часов либо после смены батареи резерного питания, зажмите обе кнопки S1, S2 и включите часы. Часы сбросятся на 00:00 и начнут идти.

Кстати, ночью часы смотрятся просто отлично:

Источник: http://kibermedved.at.ua/load/led_chasy_na_attiny2313_i_ds1307/1-1-0-2

Часы с термометром на микроконтроллере

ПодробностиКатегория: МикроконтроллерыОпубликовано 15.06.2016 13:34Автор: AdminПросмотров: 1377

Простые часы с термометром на микроконтроллере AVR ATtiny2313 с выводом информации на семисегментный индикатор. Часы используют для отсчета времени микросхему DS1307 – часы реального времени и источником резервного питания в 3 В. Температура измеряется при помощи датчика температуры DS18B20.

 Текущее значение времени и температуры происходит поочередно сначала время а потом температура с нтервалом в 4 секунды. Формат отображения времени ЧЧ.ММ (часы,минуты). Первый ноль не отображается. О ходе отсчета времени сигнализирует мигающая точка.

 Точность отображения температуры составляет десятые доли градуса. Погрешность в интевале температуры от -10 до 85 градусов составляет порядка +/- 0.5. В другом диапазоне точность уже +/- 2 градуса.

Температура замеряется 1 раз в минуту. Измеренное значение отправляется в память контроллера в которой может хранится пять послених измеренных значения.

Измеренная температура округляется до целого значения.

На дисплее имеются специальные символы повашения температуры (стрелка вверх) и понижения температуры (стрелка вниз), которые показывают как изменилась температура повисилась она или понизилась.

 Если нажать на кнопке “меньше” то на дисплее сразу отобразится время.

Если кнопку “больше” то отобразится температура последнего измеренного значения и начнется новый процесс измеерения температуры и новое значение отобразиться на дисплее в этом случае точность составит десятые доли и в таком формате будет отображатся в течении минуты. Если датчик температуры неисправен или отсутсвует подключение то будет оторажаться только время.

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

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

Прошивка для микроконтроллера

В архиве имеются файлы Proteus и сама прошивка написана на ассемблере. Прошивка может работать для двух вышеприведенных схем, для схемы с индикатором с общим катодом и схемы индикатора с общим анодом. При прошивке микроконтроллера важно выствыить fuse-биты: CKSEL3, CKSEL1, CKSEL0, SUT0, BODLEVEL1, BODLEVEL0.

Скачать: прошивка микроконтроллера

Вход в режим усановки времени осуществляется нажатием и удерживанием кнопки “ввод”. После того как пройдет 3 секунды начнется режим установки минут. Для того чтобы устаноыить новое значение времени нужно использовать кнопки “больше” и “менеше”.

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

Если после этих всех операций в течении 10 секунд не будет нажата какия нибудь кнопка то часы перейдут в рабочее состояние и новое значение времени не будет сохраненно.

Для устройства необходимы две печатные платы из одностороннего стеклотекстолита который имеет размеры 50 на 100 мм, на одной плате устанавливаются индикатор с кнопками, а на другой сами часы. Равзодка платы в формате SpringLayout.

Индикатор или дисплей собран на двух семисегментных индикаторах FYD-8021BS-11, каждый имеет 2 разряда и имеют общий анод.

Вместо указаных на схеме вернхних включающих транзисторов платы можно использовать другие к примеру KT361B.

Исходник статьи: Часы-термометр

Источник: http://www.radio-magic.ru/microcontrollers/376-chasy-s-termometrom

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}
Источник http://radiokot.ru

Автор vitalyadm

В своей конструкции я использовал индикатор фирмы «Kingbright» с общим катодом, хотя можете использовать и с общим анодом, 

прошивку прилагаю на оба вида индикаторов.

Сопротивления сегментов (270 Ом) можно использовать другие, в зависимости от желаемого уровня свечения, но не меньше 120 Ом. 

Подтягивающие резисторы 100 кОм могут варьироваться в пределах 10 кОм…100 кОм, смотря что есть под рукой. 

Кварц обычный «часовой кварц» (он кстати так и называется), если закончились в магазине можете выпаять из любых китайских стрелочных часов. Батарейка резервного питания «CR2032», при использовании новой- года 3 вам часы устанавливать заново точно не потребуется.

   Светодиод не несёт особого смысла, просто оставалась свободная лапка, поэтому единственное что он делает- так это загорается при переходе на каждый новый час на 15 секунд. 

Входной диод на 78L05 предназначен для защиты- номинал любой, я ставил 1N4007. 

Сердцем устройства является МК «AТtiny2313». 

Печатная плата в моём варианте имеет размеры 53 х 60, изготавливал её при помощи обычного «утюжного» способа.

Для питания готовой конструкции использую зарядку от умершего своей смертью телефона Siemens, подойдёт любая с выходным напряжением больше 5 вольт. 

Очень удобно, во первых- готовый БП, во вторых- малый ток потребления, да и размер что надо.

Теперь непосредственно по работе. После подачи напряжения загорается сегмент G первой цифры и в стиле бегущего огня доходит до последней. В этот момент МК проверяет- не было ли замены батарейки и идут ли часы. Если была замена, то МК выставляет текущее время- 16:23:00, соответственно вам нужно сменить его на реальное текущее.

 Коррекция времени осуществляется нажатием и удержанием необходимой кнопки (часы или минуты), алгоритм коррекции: текущее значение + 1, если больше максимально возможного = 0.

 Считывание значений текущего времени с DS- ки происходит приблизительно с интервалом 2 секунды. Время отображается в формате 24 часа, часы минуты разделяются мигающим двоеточием.

Несколько если:

Если точность хода страдает- выкиньте кварц и поставьте новый.

Если будете разводить печатную плату по своему усмотрению- дорожки идущие от кварца к ножкам DS- ки делайте максимально короткими.

Если вместо цифр у вас какая- то непонятность, а при запуске сегмент G появляется правильно- смените батарейку.

Схема

Fuse.

Архив файлов; схема, прошивки ОА и ОК, исходник, печатная плата.

Источник: http://radiokot.ru/forum/viewtopic.php?p=787731#p787731

Даже наверное не просто простые, а супер простые. Данный проект на микроконтроллере можно назвать проектом выходного дня, так как на разработку и создание этих часов с нуля ушло 1,25 дня, а учитывая, что у вас будет под рукой готовый код, то вы управитесь быстрее.

 

Нам понадобятся: Кварцевый резонатор на 16 МГц, микроконтроллер ATTINY2313, 2 кнопки, 2 конденсатора на 22 пф, конденсатор на 220 нф, линейный стабилизатор питания 7805, 4 транзистора КТ817Б, ну и четыре семисегментных светодиодных индикатора, у меня это SA15–11GWA (высота цифр 38 мм) и горстка резисторов.

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

Отечественные транзисторы пришлось использовать, поскольку под рукой ничего другого не было, если бы была возможность выбирать, то я бы поставил полевые транзисторы.

Итак, имеющиеся компоненты: Микроконтроллер обошелся в 41 руб, индикаторы по 52,8 руб за штуку. Всего получается 252,2 руб. Остальное было извлечено из запасов, но в любом случае бюджет бы не превысил бы 300 рублей.

Микроконтроллер тактируется кварцем с частотой 16 МГц. В качестве счетчика времени, внутри микроконтроллера запущен 16 битный таймер с предделителем 256 (т.е. частота отсчетов таймера 62500 Гц), настроенный на создание прерывания по достижении счетчиком значения 625. Таким образом, мы получаем прерывания ровно 100 раз в секунду.

Значение времени хранится в глобальных переменных, и каждое прерывание мы увеличиваем значение миллисекунд на 1. Если количество миллисекунд достигает 100, то мы увеличиваем на 1 значение секунд, а значением миллисекунд сбрасываем. И так далее вплоть до десятков часов, которые сбрасываются по достижении 24 без увеличения следующего разряда.

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

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

Быстро переключая порт B, к которому подключены катоды и быстро переключая аноды мы можем создать видимость, что у нас работают все 4 цифры, хотя единовременно работает только одна.

Иными словами, если текущее время 12:51, то мы выводим цифру 1 на первый индикатор, спустя малый промежуток времени (у меня 1 мс) выводим цифру 2 на второй индикатор, спустя 1 мс выводим 5 на 3 индикатор, спустя 1 мс выводим 1 на 4 индикатор и так далее по кругу. Кнопки опрашиваются после каждого цикла отображения (примерно 40 раз в сек), обработка нажатия снабжена антидребезгом и «защелкой» в виде флага, что позволяет считать именно нажатия не отвлекаясь на удержание.

Листинг:

/***************************************************** This program was produced by the CodeWizardAVR V1.25.7 beta 5 Professional Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Simple AVR Clock Version : Date : 01.05.2008 Author : Spiritus Sancti Company : licrym.

org Comments: Chip type : ATtiny2313 Clock frequency : 16,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/ #include #include #define digit_display_time 1 unsigned char milliseconds, seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours; bit button_pressed1, button_pressed2; // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Прерывание происходит 100 раз в сек, сохраняем в глобальные переменные текущее время { milliseconds++; TCNT1H=0x00; TCNT1L=0x00; if (milliseconds >= 100 ) { milliseconds = 0; seconds++; }; if (seconds >= 10) { seconds = 0; ten_seconds++; }; if (ten_seconds >= 6) { ten_seconds = 0; minutes++; }; if (minutes >= 10) { minutes = 0; ten_minutes++; }; if (ten_minutes >= 6) { ten_minutes = 0; hours++; }; if (hours >= 10) { hours = 0; ten_hours++; }; if (ten_hours >= 2 && hours == 4) { ten_hours = 0; hours=0; }; } void main(void) { unsigned char digits[10] = {18, 159, 56, 28, 149, 84, 80, 31, 16, 20}; //массив для генерации цифр. Какой элемент массива будет отправлен в порт, такая цифра и загорится. // Crystal Oscillator division factor: 1 CLKPR=0x80; CLKPR=0x00; // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF; DDRB=0xFF; // Port D initialization // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In // State6=0 State5=0 State4=0 State3=0 State2=0 State1=P State0=P PORTD=0x03; DDRD=0x7C; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 62,500 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x02; OCR1AL=0x71; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // Global enable interrupts #asm(“sei”) while (1) { PORTD |=1