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

8

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

cheesysam
источник
Вы спрашиваете о PIC в названии, а затем ссылаетесь на Arduino!
Леон Хеллер
2
@LeonHeller: Затем попросите разъяснений и / или отредактируйте вопрос самостоятельно. Хотя в этом случае можно просто использовать «UC» для PIC / Arudino.
Крис Лапланте
2
Я согласен, аппаратное обеспечение дешевле в обслуживании.
Джиппи
3
@jippie - А потом выродок отвечает: «Что за девушка?» :-)
stevenvh
1
Я бы предложил пересмотреть ваш принятый ответ. Игнасио неверен (есть три сигнала, а не два), Бруно более полон (например, Игнасио не упоминает ввод) и имеет оригинальное решение для сохранения дополнительного пина.
Стивенвх

Ответы:

4

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

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

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

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

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

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

Что происходит потом? Таблица на странице 5 таблицы говорит:

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

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

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

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

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

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

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

Диаграмма 74LS595

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

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

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

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

  • Часы (Совместно используется со всеми регистрами сдвига)
  • Latch Enable (Доступно для всех сдвиговых регистров)
  • Data In (подключен к последовательному выходу последнего сдвигового регистра в цепочке)
  • Выход данных (подключен к последовательному входу первого регистра сдвига в цепочке)

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

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

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

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

схема

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

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

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

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

Дополнительная информация Расширители
GPIO , брошюра NXP
PCA9505

stevenvh
источник
4

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

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

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

Способ мультиплексирования довольно прост - в приведенном выше примере, если мы хотим зажечь LED1, мы устанавливаем вывод C1 на высокий уровень вывода, а PIN R1 на низкий уровень вывода, все остальные выводы могут быть высокими или Hi-Z (установить на вход высокий импеданс, который заставляет их выглядеть «отключенными»)
Если мы хотим зажечь LED5, мы устанавливаем вывод C2 на высокий уровень выхода и R2 на низкий уровень.

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

Charlieplexing:

Charlieplexing

Альтернативная (аккуратная) схема (предложена 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
jippie
Проще всего нарисовать дисплей Charlieplexed - просто нарисовать его в виде сетки NxN с незанятой диагональю.
суперкат
@supercat - я только что ущипнул первый пример из картинок Google. Я только добавил еще один пример - это тот тип макета, который вы имели в виду?
Оли Глейзер
@OliGlaser: Да, хотя я бы предложил переместить резисторы в соединения столбцов строк. Если вы это сделаете, то будет возможно управлять девятью светодиодами одновременно, при условии, что драйверы верхней или нижней стороны могут это приспособить. В качестве альтернативы можно оставить резисторы там, где они есть, но добавить транзистор в каждом соединении столбец-строка (для схемы, как показано, NPN с основанием в ряду, эмиттер в столбце и коллектор, присоединенный к положительной шине ). Добавление транзистора значительно уменьшило бы мощность привода на верхней стороне, необходимую для одновременной работы девяти светодиодов.
суперкат