Вновь приветствую читателей «Хабра»!

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

Заказал для него стартовый комплект из Digispark'ов и 10-ти ваттных RGB светодиодов, потому что его первой же идеей, стало создание свето-динамической установки. Но проблема пришла откуда не ждали: недостаток задействованных аппаратных ШИМ — стал первой проблемой. А второй — друг захотел управлять одновременно несколькими светодиодами.
Выход конечно прост — задействовать более продвинутую плату, с другим микроконтроллером. Но такую плату пришлось бы вновь заказывать и ждать, либо купить на месте, за баснословные средства, а тем временем я вспомнил про сдвиговые регистры, принцип управления которыми изучил давно, а вот в схемах никогда не использовал.

Сел за Atmel Studio и начал писать многоканальный софт-ШИМ, через 74HC595. За пару дней было написано несколько режимов управления, и реализованы все основные функции для организации многоканальных ШИМ, БАМ, а так же механизмы работы со светодиодными уровнями и семи-сегментными индикаторами.
Собственно на эту тему я и хотел написать развернутую статью с приложенными исходниками, но объем получился довольно большой, а статья получалась очень обширной. А после финальной реализации описанной ниже, пришлось полностью пересмотреть концепцию управления, что привело к мгновенному устареванию всех наработок на эту тему.
Если у читателей появится огонь желания получить такую статью, я займусь. А без этого, мы же все помним, насколько я ленивый. :)

В общем, друг получил библиотеку для использования в среде Ардуино, а мне стало скучно и я стал размышлять о применении полученных наработок для управления LCD (HD44780).
Итог этой работы я и хотел бы сейчас продемонстрировать, а заодно, поделиться с Вами знаниями и исходными кодами.

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

Для работы был выбран сдвиговый регистр 74HC595, ввиду наличия защелки, позволяющей организовать вывод данных по-требованию. Дисплей совместимый с HD44780 (для работы в 4-х битном режиме), и микроконтроллер ATtiny13A.
Такой выбор был обусловлен не отсутствием более мощных микроконтроллеров, а сужением рамок поставленной задачи, количеством выводов, объемами памяти и ОЗУ, и просто — ради спортивного интереса.
Цель: создание кода, способного выполняться на заданном оборудовании, не в ущерб производительности, удобству использования и полноте функционала.

Запуск дисплея.
Первое, что необходимо было организовать, это вывод данных через сдвиговый регистр с приемлемой скоростью, что и было проделано с использованием трех ног «Тиньки».
Изображение описанного подключения таким образом:
Затем была написана функция для вывода данных в формате приемлемом для LCD. Эта функция является своеобразным ядром или драйвером библиотеки, на котором базируется весь последующий вывод. А так же дополнительная (вспомогательная функция), которая организует дробление данных на нибблы (полубайты), и отправляет их в LCD через сдвиговый регистр, вызывая основную функцию передачи данных.

Реализация функциональной части.
Как только эта часть работы была выполнена и протестирована, я приступил к организации нижнего уровня функций управления LCD, которые описаны в ДШ к устройству, как необходимые для первоначальной инициализации LCD, а так же, непосредственно саму функцию первоначальной инициализации, без которой LCD даже не включится.
А так как для отправки данных в LCD предназначена всего одна функция вывода (драйвер описанный выше), то все остальные функции легко организуются через ее вызов, с передачей соответствующих параметров. А значит, чтобы сэкономить память программ, все остальные функции можно определить через директиву #define.

В этот момент, я нашел метод инициализации который никто не использует, но он подробно описан в ДШ фирмы HITACHI (если мне не изменяет память). Заключается он в том, что для переключения разрядности линии данных в LCD, необходимо чтобы первые ДВЕ команды были 4-х битными, и все!
Когда же я изучал вопросы управления LCD, читая различные сайты, там был описан известный многим стандартный режим инициализации.
Результатом стало написание двух функций инициализации, для избежания проблем при работе с LCD других производителей. Режим определяется директивой в начале программы.
После чего был определен сет функций, расширяющий базовый набор функций управления LCD, в который так же вошла функция позиционирования курсора, для двух типов устройств LCD — 1602 и 2004 (переключение типа организовано директивой в начале программы), и функция вывода символов:


Далее был написан вспомогательный набор функций верхнего уровня, для организации вывода на экран данных стандартных типов, как то: байт, слово, байт в HEX-виде, строка и т.п.
Для вывода числовых данных, были написаны функции быстрого деления на 10 и на 100, а так же вспомогательные макросы, которые «выгребают» остаток от соответствующего деления (трюк). Таким образом вместо 5-ти делений для вывода uint16, требуется меньшее количество делений — 4 вместо 8-ми, а для uint8 — 2 вместо 4-ёх. Так же написаны функции определения новых символов, функция перекодировки русского текста для строк в RAM, вывод строк из программной памяти с перекодировкой текста.
Вот этот набор:

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

Ну и в заключении, весь этот «винегрет» был расширен самым верхним набором функций,
организующим вывод данных в определенной позиции экрана. Сделано это было так же, через директиву #define:


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

Модернизация аппаратной части.
И в этот момент я наткнулся на пример немцев 10-ти летней давности, которые организовали вывод данных в сдвиговый регистр, с использованием RC-цепочки. Во-первых реализация данного метода позволила освободить одну ногу микроконтроллера, а во-вторых, это подтолкнуло меня к новым размышлениям.
Так, проанализировав протокол передачи данных я понял, что вывод сигнала «Е»-LCD и вывод защелки сдвигового регистра совпадают!
А это значит, что можно освободить одну линию сдвигового регистра, и ускорить вывод данных в ДВА РАЗА!
Впоследствии вывод RS-LCD, был так же перенесен на линию данных, что позволило освободить еще одну линию сдвигового регистра, а протокол передачи данных был переписан учитывая этот факт.
Итогом явилась единая функция ядра, которая принимает на вход данные и флаг (вывод команды или функции), которая сама разбирает нибблы и выводит их на линию данных с необходимыми задержками, и не превышает 100 байт.
Шина данных LCD (4 бита) занимает половину вывода одного сдвигового регистра, вторая половина может использоваться для индикации, что я и показал в демонстрационном примере.

Позже, я наткнулся на упрощенное описание использование RC-цепочки для сдвигового регистра на сайте DIHALT'a — easyelectronics.ru, и хотел разместить весь материал там, но не смог зайти под своим аккаунтом, хотя учетные данные ввел правильно. А может перепутал сайты — основной и сайт сообщества. В общем расстраиваться сильно не стал, DI все-равно привет :)
А тем кто чувствует недостаток знаний в описываемой мной области, предлагаю посетить этот ресурс для устранения этого недостатка. DIHALT и члены сообщества очень подробно описали все устройства, о которых здесь идет речь.

В дополнение, информация о подключении и использовании.
Выносить код в отдельную библиотеку я не стал, созданный код легко преобразуется для любой разработки связанной с выводом данных на LCD. К недостаткам можно отнести невозможность переконфигурирования шины данных LCD, сидящей на сдвиговом регистре, она всегда занимает линии с 0 по 3 (правда имеется возможность «отзеркалить» выводы сдвигового регистра, заменив команду левого сдвига «lsl» в функции вывода, на команду правого сдвига «rsl», что «перевернет» назначение выводов сдвигового регистра, и шина данных окажется на выводах с 7 по 4). А вот выводы микроконтроллера могут быть сконфигурированы любые, причем для любого МК, но с оговоркой: линии должны быть на одном порту (опять же, при условии переназначения номера порта в функции вывода, в рассматриваемом варианте порт = 0x16).
Код содержит пару-тройку хитрых трюков, которые могут быть полезны не только для указанной области (например деления на 10 и 100 с остатком).
Код не использует прерывания и другую периферию, кроме аппаратного ШИМ, который изначально был инициализирован для диагностических целей, а впоследствии оставлен для демонстрационного примера (линии порта PB0 — ШИМ, PB1 — инверсный ШИМ, меняется от состояния светодиодов). С помощью этого можно, например, контролировать яркость подсветки дисплея — программно.
Таким образом, это самая маленькая библиотека вывода данных на LCD (и пожалуй самая быстрая, и самая документированная в коде :)
Хочется добавить, что в железе тестирование не производилось, но исходя из измеренных отклонений параметров RC-цепочки, думаю проблем возникнуть не должно.
Если найдутся смельчаки которые проверят это дело в железе, буду крайне признателен.
Так же отмечу, что работоспособность проверена для частот МК 9.6 МГц и 4.8 МГц (для последнего необходимо изменить сопротивление RC-цепочки на 9к).
Конденсатор в железе должен быть 100 пф (10 пф — допуск на емкость ног порта МК).

Отдельно создана секция INIT3, для предварительной инициализации параметров МК и запуска дисплея после включения устройства, выглядит она так:


Примеры применения.
Для демонстрации работоспособности, возможностей и скорости обработки, был написан демо-режим, который использует далеко не все функции, тем не менее достаточный для понимания их набор.
Видео эмуляции в программе Proteus это демонстрирует:

Извиняюсь за озвучку, забыл отключить звук на втором мониторе, надеюсь она не отвлекает от просмотра.

Некоторая техническая информация.
Из этих данных:

понятно, что демонстрационный пример использует 480 байт в функции main. Остальной код — использованные функции библиотеки, cp1251 — таблица перекодировки символов (33*2), HelloPGM — строковая константа «Привет, Хабр», и последние 4 фрагмента кода по 7 байт (строковые константы для вывода режимов: «Red», «Green», «Blue», «Yellow» выровненные пробелами), хранятся во flash-памяти.
1 байт RAM — занимает переменная состояний флагов светодиодов.
В видео, использованные символы встроены в библиотеку Proteus, которая была полностью перерисована. Поэтому в железе картинка будет отличаться. :)
Но работоспособность от этого не пострадает!

Временные параметры сигналов пульса и пакета данных для желающих:

Из которых видно, что длительности сигнала «0» и сигнала «1» (первый рис.), полностью совпадают по времени, так как функция вывода данных была оптимизирована с учётом полного устранения джиттера.
Второй рисунок отражает передачу одного пакета (байта) в LCD, так как шина данных 4-х разрядная, эта передача осуществляется в два этапа, между которыми следует задержка, чтобы LCD успел «переварить» первую часть данных.
Кому интересна функция вывода, она здесь:

(Здесь так же использован трюк с выводом, характерный только для МК компании Atmel).

Заключение.
Если кто-то решится воплотить моё творение в железе, и испытает проблемы с запуском, рекомендую поиграть с задержкой (указана директивой #define в секции описания глобальных данных). Будет необходима помощь, обращайтесь с вопросами в комментариях к статье, с радостью помогу. Чуть не забыл добавить: При использовании прерываний, придется обеспечить барьеры в функции вывода данных на линию, самостоятельно (в конце функции есть примеры сохранения и восстановления SREG (регистр состояния) под комментарием). Иначе возникнет проблема вызова прерывания во время функции передачи данных, что приведет к отказу работоспособности (инструкций: cli и sei — не достаточно!).

Как всегда — постскриптум:
Решил я проверить, насколько адаптируем код для новых разработок связанных с выводом данных, и первое что пришло на ум, это реализация вольт-метра на ATtiny13A.

Разработка представленной реализации заняла не более 30 минут, большую часть которых заняло проектирование схемы.
Двух-канальный ампер-, вольт-метр:
1 канал: 0-60V, 0-40A
2 канал: 0-15V, 0-10A
Размер кода: 760 байт
Использованная периферия: ADC0, ADC1, ADC2, ADC3
RESET — запрещён, используется весь PORTB.

Возможно в статье допущены неточности, так же, неточности возможны в результатах профилирования указанных в коде на полях, код переписывался неоднократно. Относительно работоспособности кода могу заверить что все функции протестированы много раз.
Исходный код демонстрационного примера для Atmel Studio 7.0, и проект для Proteus 8.3 sp2 — прилагается, дальнейшие изменения выкладываться не будут.

Как всегда, всем желаю успехов в творчестве… да и в прочих начинаниях!
Скорейшей весны!

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

Проголосовало 157 человек. Воздержалось 36 человек.

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

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


  1. Randl
    12.01.2016 08:58
    +1

    А почему код скриншотами?


    1. DolphinSoft
      12.01.2016 14:06

      Код — скриншотами, для компактности отображения, ведь это не весь код, а только основные, относящиеся к делу касты.
      Из-за чего-то (а может это мои кривые руки) при создании статьи, не заработал кат, куда я хотел сделать вставки чтобы не перегружать текст. После чего решил сделать как в прошлых статьях (в которых видимо по этой же причине сделал так).
      Здесь, мне видится отображение более лаконичным, ввиду единого стиля студии и протеуса.
      Считайте это моей фичей :)
      Желающие «копипастить» получили исходник целиком.


  1. Ares_ekb
    12.01.2016 10:05

    А как вы его [Digispark] прошиваете в Atmel Studio? Я тоже собираю штуку на attiny, но я прошиваю его через Arduino Mega 2560, в которую прошил ArduinoISP. Ну, короче, в качестве программатора использую мегу. Но это муторно и работает только в Arduino IDE. В Atmel Studio ничего прошить не могу.


    1. OnYourLips
      12.01.2016 10:24

      Поддержку вопрос. Интересна была бы обзорная статья с описанием процесса разработки и всего используемого современного софта и железа.
      Хочется избавиться от инструментов Arduino.


    1. roboter
      12.01.2016 10:37

      отдельным программатором?
      У него есть бутлоадер, и прошивается через юзб из ардуино иде.


      1. Ares_ekb
        12.01.2016 10:52

        В Arduino IDE просто через usb и бутлоадер?

        А в Atmel Studio через отдельный программатор? А можно в Atmel Studio без программатора? Вроде люди как-то делают через это или avrdude.


        1. roboter
          12.01.2016 11:12

          я могу ошибаться но и там и там используется avrdude.


        1. DolphinSoft
          18.01.2016 00:43

          В ссылке которую Вы привели, используется Atmel-ICE, это такой навороченный программатор-отладчик от Атмел, который умеет в шить все типы их контроллеров и предоставляет возможность работы через такие интерфейсы: JTAG, SWD, PDI, TPI, aWire, SPI, debugWIRE.
          Что означает, что им можно шить Attiny младших версий (5,9 и т.д), которые шьются только через TPI (Статья про эти девайсы). А так же самые навороченные UC3 и XMega, которые шьются через интерфейс PDI. Но при этом цена девайса удручает.


    1. DolphinSoft
      12.01.2016 14:14
      +1

      Digispark я не прошиваю, прошивает мой друг, из патченой среды ардуино.
      Я использую более суровые методы :)

      Вроде такого, перешитого в про-версию, и припаянным ICSP разъемом (только разъем сделал как в стандартном программаторе — 10-ти пиновый, который полностью закрыл отверстие заглушки).


  1. Ares_ekb
    12.01.2016 10:46

    С одной стороны, Digispark интересная штука.

    Но с другой, она показывает как люди получают на подобных проектах сверхприбыли. Он стоит $8.95 (680 руб.). При том, что самая дорогая вещь там attiny стоимостью 30-50, ну, 100 рублей, если покупать с накруткой в России. Ну, ещё копеешный стабилизатор напряжения, несколько резисторов, плата. Это никак не 680 рублей. Вот, китайцы продают их по адекватной цене ~100 руб.

    Добавляем светодиодик, немного хлама и получаем уже $16.95 (1300 руб)! Наверное это выгодней, чем торговать оружием или наркотиками.

    Это даже особенность не Digispark, а вообще в этой области это норма.


    1. Ares_ekb
      12.01.2016 11:15

      Или добавляем несколько кнопок и резисторов и получаем $24.95. 1900 рублей, Карл, практически из воздуха. Я пишу это не потому что мне нравится считать чужие деньги. А потому что у нас вечная проблема с «нефтяной иглой», «низкой производительностью труда» и т.п. Нужно делать такие же штуки и продавать буржуям за доллары. Например, матрешку, которая читает твиты или статусы вконтакте и мигает светодиодиками.


      1. DolphinSoft
        12.01.2016 14:15

        Все что вы указали, с одной материнской платы можно получить бесплатно, на целый год проектов ;)


    1. HunterSpy
      12.01.2016 12:25
      +1

      Вообще то у Digispark — Open Hardware. Купить его можно на aliexpress за бакс с копейками, а покупая у разработчика ты просто его поддерживаешь и получаешь оригинал. Лично мне понравилась такая идея.


  1. UA3MQJ
    12.01.2016 11:08

    Поясните про назначение RC цепочки для RS


    1. DolphinSoft
      12.01.2016 14:26

      Здесь все просто:
      Взгляните на видео с демонстрацией. Там видно, что когда проскакивает сигнал защелки (канал B осциллографа), иногда на линии данных (канал С осциллографа) проскакивает последний бит (девятый). Так вот, если его видно на осциллограмме, значит это ноль, в противном случае — единица. Этот бит съедается дисплеем в момент чтения линии данных — параллельно с данными из сдвигового регистра. Это чтение происходит в тот самый момент, когда дисплей получает сигнал «E», или Latch — сдвигового регистра. То есть схема такая:
      Дисплей читает «E» (сигнал enable read), в этот момент он считывает данные и сигнал RS, а я ему подсовываю на эту линию нужный сигнал параллельно с выдачей защелки.
      Надеюсь понятно объяснил. Взгляните на ассемблерный код функции вывода (уменьшенный скрин кликабелен), там есть проверка _RS, после которой переход на выдачу защелки, либо на выдачу защелки и опускание линии. Так вот это оно.


      1. DolphinSoft
        12.01.2016 14:45

        Ошибочка вышла, конечно данные на канале «D». Канал «C» — RC-цепочка.


    1. DolphinSoft
      12.01.2016 14:40

      Кстати говоря, спасибо за Ваш интерес, специально для Вас открою тайну, о которой я забыл написать в статье :)

      Эта функция использует одну аппаратную фичу атмела, которой нет у пиков, поэтому присмотритесь к ней внимательно ;)
      Подсказка: присмотритесь как происходит вывод в порт.
      Жду Ваши комментарии :)


  1. UA3MQJ
    12.01.2016 11:23
    +1

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


  1. monah_tuk
    12.01.2016 13:12
    +1

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


  1. burjui
    12.01.2016 15:40

    Когда-то давно я портировал Arduino-библиотеку LCD на чистый C, попутно сделав её кросс-платформенной:
    https://github.com/RoboCraft/HD44780

    Ввод-вывод в ней абстрагирован в драйверы через такую структуру:

    struct HD44780_GPIO_Interface_Struct;
    typedef struct HD44780_GPIO_Interface_Struct HD44780_GPIO_Interface;
    
    struct HD44780_GPIO_Interface_Struct
    {
      HD44780_Result (*configure)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinMode mode);
      HD44780_Result (*write)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinState value);
      HD44780_Result (*read)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinState *value);
    };
    

    Этакий C++ интерфейс для бедных: заполняем структуру указателями на функции управления пинами и отдаём библиотеке, а она уже работает с пинами через эти указатели. В папке drivers/ лежат реализации для STM32, в examples/ есть примеры использования. Они могут показаться громоздкими, но это издержки C и плата за гибкость: можно управлять экраном хоть через сдвиговый регистр, хоть по радио — нужен только драйвер пинов, порядок пинов вы задаёте сами при инициализации библиотеки.

    Пример для STM32F10x
    HD44780_STM32F10x_GPIO_Driver lcd_pindriver;
    
    void init_lcd(void)
    {
      /* Распиновка дисплея */
      const HD44780_STM32F10x_Pinout lcd_pinout =
      {
        {
          /* RS        */  { GPIOA, GPIO_Pin_6 },
          /* ENABLE    */  { GPIOA, GPIO_Pin_5 },
          /* RW        */  { GPIOA, GPIO_Pin_4 },
          /* Backlight */  { NULL, 0 },
          /* DP0       */  { NULL, 0 },
          /* DP1       */  { NULL, 0 },
          /* DP2       */  { NULL, 0 },
          /* DP3       */  { NULL, 0 },
          /* DP4       */  { GPIOA, GPIO_Pin_3 },
          /* DP5       */  { GPIOA, GPIO_Pin_2 },
          /* DP6       */  { GPIOA, GPIO_Pin_1 },
          /* DP7       */  { GPIOA, GPIO_Pin_0 },
        }
      };
    
      /* Настраиваем драйвер: указываем интерфейс драйвера (стандартный),
         указанную выше распиновку и обработчик ошибок GPIO (необязателен). */
      lcd_pindriver.interface = HD44780_STM32F10X_PINDRIVER_INTERFACE;
      /* Если вдруг захотите сами вручную настраивать GPIO для дисплея
         (зачем бы вдруг), напишите здесь ещё (библиотека учтёт это):
      lcd_pindriver.interface.configure = NULL; */
      lcd_pindriver.pinout = lcd_pinout;
      lcd_pindriver.assert_failure_handler = hd44780_assert_failure_handler;
    
      /* И, наконец, создаём конфигурацию дисплея: указываем наш драйвер,
         функцию задержки, обработчик ошибок дисплея (необязателен) и опции.
         На данный момент доступны две опции - использовать или нет
         вывод RW дисплея (в последнем случае его нужно прижать к GND),
         и то же для управления подсветкой. */
      const HD44780_Config lcd_config =
      {
        (HD44780_GPIO_Interface*)&lcd_pindriver,
        delay_microseconds,
        hd44780_assert_failure_handler,
        HD44780_OPT_USE_RW
      };
    
      /* Ну, а теперь всё стандартно: подаём тактирование на GPIO,
         инициализируем дисплей: 16x2, 4-битный интерфейс, символы 5x8 точек. */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      hd44780_init(&lcd, HD44780_MODE_4BIT, &lcd_config, 16, 2, HD44780_CHARSIZE_5x8);
    }
    


    1. DolphinSoft
      12.01.2016 16:33

      Это понятно, если реализовать таким способом, то для моей поставленной цели это сразу съест память тиньки, в моём случае, используется 1 байт RAM (без учета стека, которого при максимальной глубине вызовов, насколько помню, использовалось 8 байт).
      В STM с этим проще, а значит C++ предоставляет все неоспоримые удобства и гибкость.


      1. burjui
        12.01.2016 18:06

        Справедливости ради, библиотеку можно использовать и с AVR — нужно только драйвер пинов написать (мне было не до этого, поэтому AVR в комплект не входит), памяти нужно байт 100, к тому же библиотека на чистом C. ATtiny — понятное дело, хардкор, туда вообще ничего не впихнёшь без напильника и вазелина, единственный плюс — размер.


  1. Ares_ekb
    12.01.2016 20:01

    Это просто магия! Написал код в Atmel Studio на Си, нарисовал схему в Proteus, загрузил в Proteus hex-файл и всё работает!

    Я очень скептически относился к эмуляции и не знал про Proteus. А оказывается это такая клевая штука. Спасибо за статью.


    1. DolphinSoft
      12.01.2016 20:21
      +1

      Я до железа добираюсь только после полноценных тестов в эмуляции, все фантазии сначала воплощаю виртуально, очень помогает при разработке.
      Добавил к статье ссылку на библиотеку LCD, с моими «художествами», символы из которой представлены в демо-ролике.
      Её необходимо скопировать с заменой в папку с протеусом:
      «C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\MODELS\»
      или где он у Вас установлен, только сохраните оригинал!
      Библиотека работает с Proteus 8.3 sp2, с младшей ревизией возможны проблемы.
      Успехов в разработках! :)
      И еще, возможны проблемы при эмуляции на некоторых микроконтроллерах, в виде неправильно работающих узлов периферии, пусть это Вас не останавливает!


      1. DolphinSoft
        13.01.2016 03:11

        Вспомнил какая была проблема с ATtiny13a в Proteus:
        Не работает АЦП в непрерывном режиме (флаг ADLAR если не изменяет память, могу ошибаться).
        То есть после выполнения первого преобразования АЦП, значение не изменяется пока не запустишь явное преобразование (ADEN). Баг не страшный, но неприятный.
        После пары дней мытарств, нашел описание проблемы у буржуев.


        1. DolphinSoft
          13.01.2016 03:17

          Опять память подвела :)
          Флаг ADSC.


  1. HWman
    12.01.2016 21:27

    Делал когда-то подобное, но меня смутило то, что ATtiny13 и сдвиговой регистр стоит как ATmega8.


    1. DolphinSoft
      13.01.2016 01:30

      И это пишет любитель ATtiny13? :)


      1. HWman
        13.01.2016 21:25

        Вот один проект на который в итоге забил:



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


        1. DolphinSoft
          13.01.2016 22:14
          +1

          Ну, Дружище, давайте не будем лукавить ;)
          Во-первых в этом видео понятно, что термометр устранен из схемы не потому что он дорогой, а потому что не хватило выводов.
          Во-вторых, Вы утверждаете, что увеличили с помощью средне-арифметического — диапазон измерений до 11 бит.
          Ок, но тогда (исходя из Ваших утверждений), шаг измерений должен быть равен 2034/2048 ~ 0.001 (1 * 10(-4))
          Но Ваше видео показывает, что шаг измерений равен 0.18, что уже больше заявленного на два порядка.
          В-третьих, Вы не показываете реальные значения на резисторе в видео, для определения абсолютной погрешности, когда в видео представленном мной, показаны значения вольт-метра, ам-метра, да еще и пробник который показывает реальное падение напряжения. При этом я не использую средне-арифметическое (оно достигается в схеме — интегрально), а абсолютная погрешность не превышает 0.03 для вольт и 0.01 для ампер (естественно с увеличением измеряемого диапазона, абсолютная погрешность растет, однако она нивелируется смещением, чем достигается максимальное приближение на достижимом размере шага).

          Не обижайтесь, но наши проекты (громко звучит поделка за 5 минут), далеки.
          П.С.: Если убрать второй канал в моем примере (или хотя бы ам-метр), то на его место можно вонзить сеть из интегральных термо-датчиков, с поочередным выводом значений. Вы же заметили что я указал размер полученного кода, который равен 760 байтам? Вот в эти 240 байт легко впишется функция опроса.

          Тем не менее, хочу добавить про стоимость:
          Мега в моей местности стоит далеко не дешевле тиньки со сдвиговым регистром, при том что сама тинька стоит около 100р (13А). А если учесть что 595-ых у меня «завалялось», а 164-ых — совсем ведро с мертвых роутеров, то выбор очевиден.

          Опять же, я никоим образом не против увеличения вычислительных ресурсов, ног и периферии МК, а только за!
          Но порой, крутишь в руках 328-ю мегу, и жаба давит делать на ней мигалку, дрыгалку или какую еще простую фигню. Ведь она по объему памяти почти как БК0010-01, а по вычислительной мощности выше на порядок.


          1. HWman
            14.01.2016 09:38

            В этом проекте у меня осталось много вопросов и непонятностей, потому и забросил.


            1. DolphinSoft
              14.01.2016 11:14
              +2

              Со мной такое происходило ранее неоднократно, когда мои идеи просто старались меня съесть своим количеством, и приходилось распыляться на несколько реализаций одновременно. При этом каждая область для меня была новой и неизвестной, а значит нужно было обрабатывать уйму новых знаний. А параллельно с этим наваливался реал: друзья, девушки, учёба, работа и т.п.
              Но самое странное, что чужие реализации каких-либо алгоритмов, которые я пытался адаптировать в своих работах, не приводили к успешному финалу, как правило. Отмечу, так же, что среди всей массы чужих исходников, я не видел ни единого комментария к коду.
              Поэтому, наверное, я стараюсь сейчас выкладывать исходники для других людей в таком виде.

              А Ваши ресурсы я посетил, впечатляет! Только не пойму, почему вы это все делаете в соц-сетях?
              Лично меня, очень напрягает просматривать такой материал — лентой. Ведь есть же для этого сайты с тематическими блогами, где можно подобного рода информацию систематизировать.


              1. HWman
                17.01.2016 14:13

                В соц.сетях я что и делаю, то собираю информацию, большинство из этого всего — найденное мною в сети.

                Какая цель всего этого? Наверное коммерция, но мне нравится это делать не зависимо от того приносит ли оно доход или нет.


                1. DolphinSoft
                  18.01.2016 00:49

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


    1. Alexeyslav
      13.01.2016 11:03

      На регистры спрос большой, цену задирают. А специальные регистры с источниками тока на выходе — вообще заменить нечем!
      Два 16-битных регистра — и подключаем 4 светодиодных индикатора в статике всего с одним внешним резистором, задающим яркость.
      При этом не имеем проблем в программной реализации динамической индикации, минимальные уровни ЭМИ от схемы и т.д. ATmega8 при этом откладывается в сторонку.


      1. Ares_ekb
        13.01.2016 11:25

        Можно использовать Charlieplexing и с помощью 6 контактов attiny управлять 30 светодиодами.

        Я делал панельку из 12 светодиодов, которая управляется 4 контактами: www.youtube.com/watch?v=uiaE7snxT3U

        Видно, что там загораются лишние светодиоды, это связано с особенностями (если не багами) Arduino Mega 2560 и лечится стягивающими резисторами.

        А ещё есть GuGaplexing, с помощью которого можно удвоить количество светодиодов. Т.е. с 6 контактов attiny управлять 60-ю светодиодами.

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


      1. DolphinSoft
        13.01.2016 13:48

        Алекс, два 8-разрядных регистра и 8 7-ми сегментных индикатора, зачем такое расточительство? :)


        1. Alexeyslav
          13.01.2016 14:30

          И куча внешних деталей, те же ключи на каждое знакоместо. И повышенный уровень ЭМИ, который не допустим в чувствительном радиоприёмнике — а значит много возни по правильному экранированию схемы.
          А вообще, на 8 индикаторов уже есть специализированная микросхема(одна!), еще и SPI…


          1. DolphinSoft
            13.01.2016 14:44

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