Когда ввод-вывод ограничен на UC, как вы перемещаете логику от UC?

Например, если бы у вас был Arduino с 4 выводами цифрового ввода-вывода, как вы могли бы независимо зажечь> 4 светодиода или прочитать состояние> 4 кнопок?

Вы спрашиваете о PIC в заголовке, а затем ссылаетесь на Arduino!
@LeonHeller: Тогда попросите разъяснений и/или отредактируйте вопрос самостоятельно. Хотя в этом случае можно было бы просто заменить «uC» на PIC/Arudino.
Существует много типов ИС расширителей ввода/ вывода. Часто они подключаются через I2C (например, PCA9554) или SPI (например, MCP23S08).
Если вы уже используете Arduino, я бы просто выбрал более крупную версию. Для немного более дорогого Arduino вы обычно получаете много контактов ввода-вывода, больше FLASH, RAM и EEPROM, и это избавляет вас от пайки дополнительных микросхем, таких как 74HC595, вместе (с конденсаторами, печатными разъемами, ...), которые приходят к определенной цене. слишком.
@jippie - Ты не понимаешь. Стив Чиарсия однажды написал в BYTE о своей системе домашней автоматизации как о «чрезмерно рьяной попытке контролировать мир» (перефразируя). Вот чего вы хотите: контролировать мир. И тогда никакого количества ввода-вывода не достаточно. ;-)
@stevenvh - домашняя автоматизация бесполезна, когда у тебя есть (парень|девушка)друг, который тебя любит ;о)
Я согласен, что оборудование дешевле в обслуживании.
@jippie - А потом гик отвечает: "Что такое девушка?" :-)
Я бы предложил пересмотреть ваш принятый ответ. Игнасио неверен (есть три сигнала, а не два), Бруно более полный (Игнасио, например, не упоминает ввод), и имеет оригинальное решение для сохранения лишнего вывода.

Ответы (5)

Сдвиговый регистр, такой как 74595 , позволит вам иметь много выходов всего с двумя соединениями: выводом данных и выводом синхронизации. Вы устанавливаете вывод данных на следующее значение, которое хотите переместить в регистр, а затем импульсируете вывод часов.

Замечательно. Итак, я прочитал об этом и просто для уточнения, с одним из них у меня может быть 8 выходов, использующих 2 контакта Arduino? Я предполагаю, что я не могу использовать их в качестве входных данных?
С двумя вы можете иметь 16 выходов. С тремя, 24 и так далее, ограниченными только желаемой максимальной задержкой. 74595 является последовательно-параллельным, но существуют также параллельно-последовательные ( 74165 ) и последовательно-параллельные сдвиговые регистры.
@cheesysam - «С двумя у вас может быть 16 выходов. С тремя, 24 и так далее». Это неправильно. Вам нужно 3 контакта: данные, часы и защелка, независимо от того, сколько устройств вы хотите подключить. Ответ Бруно более точен. Кроме того, не говорите о 74595, это оригинальная технология TTL, которая была мертва и похоронена десятилетиями. Вы хотите 74HC595.
@stevenvh: "... с одним из них у меня может быть 8 выходов...". Кроме того, вы уверены, что им не нужен 74AC595? 74F595? 74LVX595?
@Ignacio - «с двумя ..» сбивает с толку, поскольку его можно прочитать как «с двумя вводами-выводами», как и я. Извини. 74F595? Для тактирования контроллером 16 МГц? Я так не думаю. 74F очень энергоемкий, и скорость не дает вам никаких преимуществ. 74LVX имеет только 3,3 В, поэтому не взаимодействует с Arduino. Что не так с 74HC? Это стандартная логическая семья.
«Что не так с 74HC?» Совершенно ничего. Что плохого в том, чтобы опустить "XX"?
@Ignacio - Когда вы пишете 74595, это микросхема TTL. Когда вы пишете 74xx595, это ИС с функциональностью 74595, но в неуказанной технологии, либо в одном из нескольких семейств TTL, либо в одном из многих CMOS.
Я думаю, что это интересная дискуссия о том, как выразить номера деталей ИС. В этом случае важна логическая функция (74xx595), но в то же время ОП говорит, что у него есть Arduino, что делает семейство 74HCxx наиболее подходящим. Вы могли бы лучше объяснить это в своем ответе.

Бруно дал хороший ответ, но я хотел бы сделать несколько замечаний.

Печально известный 70 мА
74HC595 часто используется в качестве расширенного ввода-вывода и так же часто используется для управления рядом светодиодов. Что часто упускается из виду, так это то, что вы можете использовать его не по спецификации таким образом. В техническом описании говорится, что общий ток питания не должен превышать 70 мА, абсолютные максимальные номиналы (AMR), поэтому вам лучше держаться подальше от этого с некоторым запасом. Поэтому 8 светодиодов на 10 мА — это слишком, а на 20 мА вы превысите AMR не менее чем на 130 %! Ограничение, вероятно, связано с пропускной способностью по току соединительных проводов, и тогда слишком большой ток может не только ухудшить работу детали, но и навсегда вывести ее из строя, если этот провод оборвется.

Но прошлой ночью я проснулся, потому что у меня была Идея . Ограничение в 70 мА относится как к Icc, так и к току заземления, тогда почему бы не разделить наше общее количество или 80 мА и позволить Icc иметь половину, а ток заземления - другую половину? Все, что вам нужно сделать, это подключить 4 светодиода к земле (активный высокий уровень), а остальные 4 к Vcc (активный низкий уровень). Тогда ток первых идет от Icc, ток остальных идет на землю. Таким образом вы сможете использовать светодиоды на 15 мА. (Это настолько просто, что я чувствую себя идиотом, если не подумал об этом раньше.)

Комбинированные часы
Я думал, что Бруно сохранил дополнительный контакт ввода-вывода, объединив часы сдвигового регистра с часами защелки. Кажется, я неправильно истолковал его ответ. Я все еще хочу расширить этот вариант.

Что происходит тогда? В таблице на странице 5 техпаспорта написано:

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

(выделено мной)
Так что фиксируются не новые данные, а предыдущие . Не проблема, просто не забудьте сдвинуть дополнительный фиктивный бит , чтобы зафиксировать последние данные, иначе все будет на один контакт неправильно.

Объединение часов также означает, что выходы будут переключаться все время, пока вы вводите новые данные. На самом деле функция защелки состояла в том, чтобы избежать этого. Во многих случаях это не будет проблемой, если вы сможете сделать это быстро, но в худших случаях вы можете получить нежелательные эффекты. В худшем случае может быть использование 74HC595 для мультиплексирования дисплея с очень высокой частотой развертки + очень длинная цепочка регистров сдвига + наличие всех единиц, кроме одного 0, выключенного светодиода + темная комната. Поскольку этот светодиод время от времени видит все единицы, проходящие в темной комнате, он может светиться очень слабо.

Или если вы объедините это высокочастотное мультиплексирование с релейным выходом управления. Все нули, а затем 1 для реле могут означать, что выход реле недостаточно высок для срабатывания.

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

+1 Отличная идея, которую ты придумал прошлой ночью! Никогда не видел, чтобы это упоминалось где-либо до сих пор. С другой стороны, я думаю, вы неверно истолковали ответ Бруно. Он имел в виду объединение тактового сигнала 74XX595 и 74XX165 вместе и объединение сигнала защелки 74XX595 и 74XX165 вместе.
@ m.Alin - Да, кажется. Спасибо что подметил это. Я отредактирую свой ответ, но оставлю это как возможность.
Конечно, это определенно возможность, которую рекомендовали другие. Стоит заняться этим.
@m.Alin - Я думаю, что причина, по которой он не использовался раньше, заключается в том, что либо пользователи не знали об ограничении в 70 мА, либо им было все равно :-(. Сейчас я иду в патентное бюро! ;-)
О.. ты будешь таким богатым!
Назад уже. Офис был закрыт. Все они были в церкви.
+1 Очень хорошая идея преодолеть текущий лимит 74XX595. Что касается управляющих сигналов, m.Alin правильно понял, я имел в виду использование одного вывода микроконтроллера для тактирования, а другого для защелок.
@ Бруно - Да, я знаю, я неправильно истолковал. Позже я увидел ваш список операций ввода-вывода в конце вашего поста с отдельными часами и защелкой. Но их можно объединить, если скорость обновления относительно низкая (статические выходные данные). Как я уже сказал, когда вы также объединяете входные и выходные данные на 1 контакт, вам нужно только 2 контакта.

Я согласен с Игнасио относительно использования 74XX595, последовательного параллельного выходного регистра сдвига для расширения вывода, но на самом деле вам потребуется 3 соединения, одно для данных , одно для часов и одно защелка , которая будет передавать данные из внутреннего сдвигового регистра. к выходным защелкам.

Схема 74LS595

Для расширения входов вы можете использовать регистр сдвига 74XX165, параллельный последовательному выходу, это позволит иметь до 8 кнопок на 74XX165.

введите описание изображения здесь

Преимущество этого подхода заключается в том, что вы можете последовательно объединить несколько регистров сдвига, что позволит увеличить количество входов или выходов, и, что еще лучше, вы можете смешивать 74XX595 и 74XX165, что позволит вам иметь любое количество входов или выходов.

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

  • Часы (общие со всеми сдвиговыми регистрами)
  • Включение защелки (совместно со всеми сдвиговыми регистрами)
  • Вход данных (подключен к последовательному выходу последнего сдвигового регистра в цепочке)
  • Выход данных (подключен к последовательному входу первого сдвигового регистра в цепочке)

Редактировать

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

Программное обеспечение будет делать что-то подобное для каждого тактового импульса:

  1. Настроить пин как выход
  2. Установите значение данных
  3. Отправить тактовый импульс
  4. Настроить контакт как вход
  5. Прочитать данные

Диаграмма

Чрезмерно увлеченные могут управлять выводом сдвигового регистра только такими строками с одним выходным контактом, а возможно, и вводом-выводом. Спросите меня, откуда я знаю :-). Это достигается за счет использования R/C-задержек для данных и защелки, при этом часы подключаются напрямую к выходному контакту. Точная последовательность зависит от относительной полярности триггера фронта для часов и защелки, но они обычно разрабатываются таким образом, чтобы работать вместе таким образом.
И, как я сказал в своем ответе, вы также можете комбинировать оба часа, так что вам нужны только два контакта. Это умная идея, но я не собираюсь голосовать за нее во второй раз. Достаточно один раз :-)
Я не вижу необходимости переносить последний вывод 74HC595 на 74HC165. Кто-нибудь может это объяснить? Насколько я понимаю, 16 тактовых импульсов хватило бы и на то, и на то, чтобы выставить выходы 2-х 74HC595 (16 выходов) и прочитать входы 2-х 74HC165 (16 входов), без этого подключения.
@Dario: наличие последнего вывода из канала 74HC595 в 74HC165 — это «бесплатный» способ позволить контроллеру, который знает, что цепочка не будет длиннее определенной длины, определить, что цепочка подключена и какова ее длина. . Если было бы приемлемо синхронизировать все '595 с низким уровнем при запуске, и если первый '165 будет иметь хотя бы один вход с высоким уровнем, код может даже определить, сколько имеется '595' и '165'.

Ник упоминает расширители ввода-вывода, и они определенно заслуживают внимания. Digikey перечисляет более тысячи из них, я выберу в качестве примера один с интерфейсом I2C, потому что он требует наименьшего количества контактов ввода-вывода; минимум два.

NXP PCA9505 имеет 40 настраиваемых контактов ввода-вывода, что эквивалентно пяти 74HC595. Это немного более дорогое решение, но вы получаете гораздо больше функциональности:

  • Любой контакт ввода-вывода может быть настроен как вход или выход.
  • Подтяжки 100 кОм на всех контактах ввода-вывода (PCA9506 не имеет подтяжек, что может быть актуально для приложений с низким энергопотреблением)
  • Все выходы могут потреблять 15 мА одновременно, всего в пакете 600 мА.
  • Выход с прерыванием при изменении делает излишним постоянное сканирование входов.
  • Всего два провода для подключения к микроконтроллеру.

Дополнительная литература
Экспандеры GPIO , брошюра NXP,
техническое описание PCA9505

Для решения без дополнительных микросхем вы можете использовать такие методы, как мультиплексирование и Charliplexing :

Мультиплексирование (токоограничивающие резисторы не показаны):

Мультиплексированные светодиоды

Принцип работы мультиплексирования довольно прост — в приведенном выше примере, если мы хотим зажечь светодиод 1, мы устанавливаем контакт C1 на выход высокого уровня, а контакт R1 — на низкий уровень. импеданс, из-за которого они выглядят «отключенными»)
. Если мы хотим зажечь светодиод 5, мы устанавливаем вывод C2 на высокий уровень, а R2 — на низкий уровень.

Количество выводов, необходимых для управления x светодиодами, может быть определено как 2n выводов для n² светодиодов, поэтому, например, для 16 светодиодов нам нужно (√16) * 2 = 8 выводов.

Чарлиплексинг:

Чарлиплексинг

Альтернативный (более аккуратный) схематический макет (предложенный Supercat):

чарлиплексинг 2

Это немного сложнее, но использует меньше контактов для управления большим количеством светодиодов. Например, мы можем использовать всего 5 контактов для управления 20 светодиодами, как в приведенном выше примере (по сравнению с по крайней мере 10 контактами с «нормальным» матричным мультиплексированием (не путать с использованием ИС, в этом случае необходимое количество контактов равно log2). (nLED).

Для внешнего решения вы можете использовать такие вещи, как регистры сдвига или мультиплексоры , такие как 74HC595 и 74HC151.
Сдвиговый регистр принимает синхронизированный последовательный входной поток данных и выводит параллельно (Serial In Parallel Out SIPO) или наоборот (PISO)
. Как правило, у них есть 8 выходов (или входов), но вы можете объединить столько, сколько хотите, чтобы расширить вещи. Обратная сторона заключается в том, что скорость, которую вы можете обновить, делится на количество выходов на вход (например, для одного регистра из 8 выходов, если у вас есть входная частота 8 МГц, которую вы можете обновить на 1 МГц, для 16 выходов 500 кГц и т. д.)

Эти методы могут работать в обратном направлении и для входных данных.

Этот ответ показывает, как использовать Charlieplexing для мультиплексированных кнопок ввода: electronics.stackexchange.com/a/37362/8627
Более простой способ нарисовать дисплей с плексированием по Чарли — просто нарисовать его в виде сетки NxN с незаполненной диагональю.
@supercat - я только что взял первый пример из изображений Google. Я только что добавил еще один пример - вы имели в виду такой макет?
@OliGlaser: Да, хотя я бы предложил переместить резисторы на соединения строк и столбцов. Если вы сделаете это, то можно будет одновременно управлять девятью светодиодами, при условии, что драйверы верхнего или нижнего плеча могут это выдержать. В качестве альтернативы можно было бы оставить резисторы там, где они есть, но добавить транзистор на каждом соединении строки и столбца (для показанной схемы NPN с базой в строке, эмиттером в столбце и коллектором, прикрепленным к положительной шине). ). Добавление транзистора значительно уменьшило бы мощность возбуждения на стороне высокого напряжения, необходимую для одновременной работы девяти светодиодов.