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

    Мотив


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

    Начнём!


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

    image

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

    image

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

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

    image

    Программа


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

    image

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



    Заключение


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

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 28

      +5
      Что-то ни схемы, ни разводки платы не видно.
      Среда разработки не указана (на самом деле — Bascom-AVR), комментариев к коду нет, даже отступов нет.

      47, и до встречи на других частотах!

      Может, все же 73?
        0
        Может человек пока писал то облизывался на ГУ-47 :)
          –1
          Вам нужна схема на подобный девайс? Сложности в этом абсолютно нет.

          Очень даже вероятно, что все описанное вами автор где-то позаимствовал, переписав на бесик код. А значит гугль запросто поможет найти.
            +2
            Да если передрал то простительно, вообще нынче изобрести что-то новое уже сложновато, да и смысл что-то изобретать в подобных часах когда есть испытанные временем классические схемы?

            Автору намекнули что его статья не несёт смысловой нагрузки — без указанных компонентов. В данный момент выглядит не чем не лучше к примеру этого https://geektimes.ru/post/271712/

            А так чего, увлёкся электроникой, травит платы сам, паяет а не собирает из кубиков готовых, респект.

            К слову упоминание 47 и QRZ немного не к месту, а 47 ещё и не из той оперы :)
          +5
          Я кончено извиняюсь, но для чего вы написали эту статью? Ни схем, ни инструкций. Пара фоточек + портянка чужого кода. Что мы должны отсюда вынести? Какой вы молодец?
          ps. И зачем хаб Arduino?
            +1
            Автору 15 лет. Для такого возраста например качество изготовления печатной платы и монтажа — выше всяких похвал. То, что устройство скопировано, включая код — не проблема. Сегодня скопировано, завтра усовершенствовано, послезавтра — разработано с нуля. Из такого энтузиаста уже через 3 года (то есть уже на 1-2 курсе) может получиться специалист лучше, чем 90% окончивших институт бездельников и балаболов. Так что автор действительно молодец.
              +4
              да нет, я не спорю, автор молодец (я вот так не умею делать). Но… зачем это на хабр?
                +3
                Эх, жалко, что в мои 15 лет не было хабра, тогда бы я тоже запостил, как делал цветомузыку на ОУ 140УД8 и тиристорах, а платы рисовал лаком для ногтей с помощью иголки…
                  +1
                  Забыл про то как лампочки цапонлаком красили :)
                    +1
                    Точно! Было дело, но они выгорали быстро, поэтому я нашел стекла от светофора и вставил в тракторные фары. Вот это было диско!
              +3
              Если у Вас индикаторы с общим анодом управляются npn-транзисторами (ссылка на КТ315) — значит эти транзисторы включены по схеме с ОК (то есть аноды индиаторов в эмиттерной цепи). А это в свою очередь означает, что напряжение питания недоиспользуется на величину падения Uбэ (порядка 0.7 В).

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

              Яркость же свечения индикаторов можно увеличить, либо управляя их общими цепями pnp-транзисторами, включив их по схеме с ОЭ (эмиттером на плюс, в коллекторе — общий анод) — будет ярче, т.к. Uкэ < Uбэ для насыщенного транзистора, либо вообще поставив p-канальные logic-level полевики (на параметры порядка 20В, 1А и каких-нибудь 20-50 миллиом канала — стоят копейки)

                0
                … только надо конечно не забыть программно проинвертировать выходы Dig1 — Dig4
                  0
                  Их номинально питание ниже 5 вольт, поэтому падение на транзисторе и на резисторах вместе делают своё дело, не давая перегорать индикаторам. А светят более даже чем ярко, ночью иногда выключаю, так как всю комнату видно)
                    0
                    У (свето)диодов не может быть "питание в вольтах" — у них может быть только "ток в амперах", так как ВАХ у них очень крутая — дельта-U в пределах 20-30 милливольт может дать дельта-I в 80-100 миллиампер, а нормируется именно рабочий ток, от которого зависит яркость свечения.

                    В режиме динамической индикации яркость зависит от среднего тока через сегмент, который в Вашем случае в 4 раза меньше импульсного — поэтому схема раскачки сегментов должна иметь запас по пиковому току — иначе яркости может не хватить. Если Вам хватает — значит индикатор с высокой светоотдачей, и тогда можно ничего не переделывать (ну разве что в порядке эксперимента)

                    То, что легко можно сделать дальше самому — это прицепить фоторезистор, опрашивать его свободным выводом tiny (в режиме АЦП, либо измерением времени разряда конденсатора через фоторезистор до переключения логического входа), усреднять по времени, и регулировать яркость изменением скважности анодных импульсов в процедуре Refresh
                  +1
                  Часы — непременный этап :) Мои первые были на дискретной логике, добытой из самых разных девайсов (в основном из остатков каких-то ракет, вроде бы "воздух-земля") :) Тогда еще не было микроконтроллеров, и даже простейшие микросхемы (любые) в наших краях нужно было доставать по блату, т.к. купить было негде :) Был, правда, Посылторг, но в нем особого разнообразия не наблюдалось...
                    0
                    только оставлю их список

                    Для полноты не хватает уточнить размер индикаторов и итоговую стоимость.
                      0
                      Да, нужно добавить. Заодно и схему и разводку оставлю, народ негодует)
                        +2
                        Да не будет этот народ вашу схему повторять, хоть пари заключай…
                        А схем часов и так навалом, тем более на столь древнем популярном контроллере.
                      0
                      Помню, в радиокружке собирал, и железо было тем же самым). Только на ассемблере, и вручную приходилось общаться с часами,
                      а для отладки протокола написал даже примитивный логический анализатор, работающий через Com порт, и рисующий осциллограмму логическую сигналов..
                        +2
                        Что мне делать? С одной стороны я не хочу такое видеть на хабре, с другой стороны минусовать молодежь не хочется...
                          0
                          Пусть будет, от GT не убудет а человек получит обратную связь и в следующий раз оформит статью хоть по нормальному.
                          А минусовать это самый плохой вариант выразить своё «Фиии», коммент в этом случае более эффективный метод.

                          Ну а что видеть и не видеть это уже задача мадераторов и адиминов :)
                            0
                            может быть DIY расщеплять надо — "для чайников"/"моя первая поделка" и суровый донецкий с термоядом и электронными микроскопами?
                            и да — пусть парень не просто получит обратную связь но и полновесный аккаунт на GT, тоже дело...
                              0
                              Если делать "Подхаб", то придется запретить указывать в статье любые другие хабы DIY или Сделай сам, Arduino и прочее. Новичок будет не "в курсе" такого нюанса. И статьи всё равно будут там появляться. Логичнее сделать отдельный суровый хаб, но там тоже вопросы, что "достойно" там быть.
                            +1
                            Я бы взял STM32F030F4P6. У него есть часы с календарем в виде встроенной периферии, больше ножек, меньше размер, и, что самое смешное, он в несколько раз дешевле. И ещё он позволит прикрутить к часам кучу всего, от термометра до синхронизации по GPS.
                              0
                              Только вы забываете, что для attiny плату делать — это отдых: напечатал, прикатал, отодрал, вытравил, запаял любым паяльником.
                              А вот с stm с шагом 0,5 мм это уже не отдых, так что думаю 15 летнему пареньку лучше на тиньках начинать.
                                0
                                По себе понял, что начинать надо сразу с более-менее сложного. Наломаешь в процессе и дров, и оборудования, но научишься быстрее и лучше.
                                А если какие-то проблемы с пайкой (чего при использовании флюса ЛТИ-120 не наблюдается вообще), можно купить переходник TSSOP-DIP.

                                В любом случае желаю не останавливаться на достигнутом, обвешать устройство новым функционалом, упереться в аппаратные ограничения контроллера и взяться за STM32 :)
                                  0
                                  Мне самому больше stm32 нравится, но тоже в 2008 году начинал с attiny2313 )
                                    0
                                    согласен, 0,5 мм — это мало. Я раз паял микросхему usb хаб'а, а у неё 28 ног при высоте всего в 11 мм… Это было довольно интересно, учитывая, что жало у меня — нож hakko t12. Подарил бы мне кто-то жало или два...)

                            Only users with full accounts can post comments. Log in, please.