July 2025

S M T W T F S
  12345
67891011 12
13141516171819
20212223242526
2728293031  

Style Credit

Expand Cut Tags

No cut tags
Saturday, January 10th, 2015 22:44
Как вы относитесь к легализации курения мануалов?
Вопрос на собеседовании.

Господа и дамы, френды и френдессы, я знаю, среди вас достаточно много умных людей, которые понимают в электронике, электротехнике, схемотехнике и программировании микроконтроллеров с помощью Visual FoxPro! Не дайте пропасть начинающему погромисту, объясните, почему нижеприведённая схема не будет работать?


Это всё ещё для моего проекта по индикации всего-всего. По сравнению с предыдущим разом схема переработана и дополнена.

Пояснения в двух словах, с начала к концу:

  • Демультиплексор (в верхнем левом углу) получает на вход три бита, после чего подаёт 5 вольт на одну из своих ножек вывода. При некотором удачном стечении обстоятельств, номер этой ножки будет соответствовать числу, полученному на вход в бинарном виде: при 100 включится четвёртая ножка, при 010 — вторая, и так далее. На остальных ножках при этом остаётся ноль. Всего ножек восемь.
  • К каждому выводу демультиплексора через килоомный резистор подключена база NPN-транзистора. (На схеме показан только один транзистор, потому что схема подключения остальных абсолютно такая же). NPN-транзистор позволит течь через себя току, если на его базу подано напряжение. Таким образом, в каждый момент времени только один транзистор будет открыт, остальные семь будут закрыты.
  • На коллектор каждого из этих восьми транзисторов постоянно подаётся 5 вольт.
  • Эмиттер каждого из этих восьми транзисторов подключён к 13-му пину одного из восьми коннекторов (на схеме, по тем же причинам, показан только один коннектор). Таким образом, когда транзистор открыт, пять вольт напряжения проходят к 13-му пину соответствующего коннектора.
  • Каждый такой коннектор 14-жильным проводом подключается к модулю LED`ов, выполненному в формате выносной линейки из 12 LED`ов. Аноды каждого LED`а подключены к этому тринадцатому пину (там ещё 220-омные резисторы воткнуты, чтобы LED`ы не сдохли раньше срока).
  • Катод каждого из этих LED`ов подключён к своему собственному пину коннектора.
  • Каждый из 12-ти пинов, подключённых к катодам LED`ов, подключён к коллектору своего собственного транзистора, база которого подключена (посредством ещё одного килоомного резистора) к ножке микроконтроллера.
  • Эмиттеры всех этих 12 транзисторов соединены и связаны с землёй.
  • 12 из 13 используемых пинов всех 8 коннекторов подключены параллельно. Ток подаётся по 13-му, который через транзистор контролируется демультиплексором.
  • Катоды всех LED`ов с номером N во всех восьми линейках подключены к одному и тому же транзистору. Но ток будет в каждый момент времени течь только через один из этих LED`ов, согласно тому, на какой коннектор был подан ток демультиплексором.
  • В качестве средства ввода у меня предусмотрены три кнопки, на которые я повешу прерывания. И будет ещё термометр.

Как максимум, в каждый момент времени будут гореть 12 LED`ов. Потребляемый каждым LED`ом ток — 20 миллиампер; значит, вся линейка LED`ов будет потреблять как максимум 240 миллиампер. Микроконтроллер Atmel AT90USB162 потребляет 12 миллиампер. Демультиплексор 74HC238 потребляет 50 миллиампер. При том, что я могу брать из порта USB до 500 миллиампер, — мне кажется, запас ещё есть. Правда, в будущем я планирую подключить ещё два символьных экрана (16 символов × 2 строки), которые должны будут работать постоянно, но каждый из них потребляет всего 4 миллиампера, так что это не страшно.

Жду реакций, рекомендаций и рацпредложений.

Tags:
Saturday, January 10th, 2015 21:03 (UTC)
Прямо даже не знаю, что и посоветовать вот так навскидку...
Saturday, January 10th, 2015 21:23 (UTC)
Пользоваться покупными приборами и не изобретать велосипед, очевидно...
Saturday, January 10th, 2015 21:25 (UTC)
Не, это неспортивно. Но тут ведь смотря что важнее - процесс или результат.
Saturday, January 10th, 2015 21:58 (UTC)
На самом деле, и то, и то. В рамках процесса я изучаю новые вещи. А результат сам по себе приятен :)
Sunday, January 11th, 2015 05:12 (UTC)
*обалдела и упала в обморок*
Sunday, January 11th, 2015 08:13 (UTC)
А с чего обалдевать-то?
Sunday, January 11th, 2015 08:20 (UTC)
вот с этого вот непонятного невесть чего
Sunday, January 11th, 2015 14:25 (UTC)
Да ладно, обычный вопрос начинающего разработчика хардвера.
Monday, January 12th, 2015 04:35 (UTC)
ну дак. я ж гражданская сухопутная крыса. меня такие штуки приводят в ужас. от благоговейного до простого
Monday, January 12th, 2015 10:47 (UTC)
Я не изучал проектирование железа. Только низкоуровневое программирование. Мне просто негде задать этот вопрос, кроме как у себя в ЖЖ.

Например, я не знаю, надо ли вешать сопротивления на кнопки и на провода, идущие от микроконтроллера к демультиплексору. То есть на ножки — здравый смысл подсказывает, что да, надо. Но вот с демультиплексором я просто не знаю.

И, кажется, никто не спешит с ответами... :(
Monday, January 12th, 2015 10:48 (UTC)
я женщина слабая, беззащитная. а ты мне такие слова :(
Monday, January 12th, 2015 10:54 (UTC)
Слабая, беззащитная, ага. А как дурь из "бочки" выбивать — так это ты завсегда. :)
Monday, January 12th, 2015 10:57 (UTC)
ага. и без малейшего понятия, как та бочка устроена
Monday, January 12th, 2015 11:00 (UTC)
Рассказать?..
Monday, January 12th, 2015 11:01 (UTC)
какой неожиданный поворот. все в гугль посылают!
Monday, January 12th, 2015 11:03 (UTC)
Да я просто Гугль уже прочитал...
Monday, January 12th, 2015 11:06 (UTC)
я не думаю, что от моего знания устройства бочки я смогу извлекать из нее звуки "более лучшего" качества или скорости :)
Monday, January 12th, 2015 11:23 (UTC)
Используя капельку науки, можно делать много всего интересного даже с такой обыденной вещью, как вибрирующая мембрана :)
Monday, January 12th, 2015 11:24 (UTC)
ну, это даже такой темной гражданке, как я, не видеть невозможно.
Monday, January 12th, 2015 12:32 (UTC)
Не наговаривай на себя.
Monday, January 12th, 2015 12:33 (UTC)
с вами, начитанными да эрудированными, пообщаешься - вообще впору в тундру ехать на ПМЖ
Monday, January 12th, 2015 12:49 (UTC)
Поздно, там уже все хорошие места заняты... :(
Monday, January 12th, 2015 12:50 (UTC)
да, не вовремя я растолстела. так бы ввинтилась как-нибудь....
Monday, January 12th, 2015 13:05 (UTC)
Вот давай, не будем насчёт растолстения, а? У нас диаметрально противоположные мнения по этому вопросу. Ты считаешь, что лучше ввинтиться, а я — что лучше продавить. Ты считаешь, что лучше проскользнуть, а я — что чем шире наши морды, тем теснее наши ряды.
Monday, January 12th, 2015 13:41 (UTC)
согласимся не соглашаться :)
Saturday, January 17th, 2015 21:18 (UTC)
Как это обычно на работе происходит. Собирают группу инженеров в комнате и делают design review схемы нового продукта. Просмотр и критика 50 страниц схемы занимает часа 3-4.
Ну бывают схемы на 80-100 страниц - это уже на целый день.
Эту схему собирают, и через пару недель приходит продукт. Разумеется много чего не работает. Эту же группу собирают в этой же комнате. И моментально в схеме все видят массу проблем, но после того как им сказали что конкретно не работает. Причем примерно такой сценарий я наблюдал не один раз и не в одной компании.
Sunday, January 18th, 2015 00:23 (UTC)
То есть рекомендация — собрать на breadboard`е и посмотреть. Я тоже к этой мысли склоняюсь, но боюсь спалить что-нибудь. Запасного микроконтроллера у меня нет.
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 08:59 (UTC)
Рекомендую для начала откатать схему в симуляторе. Я пользуюсь Proteus'ом. Ну и Хоровиц, Хилл "Искусство схемотехники" - наше все.
Wednesday, January 21st, 2015 09:52 (UTC)
Я пользовался Proteus`ом. Одну ошибку уже нашёл: второй полюс кнопок должен быть не на плюсе, а на земле, и в контроллере включить Pullup-резистор. Подключение термометра тоже не такое, но его я вчера переделал, опробовал на реальном железе и убедился, что всё работает.

Основной вопрос в необходимости килоомных резисторов между ножками микроконтроллера и входами демультиплексора.
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 10:03 (UTC)
Можно в двух словах - какая поставлена задача? Что именно требуется подключить к контроллеру?
И пару вопросов по уровню владения цифровой схемотехникой. Знаете ли, что такое динамическая индикация? И что такое триггеры/регистры?
Wednesday, January 21st, 2015 10:56 (UTC)
Задача-минимум: до 8 линеек по 12 светодиодов в каждой. Светодиоды зажигаются, отображая данные, пересылаемые с компа. Какие именно данные — я уж сам решу: загрузка процессора, загрузка памяти, температура CPU или видеокарты, эквалайзер…

Задача-миди: до 6 линеек по 12 светодиодов + 2 символьных экрана 16×2 + термометр. Светодиоды отображают что-то своё, экраны отображают что-то своё: текущую температуру с термометра, курс акций, время, расписание встреч, количество новых писем, обновления Твиттера или ЖЖ.

Задача-максимум: до 6 линеек по 12 светодиодов + 2 экрана + термометр + 3 кнопки. Всё предыдущее, только кнопки умеют менять громкость на компе и отключать звук совсем, а также включать его из состояния "Выкл" (контроллер будет подключён с отдельным питанием, через powered USB hub). Экраны должны отображать какую-то значимую информацию (время, температура) и пока комп выключен.

Требование: используется микроконтроллер AT90USB162, пустой или в рамках платы для разработки. У него всего 22 ноги для ввода-вывода, отсюда нужда в демультиплексоре.

Требование: линейки светодиодов не закреплены жёстко и могут быть разнесены довольно далеко друг от друга (и от микроконтроллера). Значит, где-то рядом с микроконтроллером будут 6 или 8 14-пиновых гнёзд, промаркированных от 0 до 7, а линейки светодиодов будут подключаться к гнёздам 14-жильными кабелями произвольной длины. (У меня сейчас 5 метров этого кабеля). Какая информация будет выдаваться на какое гнездо — настраивается в драйвере на компе.

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

Уровень владения цифровой схемотехникой — начальный. Что такое регистры, знаю, — благо, я системщик, и основная моя работа заключается в управлении непосредственно процессором. Триггеры — лично знаком только с флип-флопами. Динамическая индикация — судя по всему, это именно то, что мне нужно знать, но я не.
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 11:25 (UTC)
Понял. Давай начнем с задачи-минимум - только отображение. Архитектурно заложимся и под остальные задачи, ног будем использовать по минимуму.

В динамической индикации ничего сложного нет, в этой статье есть анимация, которая все обьясняет: http://radiokot.ru/start/mcu_fpga/avr/15/ Небольшая проблема в том, что для классической реализации динамической индикации в нашем случае надо будет 8+12 ног, что уже впритык. Потому слегка извернемся с регистрами.

Уверен, что ты в курсе, что такое последовательный и параллельный код, а также сдвиговый регистр. Есть замечательная микросхема 74HC595, которая предназначена именно для задачи, которую тебе нужно реализовать. Микросхема представляет собой преобразователь последовательного кода в параллельный (тот самый сдвиговый регистр) с функцией "защелки". Как это работает - описано в даташите https://www.sparkfun.com/datasheets/IC/SN74HC595.pdf. В двух словах - используются всего два провода, "сигнальный" + "строб". На сигнальном проводе выставляется нужное значение, по импульсу на входе "строб" оно попадает в младший значащий бит регистра, значения всех остальных бит сдвигаются вправо. После передачи всех восьми бит подается импульс на третий вход (RCLK) и значение из регистра сдвига "защелкивается" на выходе. Значение будет удерживаться до нового импульса на RCLK, вне зависимости от того, что загружается в регистр сдвига.

Как это практически использовать в твоем случае. Сигналы "строб" и "защелка" будут одинаковые для всех регистров - их можно просто запараллелить. Три регистра дадут нам возможность использовать матрицу в (8+8)х8 светодиодов, задействовав всего 5 ног (общий "строб", общая "защелка" и по одной ноге последовательных данных на каждый регистр). Ну ладно, 6 - у регистров еще reset имеется. А ведь регистры можно тоже каскадировать... В результате можно максимум по четырем ногам управлять каким угодно количеством светодиодов.

В плане конкретных сопротивлений в цепях транзисторов - см. например схему http://randomstar.org/uploads/posts/2011-02/1297619266_13-19-47.gif

Что есть ШИМ (широтно-импульсная модуляция) - в курсе? Если нет, почитай - с ее помощью можно будет управлять и яркостью светодиодов.
Wednesday, January 21st, 2015 11:58 (UTC)
Судя по схеме, изложенной по линку http://radiokot.ru/start/mcu_fpga/avr/15/, именно динамическую индикацию я и собираюсь реализовывать. Я ведь буду запитывать одновременно только одну светодиодную линейку.

Я всё-таки больше склоняюсь к демультиплексору. Это будет 74HC238 (линк на датаshit), потому что у него на выбранной ноге будет 5 вольт, а на остальных нули, что позволит легко и просто управлять имеющимися NPN-транзисторами, на роль которых я выбрал BС937 или BC338. Они легко пропустят ток в 240 миллиампер, который будет идти в случае включения всех 12 LED`ов одновременно. Таким образом, я воспользуюсь 12 ногами для LED`ов + 3 ногами для выбора канала с помощью демультиплексора.

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

Что такое ШИМ, я знаю, но, боюсь, игрища с таймерами сильно утяжелят код и заберут ценные ресурсы. Таймеров у меня всего два, один из них будет использован для обработки нажатий кнопок. В нынешней тестовой версии устройства только библиотека Display (для экрана) и OneWire (для термометра) используют 91% всего места для кода в микроконтроллере, а мне туда ещё парсер USB-данных запихивать. Понятно, что я потом повыкидываю из этих библиотек всё ненужное, но всё-таки... Скажем так, ШИМ — это полезно, но на данном этапе не необходимо.
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 12:08 (UTC)
Схему на сдвиговых регистрах зато гораздо проще расширять. Я забыл упомянуть - у сдвигового регистра есть выход, который можно каскадом подключать к входу следующего в схеме регистра. Таким образом, чтобы добавить к одному регистру еще 7, не нужно тянуть к каждому регистру отдельный хвост - достаточно соединить их каскадом и передавать не 8, а 256 бит по последовательному каналу. А непосредственно управление все равно происходит программно.
Wednesday, January 21st, 2015 14:39 (UTC)
Я тут почитал слегка… А чем плохо будет использовать прямо драйвер LED`ов? Типа TLC5940NT. Вот как он используется. Он и ШИМ по каждому LED`у в отдельности умеет (чего со сдвиговыми регистрами добиться будет нелегко), и расширяется точно так же, как сдвиговые регистры, цепочкой. В общем, хорошая же вещь, разве нет?
[identity profile] yuri tabachnik (from livejournal.com)
Monday, January 26th, 2015 10:42 (UTC)
Ничем не плохо, более того - именно так и надо делать. В программировании же ты не изобретаешь велосипеды, а используешь готовые библиотеки. То же самое и здесь. Я просто исходил из того, что проще достать (ну по крайней мере у нас).
Monday, January 26th, 2015 11:05 (UTC)
Достать не проблема. Ebay работает, а мне эта штука не завтра нужна.

Я сейчас думаю о питании. При использовании TLC5940NT все леды подключены к питанию всегда, а, исходя из условий, они все могут зажечься одновременно. Но одна линейка с 12 LED`ами жрёт до 240 миллиампер. 6 линеек будут жрать полтора ампера. Тут уже придётся либо с внешним питанием корячиться, причём с блоком питания типа Apple`овского, чтобы выдавал два ампера с пятью вольтами, либо изобретать какой-нибудь внешний распределитель питания, как я поначалу с демультиплексором хотел поступить.
[identity profile] yuri tabachnik (from livejournal.com)
Monday, January 26th, 2015 12:40 (UTC)
Рекомендую для начала делать схему с внешним источником питания. Потом померять потребление, если влазишь в ограничения USB по питанию - отказаться от внешнего источника. Если блока питания совсем нет, можно взять +5 вольт с блока питания компьютера (ATX).
Monday, January 26th, 2015 12:49 (UTC)
Внешний источник питания найти не проблема. Распотрошу USB-провод и возьму плюс и ноль оттуда, а другой конец USB-провода воткну в зарядное устройство от гаджетов Apple, оно даёт 2.4 ампера при 5.2 вольтах. Если я использую настоящий USB от компа, который под напряжением всегда (потому что через powered USB-hub), для питания логики, а внешний адаптер для питания LED`ов и прочей периферии, я смогу решить самую важную проблему: подключение LED`ов только после того, как включается драйвер LED`ов, (иначе драйвер сгорает, есть у него такая техническая особенность).

Может, даже получится настроить питание LED`ов отдельным транзистором, чтобы уж точно подавать питание на LED`ы только тогда, когда подано напряжение на драйвер. Но это должен быть очень крутой транзистор, чтобы 2.4 ампера через себя пропускать. Или, может, реле взять?..
Edited Jan. 26th, 2015 12:50 (UTC)
[identity profile] yuri tabachnik (from livejournal.com)
Monday, January 26th, 2015 13:06 (UTC)
2.4 ампера для современных MOSFET-транзисторов и не ток вовсе - они десятки ампер через себя пропускают и при этом почти не греются, потому что работают в ключевом режиме и имеют очень маленькое внутреннее сопротивление. Но рекомендую сначала почитать про/пощупать MOSFETы отдельно от драйвера, а потом уже интегрировать их в схему. Для начала можно и релюху взять.
Monday, January 26th, 2015 13:28 (UTC)
MOSFET-ка у меня должна где-то валяться, а вот реле придётся покупать. А в чём преимущество транзистора перед реле? Ну, кроме щелчков, один раз при включении компа и один раз при выключении.
[identity profile] yuri tabachnik (from livejournal.com)
Monday, January 26th, 2015 15:44 (UTC)
Реле - оно 1) механический элемент, ресурс которого конечный 2)инерционно - на MOSFETах можно реализовать, например, ШИМ, а реле быстрее чем пару раз в секунду не переключишь 3) во включенном состоянии реле потребляет существенный по сравнению с транзистором ток.

Из преимуществ реле - очень низкое сопротивление во включенном состоянии и абсолютная гальваническая развязка.
Monday, January 26th, 2015 16:19 (UTC)
Спасибо, буду изучать матчасть и курить мануалы! :)
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 11:26 (UTC)
Хм, написал длинный коммент со ссылками на схемы и даташиты, а ЖЖ посчитал, что в комменте спам. Проверь плз папку со спамом, если в ЖЖ такая есть.
Wednesday, January 21st, 2015 11:34 (UTC)
Нашёл, раскрыл. Сейчас полезу туда отвечать.
[identity profile] yuri tabachnik (from livejournal.com)
Wednesday, January 21st, 2015 11:49 (UTC)
Пока откомментирую по подключениям линеек светодиодов. Восемь 14-пиновых гнезд и соответствующее количество шлейфов смотрелись бы хорошо в суровом таком шкафу управления (размером с холодильник) какой-нибудь промышленной установкой. В домашних же условиях эта гора проводов занимает кучу места, путается, провода постоянно переламываются в месте подпайки к плате и т д. Плавали - знаем.
Рекомендую поставить 74HC595 на каждой линейке и подводить к ней всего 6 хвостов: "данные", "строб", "сброс", "защелка", землю и питание. Заодно и длину линейки можно будет увеличить до 16 светодиодов (4х4).
Edited Jan. 21st, 2015 11:51 (UTC)
Wednesday, January 21st, 2015 12:16 (UTC)
Я собирался использовать место на спине одного из мониторов. Там VESA FDMI-порт, которым я не пользуюсь, и у меня монтажная плата с соответствующим приспособлением для крепления имеется. Все эти гнёзда и шлейфы можно расположить там, — линейки светодиодов я всё равно собирался крепить на мониторы, так что огромное количество проводов будет спрятано позади мониторов и не является помехой.

Полез читать про схемы с 74HC595.
Edited Jan. 21st, 2015 12:16 (UTC)