Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
Знакосинтезирующий ЖКИ 1602 и клавиатура: экономим выводы микроконтроллера / Работа с дисплеями и графикой / Сообщество EasyElectronics.ru

Знакосинтезирующий ЖКИ 1602 и клавиатура: экономим выводы микроконтроллера

В рамках данной заметки мы рассмотрим, как можно сэкономить выводы микроконтроллера при использовании знакосинтезирующего жидкокристаллического индикатора совместно с кнопками управления меню устройства. Будет показано, что при использовании «обычного» ЖКИ (т.е. собранном на контроллере типа HD44780) и «стандартном» способе управления меню (кнопки «MENU/SELECT», «UP», «DOWN», «+» и «-») для опроса кнопок не требуется каких-либо дополнительных ресурсов камня, кроме уже задействованных под управление индикатором:



Третьего дня накропал заметку на тему, указанную в названии данного топика. Честно говоря, на протяжении нескольких лет думал, что сии сведения на предмет непонятности и, главное, неочевидности стоя́т примерно в том же ряду, что и расчет резистора для светодиода. Однако, реальная жизнь показала, насколько глубоко я ошибался.

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

Лирическое вступление

Лично для меня проблема экономии выводов камня при работе с ЖКИ и кнопками управления пунктами меню встала сразу же после первого опыта работы с кирпичом ATMega48 (ну, или какого-то другого пин-ту-пин совместимого с ним, сейчас не вспомню). Ранее для управления индикатором я «честно» выделял 7 выводов МК (см. 4-х битный режим), да еще минимум 5 выводов – на кнопки навигации по меню. Однако, быстро выяснилось, что для камней линейки ATMegaX8 подобный подход – непозволительная роскошь: бросать 12 из 20 «полноценных» выводов кирпича на вспомогательную, в общем-то, работу мне показалось совсем уж расточительным. Я стал прикидывать, как бы мне сэкономить выводы кирпича, и вскоре оказалось, что в реальности для управления как индикатором, так и меню достаточно всего пяти выводов МК. От разницы между «12» и «5» я сперва несколько охерел и стал подозревать нехорошее. Однако, опыты в железе показали, что все «бумажные» выкладки и расчеты действительно корректно работают и в реальной жизни. В общем, порадовался я за себя, что в который раз изобрел собственный велосипед, да и успокоился – просто начал применять «экономный» подход во всех своих поделках.

А тут в ходе очередной дискуссии поинтересовался у двух знакомых – как они подходят к данной проблеме. Их ответы меня несколько озадачили. Один сообщил, что подобные мелочи его вообще не па́рят – я, говорит, во все свои проекты ставлю Мегу128 и выше, да и вообще с ЖКИ работаю в 8-ми битном режиме. Ну что тут скажешь – красиво жить не запретишь, да: засрать 128-ю мегу так, чтобы не хватило выводов отдельно на кнопки довольно сложно. А вот второй рассказал, что для экономии портов МК при работе с индикатором и кнопками использует такой же подход, какой реализован во всем известном шылде для ардуины «LCD1602»:



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

Оптимизация управления ЖКИ

Тут всё просто и очевидно, наверное, даже для начинающих. Известно, что знакоситезирующие ЖКИ могут работать как в 8-ми битном режиме обмена данными, так и в 4-х битном (см. соответствующие даташыты). В первом случае можно несколько ускорить скорость общения с индикатором, но зато во втором нам для связи с индикатором надо на 4 линии управления меньше – всего 7 линий вместо 11-ти для 8-ми битного режима: «R/W», «RS», «E», «DB7», «DB6», «DB5», «DB4» (т.е. в данном режиме работы линии «DB3»-«DB0» не используются). И поскольку жидкий индикатор сам по себе далеко не быстродействующее устройство, то как-то так исторически повелось, что для экономии выводов МК все используют 4-х битный режим обмена данными с ЖКИ.

Далее, из вышеупомянутых 7 линий управления одна (это которая «R/W») отвечает только за режим обмена данными с индикатором. Если R/W=1, то можно считать инфу с ЖКИ, а если R/W=0, то инфу в индикатор можно записа́ть. В подавляющем большинстве случаев режим чтения данных с ЖКИ не используется (в полной версии заметки объясняется почему), поэтому вывод «R/W» можно тупо заземлить. В итоге со стороны микроконтроллера шина управления ЖК-модулем сокращается до 6 линий («RS», «E», «DB7», «DB6», «DB5», «DB4»), и это максимум, до чего ее вообще можно дооптимизировать.

Оптимизация подключения кнопок навигации по меню

Как было сказано ранее, в большинстве случаев основным режимом работы ЖКИ (который мы и рассмотрим далее) будет «4 бита + только запись» (в смысле – только запись данных в индикатор), поэтому для управления индикатором нам потребуется всего 6 линий микроконтроллера. Далее нам нужно вспомнить, что шина обмена данными с индикатором является стробируемой. Это означает, что пока на линии «Е» не будет сформирован задний фронт импульса (хотя, возможно, существуют разновидности ЖКИ, стробируемые по переднему фронту), индикатору совершенно плевать, что́ происходит на других его линиях данных. Иными словами, пока не будет выставлен нужный строб на линии «Е», мы можем творить что угодно (замыкать какую угодно линию на плюс или на массу) – соответствующие данные в ЖКИ всё равно не запишутся. А это означает то, что мы можем подключить к линиям «RS», «DB7», «DB6», «DB5», «DB4» вышеупомянутые кнопки (естественно, названия кнопок даны условно; в реальности они могут иметь какой угодно функционал) и дрочить их как нам заблагорассудится, пока не нужно будет записать что-либо в ЖКИ (главное – не куролесить на линии строба). Никакого влияния на информацию, отображаемую на ЖКИ, это дрочительство не окажет, а вот считать состояние кнопок камнем мы вполне сможем («стандартный» опрос входа в то время, когда на ЖКИ ничего отсылать не надо). Ну а когда нам понадобится вывести что-то новое на индикатор, мы просто выдадим на линии «RS», «DB7», «DB6», «DB5», «DB4» нужный код и дадим строб на линию «Е».

Общая схема

В железе для оптимизации связи с индикатором в данном случае наиболее бюджетно будет построить вот такую схему (сразу включив сюда и кнопки управления устройством):



Обратите внимание на то, что, как и было оговорено ранее, индикатор работает в режиме «только запись» (т.е. в него можно только записывать информацию), поскольку вывод R/W у него заземлен. Камень ATMega8, как и названия портов, к которым подключен индикатор и кнопки, взят просто для примера. Для других вариантов кирпичей тут важно лишь два момента:

— соответствующие порты МК (PD1, PD7-PD4) должны уметь работать и как входы, и как «Push-Pull» выходы (пуш-пул — это важно, см. комментарии к заметке);
— порты камня, к которым подключаются кнопки, при работе в качестве входов должны иметь внутреннюю подтяжку к плюсу питания. Если в микроконтроллере на аппаратном уровне данная фича отсутствует, необходимо будет реализовать подобные подтяжки внешне.

Принцип работы предлагаемой схемы (ра́вно как и алгоритм программы) достаточно прост. Для опроса состояния кнопок выводы PD1, PD7-PD4 МК должны быть настроены на вход и подтянуты к плюсу питания резисторами (вывод PD0 лучше всегда делать выходом, и в те моменты времени, когда общения с индикатором нет, на нем должен присутствовать логический нуль). Данный опрос кнопок является «традиционным», т.е. камень, например, просто поочередно проверяет сигнал на цифровых входах PD1, PD7-PD4 (можно также прикрутить сюда прерывания – вариантов реализации опроса масса). Поскольку эти входы подтянуты к плюсу, ненажатому состоянию кнопки будет соответствовать логическая единица, а нажатому – логический нуль (при обработке сигналов от кнопок не забываем о «дребезге» их контактов). А поскольку строб для ЖКИ (линия «Е») отсутствует, всё, что происходит на линиях «RS» и «DB7»-«DB4» индикатором игнорируется, т.е. различная ахинея, соответствующая разным комбинациям нажатых/ненажатых кнопок, просто проходит мимо ЖК-модуля. Отметим, что т.к. ЖКИ работает в режиме «только запись», линии его управления «DB7»-«DB4» являются входами, поэтому никакого влияния на выводы PD7-PD4 микроконтроллера оказывать не будут.

Как только появляется необходимость пообщаться с ЖКИ, линии PD1, PD7-PD4 камня должны быть переведены на выход. Далее на этих линиях выставляется код, соответствующий передаваемой в индикатор информации, и даются стробы по линии «Е», т.е. производится обычная запись данных в ЖКИ по 4-х битной шине. Отметим, что код, выставляемый камнем на выходах PD1, PD7-PD4 никак не будет «испорчен» кнопками. Если кнопка не нажата, то на соответствующий выход МК не оказывается никакого влияния (т.е. на нем будет именно то значение, которое мы выставили). А если кнопка нажата, то по этому выходу просто потечет дополнительный ток, значение которого будет ограничено за счет резисторов R1-R5, при этом состояние выхода тоже не изменится. Выбор номиналов данных резисторов подробно рассмотрен в полной версии заметки, здесь же просто отметим, что для камней ATMega эти резисторы лучше выбрать равными 3,3…4,7кОм. Таким образом, получаем, что с одной стороны информация в индикатор будет передана верно, а с другой – выходы PD1, PD7-PD4 микроконтроллера заведомо не сгорят даже в том случае, когда соответствующая кнопка (или кнопки) будут нажаты. Ну а после передачи данных в ЖКИ нужно снова перевести выводы PD1, PD7-PD4 на вход и подтянуть их к плюсу питания для последующего опроса состояния кнопок.

Лирическое заключение

Вот, в принципе, и вся «наука». Честно говоря, я не совсем понимаю, почему в широко распространенном шылде «LCD 1602» применен не рассмотренный принцип опроса кнопок, а АЦП-шный. Ведь в том включении, который реализован в шылде, в общем случае невозможно даже определить одновременное нажатие нескольких кнопок. Да и номиналы соответствующих резисторов разные, что с точки зрения массового изготовления не совсем корректно. В общем, одни вопросы к шылду «LCD 1602», да.

Ну и последнее. Бывает так, что для управления простеньким меню нам вполне будет достаточно и трех кнопок вместо пяти, а вот дополнительная светодиодная индикация (например, режимов работы устройства) не помешает. В этом случае, конечно, никто не запрещает взамен «ненужных» кнопок воткнуть светодиоды, уменьшив сопротивление соответствующих резисторов из числа R1-R5. Однако, лучше так не делать. Сгореть, конечно, в данном случае ничего не сгорит, но. Во время отправки инфы в индикатор те светодиоды, на которые будет подана логическая единица, начнут светиться. А если в другие моменты времени они не горят, то мы получим «паразитные» вспышки. Отмечу, что человеческий глаз легко замечает вспышки длительностью даже 60-70мкс на обычных «прозрачных» светодиодах. Ну а при управлении индикатором наиболее распространен случай, когда для формирования «длины посылки» используется не флаг занятости BF, а тупые задержки, при этом длительность вывода на экран одного символа в 4-х битном режиме составляет обычно не менее 74мкс. Таким образом, светодиоды в любом случае начнут случайным образом мигать тогда, когда от них этого не требуется, поэтому заменять кнопки светиками категорически не рекомендуется.

Ну а на сегодня всё. Желаю удачи при работе с ЖКИ и кнопками!

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

RSS свернуть / развернуть
> Для опроса состояния кнопок выводы PD1, PD7-PD4
> МК должны быть настроены на вход

> Как только появляется необходимость пообщаться с ЖКИ,
> линии PD1, PD7-PD4 камня должны быть переведены на выход.

то есть должна быть дополнительная кнопка, по которой выходы PD1,4-7 меняют свое назначение? Прежде чем я нажму кнопку «Select» (к примеру) требуется дополнительные действия?
0
не, камрад, дополнительной тряхомудии не нужно — в этом-то и весь смысл. всё получается автоматически — и опрос кнопок, и общение с ЖКИ

[думает, как объяснить]

ну вот, к примеру. надо тебе выводить на индикатор результат преобразования АЦП два раза в секунду. ты же ведь сам знаешь, когда именно тебе его надо вывести, безо всяких дополнительных кнопок. и вот перед тем, как вывести результат на экран, ты делаешь PD1,4-7 выходами (сам делаешь, в программе). далее отправляешь в ЖКИ нужную информацию (выводишь данные с АЦП). всё, после этого порты PD1,4-7 опять переводятся на вход (опять же — ты сам знаешь, когда это сделать) и можно дальше опрашивать кнопки.

сцуко, выложить бы пример работы, да только я тот еще программист:) всё, что есть — оно на асме, да еще на дьявольской смеси «асм+макросы». т.е. это еще три-четыре заметки надо накропать только для того, чтобы рассказать о работе подпрограмм:)
+1
Аа, вот оно что) про автоматический переход состояний сразу перед/после вывода на экран как-то проглядел… Тогда да, интересный метод (;
0
обращаю внимание: при выводе инфы в индикатор тебе вообще не надо заморачиваться, нажаты ли какие-нибудь кнопки или нет — передаваемый тобой в ЖКИ код в любом случае не испортится.

именно в этом фича предлагаемого подхода: когда надо опрашивать кнопки, ты просто делаешь порты входами и опрашиваешь кнопки. при этом ты можешь быть уверен, что сигналы от кнопок ничем не будут «испорчены». аналогично для вывода информации на ЖКИ — делаешь порты выходами и передаешь индикатору данные. при этом, опять же, схема тебе гарантирует, что требуемый код будет доставлен в ЖКИ без косяков, вне зависимости от того, нажаты ли какие-нибудь кнопки или нет. Т.е. «правильность» данных что для кнопок, что для ЖКИ гарантирована на аппаратном уровне, никаких дополнительных ухищрений применять не нужно.
0
Я похоже делал (точнее собирался, до того девайса руки до сих пор не дошли, хотя планам уже лет пять минимум). Только не додумался поставить резисторы и подключить кнопки к земле, вместо этого дополнительная линия опроса кнопок и диоды. Впрочем, еще не поздно поменять на твое решение, оно мне больше по нраву :D
И поскольку жидкий индикатор сам по себе далеко не быстродействующее устройство
Я бы предположил, что дело не столько даже в быстродействии, сколько в том, что его практически никогда не подключают так, как он рассчитан — в шину RAM.
шылде
Ну ладно «дывайс», но как же «жы шы пишы через ы и»?!11
В подавляющем большинстве случаев режим чтения данных с ЖКИ не используется (в полной версии заметки объясняется почему)
Вообще, режим чтения из индикатора полезен для чтения busy-флага, вместо пихания «заведомо достаточных» задержек. Да и можно повесить еще одну кнопку!
А вот E и RS можно попробовать мультиплексировать в один пин, формируя RS RC-цепочкой (т.е. короткий импульс — пишем команду, длинный — данные, или наоборот).
— соответствующие порты МК (PD1, PD7-PD4) должны уметь работать и как входы, и как выходы;
Я бы уточнил — не просто выходы, а push-pull выходы. Потому что квази-двунаправленные порты 8051 указанным тобой требованиям соответствуют, но работать не будут. Точнее, при нажатых кнопках до ЖК не будут доходить команды…
0
  • avatar
  • Vga
  • 12 ноября 2016, 01:55
но как же «жы шы пишы через ы и»?!11

ща еще treasure подтянется, будет вообще финиш:) все дурацкие слова надо писАть по-дурацки. сто раз приводил пример: «даташыт» — слово суровое даже по виду, с ним не забалУешь. а «даташит» — бля, ну это уж совсем нечто зачморенное, тьфу [при взгляде на слово почувствовал физическое отвращение]

режим чтения из индикатора полезен для чтения busy-флага

так и есть (про это рассказано в полной заметке, здесь не счел нужным расписывать). однако, сколько я видел проектов с ЖКИ — подавляющее большинство использовало тупые задержки длительностью 40-50мкс (да и сам я точно также делаю:).

при нажатых кнопках до ЖК не будут доходить команды…

а чего у них там? (надо будет глянуть структуру пинов у этих 8051)
0
Опендрейн с подтяжкой. Когда закрыт — оно работает как выход в состоянии «единичка» или вход с подтяжкой, когда открыт — выход в «нуле». Позволяет обойтись всего одним битом на (квази)двунаправленный пин.
0
ужос нах. хотя всего один бит, ммм...:)
0
Ужоснах, кстати, до сих пор живет даже в новых чипах — например, NXP-шные I2C-GPIO из известной акции «буклетик с чипами» сделаны именно так.
0
пример: «даташыт»
А, да, про даташыт я как-то совсем запамятовал.
0
push-pull выходы

добавил. замечание и впрямь существенное
0
тебе, кстати, не попадалась документация на контроллеры, которые используются в ЖКИ, где был бы указан максимально допустимый ток выхода по линиям «DB7»-«DB0»? а то перерыл с десяток различных даташытов — абсолютные максимальные рейтинги во всех как под копирку: напряжение питания ядра/матрицы, входное напряжение, да температура работы/хранения. да как же так-то, ёлы-палы — выход у вас есть, а максимально допустимого тока через него нет? и ведь для всех контроллеров приводится одно и то же.
0
Не помню такого. Можешь попробовать почитать старый тошибовский даташит на HD44780 — он километровый и на сам чип. Хотя AMR китайских клонов могут отличаться.
0
тошибовский

а не Hitachi-вский? с него и начинал, нет там ни хера:) более того — видимо, документация на более новые контроллеры передрана именно с него, так что всё плохо:)
0
Может и хитачевский, я что, помню чтоль? Помню что он японский, длинный и с распиновкой чипа (на редкость бесполезная для любителей инфа, учитывая корпусировку...).
Я бы просто исходил из того, что больше 1-2мА оно не даст.
0
больше 1-2мА оно не даст

да там даже меньше, видимо. по крайней мере, в условиях, для которых приводятся выходные уровни нуля и единицы, фигурирует 0,1мА максимум (где-то видел 0,5мА). ну, в общем, и хер с ним, с этим током:) для подавляющего большинства случаев управления индикатором он на хер не нужен:)
0
А я для себя решил проблему подключения дисплейчика вот таким образом — we.easyelectronics.ru/part/i2c-rasshiritel-portov-pcf8574.html через шину I2C. То есть фактически используется ноль выводов — при условии, что шина I2C используется еще и для чего-нибудь другого.

Причем уже шилдик собрал, и штатную LCD-библиотеку модифицировал, благо простая она до безобразия, и даже полстатьи про него написал, да времени перестало хватать, так и лежит в черновиках…
0
А вот, кстати, и упомянутый мной I2C-GPIO с квазидвунаправленными портами а-ля 8051)
0
дык вариантов подключения — масса. я тут только про то, что при «штатном» включении ЖКИ можно туда же повесить еще и пять кнопок без отжирания лишних аппаратных ресурсов камня (правда, пять «лишних» резисторов всё же добавится)
0
И то — если подтяжки к плюсу нет) хотя Хальт в какой-то из статей вроде писал, что подтяжки внутренние — хилые и на них лучше не полагаться
0
Можно и свои добавить, 47к к плюсу.
0
Что то мне подсказывает, что в случае когда контроллер передает данные на ЖКИ, а оператор нажимает на кнопки могут изменятся данные при выбранных номиналах резисторов, ведь там не больше 1В остается при 5В питания. Или как?
0
А дочитался, вопрос снимается.
0
Ведь в том включении, который реализован в шылде, в общем случае невозможно даже определить одновременное нажатие нескольких кнопок. Да и номиналы соответствующих резисторов разные, что с точки зрения массового изготовления не совсем корректно. В общем, одни вопросы к шылду «LCD 1602», да.

Так они ведь и сделаны разными для возможности определения одновременно нажатых клавиш.
0
это неверно. если нажать, к примеру, верхнюю по схеме кнопку, вход АЦП притянется к земле. после этого какую бы ты кнопку (или несколько) одновременно с верхней не нажал — картина на входе АЦП не изменится, следовательно, отловить даже две одновременно нажатые кнопки мы не сможем.

по уму, для возможности реализации подобной фичи надо было бы кнопки не на землю сажать, а параллельно резисторам.
0
Честно говоря, я не совсем понимаю, почему в широко распространенном шылде «LCD 1602» применен не рассмотренный принцип опроса кнопок
Искать логику в схемотехнике ардуиновских шилдов — дело не благодарное. Вполне может оказаться, что кто-то изначально выпустил шилд с кнопками на АЦП с таким соотношением резисторов, и теперь все это повторяют ради «совместимости».
0
ну, я по большому счету как бы и не ищу:) просто удивляюсь — ну неужели у людей не возникает мысль, что как-то всё не совсем оптимально сделано?
0
Врядли те, кто собирает из ардуино-шилдов сильно парятся за оптимальность. Уже готовое, работает, библиотека есть — ну и чудно.
0
Интерфейс ЖКИ 4 бита и только запись я с некоторого времени использую всегда. Koyodza на пустыне (он и здесь зарегистрирован, но в последнее время что-то его на этом форуме не видно) подсказал мне следующий способ. Создается буфер размером в кол-во строк * кол-во символов. И посимвольно, скажем, раз в 1 мс выводим. Полное обновление экрана 20х4 происходит за 20*4+4 адреса строки = 84 мс. дело в том, что ЖКИ очень неплохо ловят помехи. И если ничего не выводить в течении длительного времени, то на экране появляются кракозябры. Притом я это наблюдал в достаточно тепличных, домашних условиях.
Естественно, при таком подходе кнопки к шине дисплея уже не подключить. Для расширения ввода-вывода я использую сдвиговые регистры 74HC165 и 74HC595. Но и тут есть своя ложка дегтя. Эти регистры тоже чувствительны к помехам. Поэтому их использовать в не ответственных узлах. Типа опроса интерфейсных кнопок и светодиодных дисплеях, матрицах. Помеха на кнопки подавится антидребезгом, на светодиоде, ну мыгнет светодиод. Не критично.
0
дело в том, что ЖКИ очень неплохо ловят помехи.
Все так плохо? Даже если постоянно держать жесткие уровни на шине, не отпуская ее в свободное плавание на подтяжках?
Естественно, при таком подходе кнопки к шине дисплея уже не подключить.
Почему же? Никто не мешает проверять кнопки в паузах между отправкой символов в дисплей.
0
в достаточно тепличных, домашних условиях

а какие именно условия? например, откуда в хате источник таких мега-помех? и, главное, какая именно модель индикатора (чтоб знать, какие не покупать ни в коем случае нельзя:)?

раз в 1 мс

имхо, совсем уж сурово. этак получается, что неслабую часть времени процессор расходует на не особо нужные действия. я остановился на обновлении экрана два раза в секунду. для 4-х битного режима работы и индикатора 16х2 обновление занимает минимум (16х2)х2х40мкс=2.56мс, с учетом всяких дополнительных команд округлим до 3мс. в любом случае, даже 3 мс — это всего 0,6% от 500мс, а остальное время камня можно отвести на опрос кнопок и прочие полезные действия. при этом даже если ЖКИ словит какой-то глюк (чего за ними лично я, честно говоря, не припомню), пользователь за 0,5сек его не заметит (а если и заметит — не поймет, про что этот глюк).
0
Спасибо за труд, podkassetnik . Без сарказма. Хороший материал для тех, кто не знал подобного способа или у кого проблемы с английским. Есть вот аппнот от Atmel-а документ, последняя ревизия 2005г, и даже контроллер AT90S1200 — музейный!
В общем, не ленитесь читать Application Notes. В том числе производителей контроллеров, которые вы не используете. По каким-то ARM-ама есть арифметика с фиксированной точкой; у NXP видел как сравнить разводки печаток для АЦП,…
0
В такой схеме будут паразитные засветки индикатора при нажатии кнопок, насколько я вижу. Хотя и довольно тусклые.
0
А транзисторы на что?
0
Разрядные? Они не играют роли, кнопки соединяют между собой сегментные линии, так что зажигая один сегмент — зажжешь и второй, через кнопку и два 2.7к резистора.
0
не будет ничего… с чего вы взяли?
На момент отображения выходы контроллера полностью нивелирует кнопки, потом транзюки вырубаются — ножки на вход с подтяжкой… и где тут засветка?
0
А, да. На сей раз я сам забыл про пуш-пулл выходы) Но если использовать открытый сток (или QBD) — то таки подсвечиваться будет.
0
[смеется] ну вот, тезис про велосипед подтвердился официально:)

не ленитесь читать Application Notes

именно так. но беда тут не столько в английском, сколько в том, что этих апнотов наклепали целый железнодорожный состав. и зачастую проще самомУ изобрести велосипед, чем найти то, что нужно. ибо задать правильную ключевую фразу гуглу — тоже не так-то просто:)
+1
Америку открыл.
0
  • avatar
  • Kino
  • 17 ноября 2016, 22:15
Так прямо в начале поста написано — автор удивлен тем, сколько народа не знает о существовании америки.
0
[махнув рукой на всё] о чем ты, камрад? мало ли что там в заметке написано — нахера ее вообще читать?:) смотрим шапку и картинку — вуаля [блюёт], мы ужЕ про всё в курсе:)
+1
да:

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

Видя реакцию на свои слова, я в который раз понял, что очевидное для меня не является очевидным для всех, поэтому приступил к написанию заметки на данную тему.

[смеется] ну вот, тезис про велосипед подтвердился официально:)

а что не так?
0
стоя́т примерно в том же ряду, что и расчет резистора для светодиода
И про это тут тоже есть статья!
0
тьфу, опять америка. несерьезно!!:)
0
Добрый день, уважаемое сообщество.
А почему это нельзя диоды подключить? Разве вот такая схема работать не будет?

Когда надо зажечь светодиоды, PD0 в низком уровне, а шина данных работает на выход. Когда надо опросить кнопки — переводим шину данных на вход и считываем состояние кнопок. Резисторы не рассчитывал, так от балды написал значения.
0
А почему это нельзя диоды подключить?

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

у тебя на схеме база привязана к стробирующей линии, а это не хорошо. строб от балды мы дергать не можем — по его заднему фронту в индикатор запишется то, что присутствует на шине данных. т.е. под управление ключом в любом случае надо будет заюзать один дополнительный вывод камня. это, в общем-то, прекрасно — всего одна линия вместо пяти. но! я не спец по транзисторам (пусть знающие камрады меня поправят), однако на мой взгляд ключ на твоей схеме вообще никогда не откроется. а вот если взять npn, эмиттер повесить на массу, в коллектор воткнуть светики с резисторами, а базой управлять как раз отдельным пином кирпича — тогда, наверное, да, что-нибудь получится.
0
я не спец по транзисторам (пусть знающие камрады меня поправят), однако на мой взгляд ключ на твоей схеме вообще никогда не откроется
Почему ты так считаешь? Вроде ж обычный ОК.
0
говорю ж — не спец:) таки-да, откроется. тогда должно работать. только надо так частоту обращений к ЖКИ выбирать, чтобы и светодиоды не моргали, и кнопки не тормозили
0
простите, а в чем «соль» такой гиперэкономии ножек? Не проще ли взять камень понагастей? Или это чисто спортивный интерес?
0
Мне кажется, лучше всегда иметь в запасе Tip&trick, когда камень ну всем устраивает, но не хватает, например, 1 ноги. Можно, как уже упоминалось, задействовать IIC расширители портов и т.д., но зачем? копеечные транзистор, плюс, может быть, конденсатор, решат проблему, к тому же доп код для этого будем имхо меньше, чем код на обслуживание IIC.
0
Не проще ли взять камень понагастей?
Не всегда.
0
я как-то лед 8-10 назад делал 1-проводный интерфейс для 4х разрядного 7-сегментного LCD-индикатора (т.е. голый ЖК, Без каких либо контроллеров, марку не помню, вроде толи из часов, толи ещё хз откуда). Так получилось замечательно: на PIC12F683 подпрограмма на 8 МГц отницамала всего 12% времени при этом реально по 1 проводу (т.е. к индикатору шло 2 провода: сигнальный и земля) передавались: питание, данные для создания переменного напряжения ЖК, собственно данные для индикации с частотой вроде бы 25 Гц, да ещё и опрашивалось оттуда 2 кнопки. Когда сделал, сам офигел В) а ещё больше офигел от точности АЦП этого ПИКа — 4й разряд не дёргался, стоял как вкопанный. Так что ног никогда не бывает слишком много. В)Чем больше ног — тем сложнее их развести на плате.
+1
Это сколько ж рассыпухи вокруг индикатора навешано было?
0
5 КМОП счетчиков, транзистор и пяток резисторов-конденсаторов. Но в том случае это был действительно спортивный интерес. Хотя в любом случае, если не брать камень на порядок дороже, пришлось бы городить какую-нибудь схему, пусть и не однопроводную, но какие-нибудь буферы всё равно бы потребовались.
0
Доставь схему.
0
Сейчас уже не найти за давностию лет.
Если память не изменяет, там было 4 счётчика К561ИЕ10, 1 К561ИЕ8 (он давал разрешение на счёт каждому полусчётчику в отдельности по очереди), и RC-цепи для формирования сигналов сброса, строба и т.д., Для LED-индикаторов ставил ещё транзистор, который включал индикаторы после полной загрузки данных (т.е. отключал кажись аноды до окончания загрузки данных).
0
А как генерировал переменку для ЖК? Перезагружал счетчики инверсным значением 50 раз в секунду?
0
именно так. частоту уже точно не помню, но мерцания не было. Сейчас вот ещё раз вспоминаю-вспоминаю, никак не могу вспомнить, сколько времени выполнялась подпрограмма передачи. Но хорошо помню картинку с осциллографа: скважность была порядка 25% на 4 МГц, потом повысил до 8 МГц, и скважность должна была в 2 раза уменьшиться. т.е. 12-15%.
в принципе, можно посчитать. Требовалось на каждый разряд не больше 32 импульсов, разрядов 4, плюс накладные расходы, примерно 160 импульсов. 1 импульс 1 мкс (при частоте камня 8 МГц). Тогда при частоте обновления 50 Гц, получается 8 мс. Я не учитываю время подготовки данных, дешифрования, только передачу. т.е. чисто передача занимает 8/1000 = 0,8%. У меня получалось 12% скорее всего из-за времени подготовки данных (сдвиг, перестановка нибллов и т.д. Там ещё переключение банков было). Провод был длинной сантиметров 70, обычный двухжильный, не экранированный, ни витой. Кондеры во времязадающих цепях были 5-10 пикофарад. т.е. пальцем ткнёшь в плату — и ничего не работает… но без тыкания пальцем не было ни одного видимого на глаз сбоя. Если и были единичные ошибки, то при частоте 50 Гц они не заметные. Была у меня идея статью написать, но мне показалось что это опять «открывание Америки».
+1
Была у меня идея статью написать, но мне показалось что это опять «открывание Америки».
А зря, было бы интересно взглянуть. Хотя, в принципе, идея понятна.
0
А что за девайс это вообще был?
да ещё и опрашивалось оттуда 2 кнопки
А кнопки как опрашивались?
0
Это был вольтметр с функцией калибровке… задумывался как приставка для контроля заряда/разряда аккумуляторов, но так дело и не дошло (хотя, потом вроде допилил на управление реле «включение/отключение» заряда. Кнопками кажется задавались верхняя и нижняя границы.
Кнопки, если мне память не изменяет, опрашивались по той же линии пятый счётчик имел 10 выходов: 8 использовались для других четырёх счётчиков, а 2 для кнопок… или 1 для кнопок по принципу опроса кнопок с помощью RC-цепочки и подтягивания «к верху» и «к низу». Т.е. контроль 2х кнопок от одного пина микроконтроллера (из tip&trics от микрочипа). Точно уже и не помню, как сделал. Просто было 2 вариации: одна на LED, другая на LCD… там количество свободных состояний пятого счётчика было различным (на LED использовались только 3 разряда). А, кажется вспомнил, на LCD для одной из кнопок использовался выход для десятичной точки первого разряда (там не могла стоять точка в принципе) или последнего… не важно В). В общем, извращался, как мог. Алгоритм был такой: на плате индикатора стоял конденсатор питания, который заряжался через диод от линии данных и питал всю схему. После передачи данных линия от микроконтроллера переводилась кратковременно на чтение, в этот момент к линии данных до диода (питания) подключались кнопки через достаточно большое сопротивление (вроде десятки килоом). считывалось значение и порт быстро переводился на выход и устанавливалсся в значение 1 (для питания индикатора). И так на каждом цикле записи содержимого индикатора.
0
Да, забавный изврат.
А почему ты использовал счетчики, а не регистры вроде 74HC595? Ими тоже вполне можно рулить по одному проводу, при этом не потребуется управляющий счетчик — можно один корпус сэкономить.
А как редактировать свои сообщения? А то и опечатки замечаю потом, да и добавить иногда надо.
Никак. Если опечатка критична для понимания — можно добавить пост с коррекцией. Если не критична — просто забить.
0
Не использовал, потому что не было их у меня. Счетчики эти валялись кучками. Кстати, такой регистр я вроде тоже пробовал (русский аналог) но почему-то не задалось. Есть мысль как на них по одному поводу писать? Там были какие-то неувязки со сдвиговыми регистрами. Или я тогда еще не достаточно разобрался, или уже не помню почему, но я не смог придумать, как быстро и не накладно управлять 4мя линиями по одному проводу. И.е клок, дата, строб на запись в параллельный регистр. Чего-то забыл, что же было четвертым… Или все-таки они линии по минимуму?
0
Идея там примерно та же — использование RC-цепочек для формирования нужных сигналов. ЕМНИП, про это была статья или тут, или на easyelectronics.ru.
Примерная суть: клок подключаем прямо ко входному сигналу, данные — через интегрирующую цепь. При подаче короткого импульса конденсатор не успевает зарядиться и в регистр записывается 0, при подаче длинного — конденсатор успевает зарядиться и в регистр записывается 1 (для подачи питания это дело можно инвертировать — 1 передается как короткий нулевой импульс, 0 как длинный, нормальное состояние линии — 1). Не помню, как был реализован латч. Возможно — еще более длинный импульс или же по завершении пачки импульсов (т.е. одновибратор, который ресетится поступающими импульсами, по завершении выдержки — выдает импульс на латч).
0
А как редактировать свои сообщения? А то и опечатки замечаю потом, да и добавить иногда надо.
0
ну, тут нет гиперэкономии. если пять пинов один хер используются для ЖКИ, то почему бы их не задействовать под кнопки (тем более, что ни схема, ни программа при этом практически не усложнится)?

а насчет камня — камрады правильно подметили, что порой не хватает одной-двух ног МК. понятно, для домашних поделок можно взять камень побольше — лишние пятьдесят рублей ничего не решат. но даже на мелкой партии в сотню штук это даст экономию в 5 тыщ рублей. естественно, на фоне общих затрат данная экономия будет, скорей всего, забавной. но в любом случае — зачем тратить лишние деньги, если можно этого не делать?
0
по схеме: Так работать не будет, потому что при использовании PD0 на нужды индикатора мы получим непреднамеренное открывания транзистора, который будет подсвечивать диоды, в зависимости от состояния выводов D4-D7
0
Не понимаю пока почему: когда PD0 в высоком уровне, транзистор всегда закрыт (переход Э-Б обратносмещен), а короткие стробы PD0 (высокий-низкий-высокий) для того чтобы пропихнуть данные в индикатор не успеют засветить светодиоды (точнее глаз этого не заметит). На крайняк можно RC-цепочку поставить. Я так понимаю, стробы эти будут порядка микросекунды или даже меньше.
0
поверьте, этого может быть вполне достаточно, чтобы заметить мельтешение засветки. Учтите, световосприимчивость глаза логарифмическая. В самом начале график логарифма весьма крутой.
0
специально полез в даташит: для 5вольтового индикатора время установки данных 80 нс, время удержания — 10 нс. Минимальное время импульса — 230 нс. Минимальное время цикла записи — 500 нс. При частоте камня 16 МГц самый простой ногодрыг у нас получится что-то около 120 нс. Т.е. я себе так вижу:
PD0 = 0, шина на выход, там данные светодиодов-они светятся. — исходное состояние
PD=1, шина на выход, данные СД (СД не светятся)- 120 нс
PD=1, шина на выход, данные для индикатора (1 ниббл). (R-M-W для регистра: 2 такта вроде — 120 нс, можно доп. операцию выполнить, например, подготовить второй ниббл, т.е. ещё 120 нс)
PD=0, строб данных, шина на выход, данные индикатора (СД могут светиться), — не меньше 120 нс,
PD=1, СД могут засветиться (120 нс)
PD=1, данные индикатора, второй ниббл (240 нс).
PD=0, строб данных, СД могут загореться. (120 нс)
Дальше ставим 1 и делаем спокойно подготовку очередного байта.
Т.е. даже в цикле записи 1 байта скважность получается около 1/4

С учётом того, что мы пишем в индикатор не постоянно, очень вероятно, что скважность окажется значительно ниже 1%, что глазу будет не заметно.
(кто-то приводил данные, что у него запись всего индикатора занимат 2.4 мс, обновляет он его 20 раз в секунду, т.е. 50 мс.
50/1000=0.5% — ну точно будет не заметно. Я даже сомневаюсь, что
0
0.5 % это очень много, чтобы увидеть подсветку.
0
самый огромный разрыв яркости — это между полной темнотой и самой минимальной засветкой.
0
Спасибо огромнейшее за материал!
0
на здоровье, камрад. приходите к нам еще:)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.