Устройство на ATtiny13, управляемое программой из 290 16-разрядных слов, написанной на ассемблере, запоминает коды шести кнопок пульта ДУ и включает/выключает три нагрузки. Схема:



Стандартный ИК-приёмник TSOP1740 использует инверсную логику, и это учтено в программе. Принимаемые сигналы вызывают прерывание INT0. Резистор нужен для отвязки ИК-приёмника от микроконтроллера во время заливки прошивки.

Порядок обучения устройства кодам кнопок следующий. Включаем питание при нажатой кнопке на входе PB3 (затем её можно отпустить). Первая нагрузка кратковременно включится и тут же выключится. Нажимаем на пульте кнопку, которой желаем включать первую нагрузку. Как только пульт отправит один и тот же код два раза (это происходит, если держать кнопку нажатой хотя бы пару секунд), первая нагрузка включится на пять секунд и отключится. А вторая включится кратковременно и тоже тут же отключится. Обучаем устройство коду кнопки включения второй нагрузки. Затем третьей. Теперь последовательно проделываем то же с кодами кнопок, которыми желаем отключать нагрузки. Программа запишет коды в ЭСППЗУ, теперь надо выключить и включить питание, но кнопку на входе PB3 не нажимать. Устройство перейдёт в рабочий режим, в котором можно управлять нагрузками.

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



Вообще-то, там должны быть NPN-транзисторы, включённые эмиттерами к общему проводу, но у автора работает и так. Нагрузками могут служить, например, светодиодные лампы с цветовыми температурами в 2700, 4000 и 6400 К. Вы сможете переключать их вручную согласно циркадным ритмам, не полагаясь на автоматику.

Код на ассемблере: без HTML-форматирования и с таковым.

Подтверждение, что удалось уложиться в 290 16-битных слов:

gavrasm Gerd's AVR assembler version 3.5 (C)2015 by DG4FAC
----------------------------------------------------------
Source file: 12_IR-Rx_Switch.asm
Hex file:    12_IR-Rx_Switch.hex
Eeprom file: 12_IR-Rx_Switch.eep
Compiled:    23.11.2016, 23:23:05
Pass:        2
     1: ;
     2: ; ***************************************
     3: ; * IR-Switch 3-Channel with ATtiny13   *
     4: ; * (C)2016 by www.avr-asm-tutorial.net *
     5: ; ***************************************
...
Program             :      290 words.
Constants           :        0 words.
Total program memory:      290 words.
Eeprom space        :       13 bytes.
Data segment        :       29 bytes.
Compilation completed, no errors.
Compilation ended 23.11.2016, 23:23:05

Комментарии (20)


  1. AlNi89
    06.06.2019 07:44

    Вообще-то, там должны быть NPN-транзисторы, включённые эмиттерами к общему проводу, но у автора работает и так.

    В корне не правильное решение, которое в других условиях (например, реле на 12в) не заработает. Это эмиттерный повторитель. На реле будет такое напряжение, как и на базе. Так как у автора и контроллер и реле питаются от 5в, то «прокатило». В текущей схеме нужно реле перенести на сторону коллектора.


    1. FDA847
      06.06.2019 08:49
      +1

      Совершенно верно! Очень плохое решение. Надо использовать классику:
      habrastorage.org/webt/lr/c2/xx/lrc2xxo7fi-vzlelv09xhottedm.jpeg
      Тогда всё надёжно работать будет.
      Я люблю для таких целей использовать «цифровые» транзисторы PDTC143E. Там внутри уже есть резисторы в цепи базы.


      1. GarryC
        06.06.2019 10:13

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


        1. FDA847
          06.06.2019 10:17
          +1

          Решение рабочее, спору нет, но имеет недостатки, о которых AlNi89 уже написал.
          Плюсов по сравнению с «классикой» я лично не вижу, хотя может кто-то про них напишет, будет интересно.


          1. GarryC
            06.06.2019 10:22
            +1

            А никаких плюсов лично я не вижу, более того, логика в данном случае инверсная, включаемся нулем, сплошные минусы, но работать будет.
            Единственно, почему оно раньше применялось — выходной ток «нуля» ТТЛ был намного сильнее выходного тока «единицы» и для транзисторов с низким КУ это было существенно.


            1. FDA847
              06.06.2019 10:28
              +1

              На схеме, что я привёл, включение осуществляется лог. 1. Как раз логично всё:
              1 — реле включено
              0 — реле выключено.


              1. GarryC
                06.06.2019 10:36
                +1

                Я и не спорю, что прямое управление естественнее, просто раньше я светодиоды вешал с питания на ногу и включал нулем, потому что тока единицы 155 серии просто не хватало для нормального свечения, вот и у многих вошло в привычку инверсное управление, а оно не очевидно.


                1. FDA847
                  06.06.2019 10:38
                  +1

                  Да я понимаю. Товарищ у меня очень долго программировал 51-е контроллеры, так до сих пор и на пиках светодиод нулём включает. Ему так привычнее :-)


      1. OldGrumbler
        06.06.2019 20:33
        +1

        Хм, а я бы повесил мосфеты — 7002 и далее. Потребление на свои нужды никакое, токи и напряжения тянут приличные, иную нагрузку можно вешать и безо всяких реле. А для боль-мене силовых решений вплоть до коммутации переменки 220 доктором прописаны симисторные оптопары. Опять же и развязка, и контакты не подгорят через пару лет активного дергания индуктивной нагрузкой типа движка…


    1. Vanellope
      06.06.2019 11:53
      +1

      Я всегда думала, что ключи на NPN управляются логической "1", а на PNP логическим "0". Но есть маленький нюанс, PNP надо включать между плюсом источника питания и нагрузкой, а NPN между нагрузкой и общим проводом.


      1. AlNi89
        06.06.2019 19:47
        +1

        Всё верно, автор как раз нюанс с PNP и не учёл, поэтому и получил не ключ, а эмиттерный повторитель (который в силу стечения обстоятельств вполне себе выполняет роль ключа)


  1. POS_troi
    06.06.2019 08:02

    Заголовок очень желтушный получился :)
    Да я очень хорошо знаю этот контроллер и порой муки с экономией каждого байтика, дабы впихнуть туда весь необходимый функционал, но автор в своей заметке, просто указал размер байткода для его компилятора, ну ещё этим можно потыкать противников асма и любителей высокоуровневых языков, мол «повторите» :)


    1. shevmax
      06.06.2019 08:47
      +1

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

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

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


      1. POS_troi
        06.06.2019 09:22
        +1

        Ну мы то тут о МК с маленьким объёмом флэши, а в случае с тинькой13 этот объём мизерный :)
        Подобные схемы/решения не редко рождаются в горячих спорах на форумах — когда человек заявляет что вот проша и она никак не лезет в тини13 и поэтому он применил тини2313, да много лишних ног но зато 2кило ром :)


  1. GarryC
    06.06.2019 10:16
    +1

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


    1. FDA847
      06.06.2019 10:23
      +1

      Всё зависит от компилятора. С атмеловскими контроллерами я работал давно, поэтому тут точно сказать не могу. Но вот для микрочиповских PIC16 их же компилятор XC8 генерит вполне мизерный код. Мы поэтому даже под самые мелкие процессоры пишем код на Си. Конечно, задачи разные могут быть, но однозначно говорить, что для мелких МК нужен именно ассемблер всё таки не совсем верно. Всегда сравнивать надо.

      P.S. Да, я знаю, что Microchip купил Atmel :-) Просто под терминами «атмеловские» и «микрочиповские» я понимаю различные семейства МК.


  1. puariha
    06.06.2019 12:56
    +1

    если в схеме автор допускает такое, программу можно не смотреть. думаю там не лучше решение.


    1. tormozedison Автор
      06.06.2019 12:58

      Не факт. Тут недавно было про виртуозного стоматолога, оказавшегося плохим фотографом.


    1. iig
      06.06.2019 15:02
      +1

      Какая разница, лучшее это решение из всех возможных вариантов, или нет, если работает (допустим) согласно требованиям?
      Требование заявлено одно — сделать ДУ на мелком контроллере. То что ключи сделаны странно — так для реле на 5В и современных транзисторов действительно нет разницы.


  1. siargy
    07.06.2019 18:03
    +1

    хм, у меня на pic12f508 сделан rgb-контроллер с пультом ду на 13 состояний
    получилось 298 х 12бит команд