Например, если у вас был Arduino с 4 цифровыми выводами ввода-вывода, как вы могли бы независимо зажечь> 4 светодиода или прочитать состояние> 4 кнопок?
Например, если у вас был Arduino с 4 цифровыми выводами ввода-вывода, как вы могли бы независимо зажечь> 4 светодиода или прочитать состояние> 4 кнопок?
Ответы:
Сдвиговый регистр, такой как 74595 , позволит вам иметь много выходов только с двумя соединениями: вывод данных и вывод синхронизации. Вы устанавливаете вывод данных на следующее значение, которое хотите переместить в регистр, а затем пульсируете вывод синхронизации.
Бруно дал хороший ответ, но я бы хотел сделать несколько замечаний.
Печально известной 70 м 74HC595 часто используются продленным ввод / вывод, а также часто используется для управления серией светодиодов. Что часто упускают из виду, так это то, что вы можете использовать его вне спецификации. В техническом описании сказано, что суммарный ток питания не должен превышать 70 мА, абсолютные максимальные значения (AMR), поэтому вам лучше держаться подальше от этого. Поэтому 8 светодиодов при 10 мА - это слишком много, а при 20 мА вы превысите AMR не менее чем на 130%! Ограничение, вероятно, связано с текущей емкостью соединительных проводов, и тогда слишком высокий ток может не только ухудшить характеристики детали, но и навсегда вывести ее из строя, если этот провод сломается.
Но прошлой ночью я проснулся, потому что у меня была идея . Предел 70 мА распространяется как на Icc, так и на ток заземления, тогда почему бы не разделить нашу общую сумму или 80 мА и не дать Icc иметь половину этого значения, а ток заземления - другую половину? Все, что вам нужно сделать, это привязать 4 светодиода к земле (активный высокий), а остальные 4 к Vcc (активный низкий). Затем ток первого приходит от Икк, ток других идет на землю. Таким образом, вы сможете использовать светодиоды 15 мА. (Это так просто, что я чувствую себя идиотом, чтобы не думать об этом раньше.)
Комбинированные часы
Я думал, что Бруно сохранил дополнительный вывод ввода / вывода, объединив часы регистра сдвига с защелкой. Кажется, я неверно истолковал его ответ. Я все еще хочу расширить этот вариант.
Что происходит потом? Таблица на странице 5 таблицы говорит:
содержимое сдвигового регистра сдвинуто насквозь; предыдущее содержимое регистра сдвига передается в регистр хранения и параллельные выходные каскады
(выделение мной)
Так что фиксируются не новые данные, а предыдущие . Это не реальная проблема, просто убедитесь, что добавлен дополнительный фиктивный бит, чтобы зафиксировать последние данные, иначе все будет неправильно.
Объединение часов также означает, что выходы будут переключаться все время, пока вы перемещаете новые данные. Функция защелки фактически заключалась в том, чтобы этого избежать. Во многих случаях это не будет проблемой, если вы можете сделать это быстро, но в худшем случае вы можете получить нежелательные эффекты. В худшем случае можно использовать 74HC595 для мультиплексирования дисплея на очень высокой частоте сканирования + иметь очень длинную цепочку регистров сдвига + иметь все 1, кроме одного 0, не светящийся светодиод + темная комната. Так как этот светодиод часто видит все проходящие единицы в темной комнате, он может светиться очень слабо.
Или если вы объедините это высокочастотное мультиплексирование с релейным управляющим выходом. Все нули, а затем 1 для реле могут означать, что выход реле недостаточно длинный для включения .
Конечно, это крайние случаи, но я бы по возможности раздельно использовал тактовый генератор и тактовую частоту, если вы хотите мультиплексировать или иным образом иметь высокую частоту обновления.
Я согласен с Ignacio относительно использования 74XX595, последовательного параллельного сдвигового регистра для расширения выхода, но на самом деле вам понадобятся 3 соединения, одно для данных , одно для синхронизации и одно включение защелки, которое будет передавать данные из внутреннего сдвигового регистра на выходные защелки.
Для расширения входов вы можете использовать 74XX165, параллельный в последовательном сдвиговом регистре, это позволит иметь до 8 кнопок на 74XX165.
Преимущество этого подхода состоит в том, что вы можете последовательно соединять несколько регистров сдвига, увеличивая количество входов или выходов, и, что еще лучше, вы можете смешивать 74XX595 и 74XX165, позволяя иметь любое количество входов или выходов.
Кроме того, вы можете обмениваться тактовыми сигналами и сигналами защелки, уменьшая количество необходимых соединений и значительно упрощая программное обеспечение. Таким образом, вам понадобится всего 4 соединения для любого числа любого из этих сдвиговых регистров:
Когда я искал диаграмму, я нашел на этом сайте очень умный способ сократить количество требуемых соединений до 3. Он заключается в использовании одного и того же вывода для ввода и вывода данных.
Программное обеспечение будет делать что-то подобное для каждого тактового импульса:
Ник упоминает расширители ввода / вывода, и они определенно заслуживают внимания. В Digikey перечислено более тысячи из них, в качестве примера я выберу один с интерфейсом I2C, потому что для этого требуется наименьшее количество выводов ввода / вывода; минимум два.
NXP PCA9505 имеет 40 настраиваемых выводов ввода / вывода, что эквивалентно пяти 74HC595. Это немного более дорогое решение, но вы получаете гораздо больше функциональности для этого:
Дополнительная информация Расширители
GPIO , брошюра NXP
PCA9505
Для решения без дополнительных микросхем вы можете использовать такие методы, как мультиплексирование и Charliplexing :
Мультиплексирование (не показаны токоограничивающие резисторы):
Способ мультиплексирования довольно прост - в приведенном выше примере, если мы хотим зажечь LED1, мы устанавливаем вывод C1 на высокий уровень вывода, а PIN R1 на низкий уровень вывода, все остальные выводы могут быть высокими или Hi-Z (установить на вход высокий импеданс, который заставляет их выглядеть «отключенными»)
Если мы хотим зажечь LED5, мы устанавливаем вывод C2 на высокий уровень выхода и R2 на низкий уровень.
Количество выводов, необходимое для управления x светодиодами, может быть рассчитано с помощью 2n выводов для n² светодиодов, поэтому, например, для 16 светодиодов нам нужно (√16) * 2 = 8 выводов.
Charlieplexing:
Альтернативная (аккуратная) схема (предложена Supercat):
Это немного сложнее, но использует меньше выводов для управления большим количеством светодиодов. Например, мы можем использовать только 5 контактов для управления 20 светодиодами, как в приведенном выше примере (по сравнению с по меньшей мере 10 контактами с «нормальным» матричным мультиплексированием (не путать с использованием микросхемы, в этом случае необходимое количество контактов равно log2) (nLED).
Для внешнего решения вы можете использовать такие вещи, как регистры сдвига или мультиплексоры, такие как 74HC595 и 74HC151.
Сдвиговый регистр принимает синхронизированный последовательный входной поток данных и выводит параллельно (Serial In Parallel Out SIPO) или наоборот (PISO).
Они обычно имеют 8 выходов (или входов), но вы можете соединить столько, сколько захотите, чтобы расширить вещи. Обратная сторона - это скорость, которую вы можете обновить, делится на количество выходов на вход (например, для одного регистра из 8 выходов, если у вас есть входная тактовая частота 8 МГц, вы можете обновить на 1 МГц, для 16 выходов 500 кГц и т. Д.)
Эти методы могут работать в обратном направлении и для входных данных.