Уффф… Наконец-то добрался до паяльника! Сейчас сделаем что-нибуть интересненькое.
Раньше мы сказали «А», собрав устройство ввода – клавиатуру, теперь мы просто обязаны сказать «Б» и сделать устройство вывода, чем мы сегодня и займемся. В качестве устройства «Б» у нас будет выступать 7-сегментный индикатор. Но не просто один индикатор, а целая линейка семисегментных индикаторов, причем неограниченной длинны и с кучей эффектов отображения! Интересно? Ну, тогда, начнем!
Семисегментные индикаторы довольно неоднозначные устройства для отображения. По причине того, что они предназначены для отображения цифр (хотя, конечно, можно отобразить и буквы, но довольно условно и не все), круг их применения не очень широк. Но есть случаи, когда требуется яркое и четкое отображения цифр, которые, к тому же, должны быть видны издалека, и тут равных семисегментникам нет.
Часто, когда идет речь о семисегментных индикаторах, подразумевается включение их в схему с динамической индикацией, при этом, по очереди засвечивается только один символ, и при частоте выше 50Гц, создается иллюзия, что светятся все символы одновременно. Эта схема настолько распространена, что 3-4х циферные индикаторы имеют выводы только под динамическую индикацию. У такого способа включения, конечно, есть свои плюсы, но когда речь идет о количестве цифр больше чем четыре (а тем более, если не известно, сколько их вообще будет) – начинаются проблемы с этой самой динамической индикацией — падает яркость свечения становиться заметно мерцание. Очевидно, что для линейки семисегментных индикаторов неограниченной длинны, такой способ включения абсолютно не подходит. Как же быть в таком случае? Поступим нестандартно – включим наши индикаторы на статическое (постоянное) свечение. Чтобы такое подключение стало возможным, нам понадобятся одноциферные семисегментные индикаторы – вот, например, такие:
Кроме того, для засветки нужных сегментов индикатора, нам нужен драйвер светодиодов. Чтобы не увеличивать стоимость нашей линейки (микросхема-драйвер довольно дорогая) будем применять дешевые и распространенные сдвиговые регистры 74HC164. Это немного ухудшит яркость свечения, но значительно удешевит все устройство. Для управления линейкой будем использовать микроконтроллер ATtiny13 – больший не нужен. Сдвиговые регистры управляются всего двумя линиями (Data, Clock) и включаются последовательно, а значит, нет разницы для схемы управления регистрами, сколько их там стоит в линейке три или сто двадцать три. Значит, можно сделать нашу линейку безразмерной, то есть к линейке можно в любое время подключить дополнительные индикаторы или убрать ненужные. Схема устройства выглядит следующим образом:
Как видно из схемы, семисегментные индикаторы с регистром 74HC164 установливаются на отдельные платы с разъемами по обе стороны для того, чтобы можно было собрать несколько индикаторов в линейку. Плата управления (драйвер линейки) на ATtiny13 управляет всеми индикаторами вне зависимости от их количества. Более того, в прошивке предусмотрена возможность для того, чтобы в линейку можно было включать вперемешку индикаторы с общим анодом и общим катодом. Символы отображаются справа налево. Этот вариант отображения удобен для случая, когда неизвестно, сколько индикаторов включено в линейке – последние введенные символы всегда находятся в первых индикаторах. Кроме сигнала данных (Data) и сигнала тактирования данных (Clock), драйвером формируется сигнал “/OE” (Output Enable) для того чтобы избежать мерцания сегментов при сдвиге символов по регистру. В момент сдвига данных по регистру драйвер выставляет на линии /ОЕ высокий уровень, схема управления индикаторами по этому уровню сигнала должна запретить вывод данных на индикатор. В данном схемном решении этот сигнал не задействован по причине отсутствия в сдвиговых регистрах 74HC164 ножки переводящей выходы в высокоомное состояние, но можно этим сигналом отключать общий вывод индикатора (через транзистор) или использовать другую микросхему, имеющую соответствующий вход.
Алгоритм работы устройства.
Я долго размышлял над тем, как сделать управление линейкой простым и не обременительным для микроконтроллера Вашего проекта. Главная цель, которую я преследовал, максимально переложить функции управления на драйвер линейки, но в тоже время не потерять возможности гибкого управления со стороны Вашего проекта. В результате был разработан следующий алгоритм работы:
Драйвер линейки взаимодействует с Вашим проектом по UART (Скорость 9600, 8 бит данных, 1 стоп бит, бита четности нет). Драйвер работает как на прием, так и на передачу (хотя последнее не столь важно и можно данную возможность не использовать, тем самым свести управление драйвером всего к одной линии).
В драйвер могут передаваться цифры, буквы латиницы, управляющие символы. Передача осуществляется в ASCII коде (пример: цифры -“123”, буквы-“Аbc”, управляющие символы-“>”). Другие символы игнорируются.
Драйвер, по UART, отправляет символы окончания эффектов. Их всего два — “V” и “D”. Это нужно для того, чтобы знать когда окончился эффект и можно отправить следующую команду эффекта для формирования сложных составных эффектов.
Переданные, для отображения, цифры и буквы латиницы записываются в буфер (размер буфера может быть 16, 32, 64 знака и выбирается по нуждам проекта). Переполнения буфера нет, он циклический (новые символы пишутся поверх самых старых). Управляющие символы в буфер не записываются – они активируют свои функции немедленно в момент приема по UART (например: при посылке строк “abcd>” и “ab>cd” результат будет идентичен). На линейку индикаторов символы попадают из буфера, при этом способ их отображения зависит от активированных эффектов. Такой вариант наименее ресурсоемок для контроллера Вашего проекта, так как введенная в буфер строка символов отображается с различными эффектами посредством лишь ресурсов драйвера.
По умолчанию драйвер отображает полученные символы на линейке без каких либо эффектов. Если по UART передавать цифры или букв латиницы (например, “1”, “4”, “A“, ”S” ”d” …) они сразу будут отображаться на линейке справа налево, причем следующий символ будет сдвигать влево предыдущий.
Далее идет описание всех символов которые можно отправить в драйвер.
Отображаемые символы.
Драйвер умеет отображать цифры и буквы латиницы (верхний и нижний регистр отображается одинаково), а также, пробел и десятичную точку.
Управляющие символы.
Для выбора режима работы линейки или активации спецэффектов нужно передать по УАРТ специальные символы. Как я писал раньше, управляющие символы начинают работать немедленно, после приема по UART, и в буфер они не попадают. Соответственно их можно пересылать прямо в строке сообщения.
Пример: “_Аbc>”, где “Аbc”-отображаемое сообщение, а “_” и “>”-управляющие символы.
Вот перечень символов управляющих режимом работы индикаторов:
“)” – разрешение автоматического отображения буфера (по умолчанию активировано).
При включенном автоматическом обновлении буфер, с определенным периодом, перерисовывается на линейке. Каждый принятый по UART и записанный в буфер символ сразу же отобразится на линейке.
“(“ – запрет автоматического отображения буфера.
Все принятые по UART символы продолжают записываться в буфер драйвера, но на линейке не происходит ни каких изменений (“светится” последнее сообщение). Запрет автоматического обновления линейки может понадобиться в том случае, если нужно вывести сразу всю строчку целиком, а не посимвольно, или для того, чтобы подготовить следующее сообщение, не изменяя предыдущее.
Пример: переданная по UART строка “(2314” ни как не отобразится на линейке, но в буфере запишется. Если дальше включить автоматическое отображение — “)”, то на линейке мы увидим наше слово “2314”. Для того, чтобы выводить строку сообщения целиком, а не по факту передачи символов по UART, нужно послать следующую комбинацию “(2314)”. Это актуально если символы 2, 3, 1, 4 передаются по UART не сразу, а в течении определенного времени.
“!” – принудительный вывод буфера на линейку.
Нужен для того, чтобы однократно отобразить буфер на линейке, при отключенном автоматическом обновлении.
Пример: запретили автоматическое отображение “(“, передали символы “2314”, принудительно их отображаем “!”.
“_” (знак подчеркивания) – очистка буфера.
После приема этого символа буфер немедленно очистится. Если запрещено автоматическое отображение буфера, на линейке не произойдет никаких изменений, так как очищается только буфер. Для очистки линейки, в этом случае, нужно запустить автоматическое отображение буфера или послать символ принудительного вывода буфера “!”.
”[“ – включение режима инверсии символов.
В режиме инверсии, выводимые на линейку символы, инвертируются (побитно). Такой режим нужен, если Вы умудрились соединить в одну линейку вперемешку индикаторы с общим анодом и общим катодом. При подаче инверсного сигнала на индикатор противоположного подключения последний отобразит символ корректно. Даже если вся линейка индикаторов не соответствует прошивке в начале сеанса достаточно послать символ ”[“ и дальше все будет работать корректно.
“]” – выключение режима инверсии символов (по умолчанию активировано).
Пример: Если прошивка для индикаторов с общим анодом, а индикаторы включены так: ОА—ОК—ОА. Передаем строку «3[4]5» получим на линейке 345. Если передать так — «345» то получим «3-черте-что-5».
Далее символы для организации спецэффектов:
Пакет управляющих символов для исчезновения-проявления содержимого линейки.
“*“ – посимвольное «исчезновения» содержимого линейки.
Символы на линейке последовательно гасят свои сегменты, пока совсем не «исчезнут» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” и запрещается автоматическое отображение буфера.
“^“ – посимвольное «проявление» содержимого линейки.
Символы на линейке последовательно зажигают свои сегменты до полного «проявления» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” автоматическое отображение буфера разрешено.
Для полноты эффекта линейка индикаторов должна быть пуста, запрещено автоматическое отображение буфера и в буфере должно находиться проявляемое слово (сделать это можно следующей строчкой “)_!проявляемое слово”). Данный эффект хорош после исчезновения предыдущего слова по “*”.
Пакет управляющих символов для горизонтального скроллинга (бегущей строки).
Пакет позволяет организовать бегущую строку из содержимого буфера. От Вас требуется лишь поместить строку в буфер и управляющим символом задать направление движения, все остальное будет делать драйвер.
“>“ – Автоматический скроллинг содержимого линейки вправо (бегущая строка).
Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.
“<“ – Автоматический скроллинг содержимого линейки влево (бегущая строка).
Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.
“|“ – Остановка скроллинга.
Позиция отображения возвращается в нормальное состояние.
Пакет управляющих символов для вертикального сдвига.
Этот пакет эффектов позволяет организовать несколько интересных эффектов, например, имитация движения по пунктам меню; периодическое отображение какой-либо служебной информации (например, времени, выдвигая часы снизу и потом туда их убирая) и т.д.
“\“ – Вертикальный сдвиг-появление символов линейки вверх (появление вверх – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.
“/“ – Вертикальный сдвиг-исчезновение символов линейки вверх (исчезновение вверх – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.
“:“ – Вертикальный сдвиг-появление символов линейки вниз (появление вниз – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.
“;“ – Вертикальный сдвиг-исчезновение символов линейки вниз (исчезновение вниз – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.
Вот пример реализации движения по меню посредством эффектов пакета:
А это пример информационного сообщения:
Пакет управляющих символов для изменения скорости эффектов.
Следующие символы изменяют скорость прохождения эффектов.
“-“ – активируется нормальная скорость.
“+“ – активируется повышенная скорость.
Дополнительные пояснения по управления эффектами.
— Все эффекты работают независимо друг от друга. Это значит, что Вы можете запустить сразу несколько эффектов одновременно! Строка вида «_Start>*;» очистит буфер, запишет в него слово «START», запустит бегущую строку вправо, во время пробега она будет исчезать посегментно и в придачу опускатся вниз. При помощи различных комбинаций можно получить совершенно новые эффекты. Экспериментируйте!
— При подаче взаимно исключающих команд, например ”<” и “>” – сработает последняя — “>”.
— Во время действия спецэффектов можно заполнять буфер новыми словами. Они сразу же начнут участвовать в эффекте.
— Очевидно, что если количество индикаторов меньше чем величина буфера, то будут отображаться только последние введенные символы, влезшие в количество индикаторов. В противоположном случае, если буфер меньше количества индикаторов, то буфер на индикаторах будет повторяться циклически.
Прошивки для индикаторов с общим анодом (OA)
049-T13-B16-OA-UART-to-7Seg.zip (2957 Загрузок)
049-T13-B32-OA-UART-to-7Seg.zip (Одна Загрузка)
Прошивки для индикаторов с общим катодом (OK)
049-T13-B16-OK-UART-to-7Seg.zip (2527 Загрузок)
049-T13-B32-OK-UART-to-7Seg.zip (2524 Загрузки)
Фьюзы для всех прошивок одинаковы
049-fuse.png (2710 Загрузок)
Размер буфера следует выбирать, по возможности, наименьшим. Меньший буфер меньше шумит сегментами индикаторов при сдвигах и обновлениях линейки (это касается только схем без гашения индикаторов сигналом /ОЕ).
Прошивка для OA будет работать с OK-индикаторами, если в начале сеанса работы послать управляющий символ инвертирования “[“, и наоборот.
Файлы к статье:
049-7Seg-shem.zip (2690 Загрузок)
RL-S10-SERIES.pdf (3367 Загрузок)
74HC164.pdf (3672 Загрузки)
049-AB-UART-to-7Seg.zip (3226 Загрузок)
Смотрим также:
Демонстрацию устройства в следующей статье.
P.S. В процессе написания статьи появились идеи еще по нескольким дополнительным функциям, которые еще больше смогут упростить работу Вашего проекта с драйвером. В скором времени будет вторая версия прошивок для этого устройства. Если у Вас есть какие идеи или пожелания, пишите, будем их реализовывать.
AS ?
Нет, в С такого не делал.
Замечательная реализация драйвера!!!
Вот только ох как не дружу я с АБ… И насколько я знаю, из АБ никуда невозможно экспортировать исходник…
А очень хотелось бы оформить Вашу идеюв виде подгружаемых библиотек для AS (а может и для ардуинки?)…
Если конечно у Вас есть эта версия в С для AS…
EEPROM хранит информацию энергонезависимо десятки лет. Зачем батарейка? Если нужно хранить много информации есть, опять-же, энергонезависимая (внешняя) флеш-память.
@GetChiper
Вчера побывал на 20-й выставке рекламы. Пообщался с несколькими «строчниками». У всех реализация динамическая. Говорят, что при статике и управлении через SP1 даже на 2313 и сдвиговых 74hs595 все равно чтобы не при выключении не стирались значения нужно ставить батарейку. Подскажите пожалуйста, как решить это прошивкой.
Я думаю подойдет.
Вот держу в руках 2313а-пу. Как считаете, подойдет там 128 по датшиту?
64К Internal SRAM — это опечатка в даташите! Там всего 64 байта SRAM и 64 байта EEPROM.
Не вижу смысла ужиматься в тини13, можно взять микроконтроллер и поболее.
@GetChiper
А поможет если там всего 64К Internal SRAM?
После подачи питания нужно по UART заслать строку (до 64 символов). Соответственно после снятия напряжения нужно эту процедуру проделать заново.
Вам нужна немного другая прошивка для Ваших целей (может даже и на этой базе).
День добрый. Сразу прошу прощения за возможно дилетантский вопрос. Сколько в ATtiny13 остается памяти на информацию строки или он работает только используя информацию введенную на терминале? Восстанавливается ли информация после отключения/включения питания? Или нужно заново «подрубать» компьютер.
Возникло желание собрать строчку знаков на 50-60 с минимум эффектов, но работающую автономно.
Да
getchipblog собака gmail . com на этот?
Лучше по почте. У меня почти никогда не включен скайп.
у Вас есть скайп или еще какая нибудь программа по которой я смогу проконсультироваться боле менее нормально?
Теперь понял.
На печатке в нескольких местах SMD компоненты пересекают дорожки — может где неровно лежит и слегка подмыкает эту дорожку — проверьте.
А так, без платы индикаторов, там просто негде ошибиться и ток потребляемый микроконтроллером должен лежать в пределах пары десятков мА
на печатке указано 5резисторов и 2 конденсатора….может я конечно путаю и там должна быть нулевка, но вроде нулевка обозначена по другому
Вы ничего не путаете? Конденсаторы с резисторами? Или это я вопроса не понял?
собрал схему, но почему то пока не работает.
На схеме показано что на главной плате 4конденсатора, а на печатке их 5 указано. Я сделал 4: 1 на 1к и 3 по 100ом.
При подключении к ноутбуку появилась надпись «нехватка электропитания порта концентратора». На компьютере перемудрил с «Терминалом» и он у меня зависает (кто нить знает как сбросить на нем настройки, не включая его)
@GetChiper
Извиняюсь, понял 🙂
Что-то я не понял вопроса. Управление идет через SPI.
ATtiny2313
Прочитал весь сайт, автор молодец, да еще и рукастый!:) Только появилась пара вопросов:
1) Заметил, что если писать, допустим на светодиодной матрице, покадрово (т.е. развернуто)
(пример:
PORTB=0b11111111;PORTB=0b00000000;_delay_ms(1);
PORTB=0b11111111;PORTB=0b00000000;_delay_ms(1);
PORTB=0b11111111;PORTB=0b00000000;_delay_ms(1);
т т.д.), то прошивка занимает много места, т.е. получается почти на 2к, пробовал писать формулами, ничего не изменилось, прошивка весит столько же, т.е. без разницы, как писать в С, компилируется все с одним результатом, я прав?
2)Что делать, когда кончается память?:)
Спасибо за ответы)
В данной схеме никуда. Нужен для улучшенного варианта юнита отображения. В статье есть пояснение.
Добрый вечер(день). На схеме вывод ОЕ никуда кроме контроллера не подключен? Куда он идет?
@GetChiper
Насколько я знаю в протеусе нельзя выставлять фьюз биты
А моргает (мерцало) потому что малая частота (Установлен фьюз CKDIV8)
Чтобы не моргало (мерцало) надо удвоить тактовую частоту (то есть убрать фьюз CKDIV8).
Спасибо большое за ответы. Прошу прощения за !OE. Наверное торопился и пропустил важную информацию.
Буду изучать. Спасибо.
Да, протокол UART реализован программно — не смог стерпеть такого безобразия как отсутствие UART у микроконтроллера 🙂 >> http://www.getchip.net/posts/046-programmnyjj-uart-dlya-attiny13/
Из статьи:
«драйвером формируется сигнал “/OE” (Output Enable) для того чтобы избежать мерцания сегментов при сдвиге символов по регистру. В момент сдвига данных по регистру драйвер выставляет на линии /ОЕ высокий уровень, схема управления индикаторами по этому уровню сигнала должна запретить вывод данных на индикатор. В данном схемном решении этот сигнал не задействован по причине отсутствия в сдвиговых регистрах 74HC164 ножки переводящей выходы в высокоомное состояние, но можно этим сигналом отключать общий вывод индикатора (через транзистор) или использовать другую микросхему, имеющую соответствующий вход.»
Также не вижу на схеме, что !QE был куда-то, кроме МК, подключен…
Добрый день.
Хотелось бы спросить вот что. В данной схеме вы используете МК ATtiny13. Для передачи данных на него для последующего отображения используется UART.
Смотрю в даташит по ATtiny13 и не вижу функционала UART!!!
Как тогда это работает? Программно реализовали протокол?
Спасибо
С АлгоритмБилдера я сам когда-то начинал. До сих пор достаточно комфортно себя в нем чувствую. Симулятор-отладчик удобный, пожалуй, даже лучше чем в АВРстудии. Большой минус билдера — непереносимость готовых модулей и библиотек с классических ассемблера и С.
Сейчас уже достаточно уверенно помимо билдера работаю в асме АВРстудии и С КодеВизион.
Больше всех языков нравится обычный асм 🙂 Тем более, что я фанатичный ретрокомпьютерщик, а ТАМ есть великие и могучие процессоры 580ВМ80 и Z80… Которые программятся на асме.
Ну AVRовский ASM я знаю. просто Algorithm Builder у мя не работает под Linux. Algorithm Builder интуитивно не понимаю нужно разбираться. Это время со всеми вытекающими.
А с ассемблером как?
@GetChiper
Так там на Algorithm Builder мне это не понять. разве что lst от отладки раскрутить. Но это если делать будет нечего.
Так исходник в конце статьи есть.
Реализация красивая. Только использовать статическую индикацию имеет смысл в тех устройствах где остро стоит проблема ЭМС. А так недостатков очень много. И кушает поди под 1А?
@GetChiper
А реализацию эффектов где не на птичьем языке можно посмотреть? Думаю себе в универсальную приборную панель добавить. Фактически это терминал на сом порт с семисегментным индикатором и клавиатурой.
Идея такова. рулим устройством с морды. Если нужно удалённо то снимаем морду ставим RS-232 или RS-485.
Вот это верно! Мне глюков хватает на макетке, а если добавить и протеус то придется заниматься одними глюками…
Протеус не может в полной мере эмулировать устройства, поэтому нет большого смысла отлавливать в нем глюки. Протеус — это как резиновая женщина 🙂 Макетка куда как натуральней.
Насчет протеуса ничего сказать не могу — не проверяю на нем проекты.
@Яровенко Александр
У меня при попытке зашить прошивку автора в протеусе вылезает ошибка «access violation in module avr2.dll». У вас такого не было?
Готово! Выложил исходник. Немного не для показа код, но ничего, разобраться не трудно.
Как я уже писал выше будет версия 2 — на ATtiny2313. Постараюсь код писать сразу для показа.
Да конешно, буду очень благодарен
Моргание текста (еле заметное) происходит и в физической реализации, моргание в протеусе скорей всего обусловлено несовершенством программной эмуляции. Не вижу смысла что-то править в программе только лишь для того, чтобы она корректно работала в протеусе.
А исходники выложу. Только приведу листинг в удобочитаемый вид. Кстати программа написана на Algorithm Builder. Пойдет?
@GetChiper
а исходники прошивки есть возможность выложить, очень нужно чтобы разобратся в чем проблемма. За ранее спасибо.
Я с протеусом неочень. Если кто попробует — отпишитесь.
Помогите пожалуста собрал схему в протеусе прошивка атора , все работает но моргает текст при пробеге по табло если есть время гляньте , посмотрите может что не так сделал , может это в программе при эмуляции так , фаил проекта в протеусе 7 — http://depositfiles.com/files/gchm35zgs