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

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

Видно места, которые не взялись, но ничего страшного не случилось, отстал только полигон.
Дальше нужно было запаять компоненты, на которых я особо останавливаться не буду, только оставлю их список:
- 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..»