Можно ли прочитать матрицу переключателей 10 на 10 с контактами ввода-вывода 8 на 8?

На собеседовании мне задали такой вопрос: учитывая 8 выходных контактов и 8 входных контактов на микроконтроллере, возможно ли прочитать матрицу переключателей 10 на 10 без использования чипов мультиплексора и демультиплексора? Я не уверен, что это возможно...

Учитывая эту конкретную формулировку, да. Он не запрещает использование дискретных компонентов.
... или многие другие виды чипсов. Главный вопрос в том, что вам РАЗРЕШЕНО использовать? Кроме того, мы говорим о строго бинарных выходах и входах, или у нас есть такие вещи, как три состояния и аналоговые возможности?

Ответы (2)

Я бы сделал что-то вроде этого:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Я использую 7 выходов и 8 входов, чтобы создать матрицу из 56 точек коммутации, и я устанавливаю по два переключателя в каждую точку коммутации, всего 112 переключателей. 8-й выход используется для управления набором подтягивающих/подтягивающих резисторов для входов.

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

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

Что-то похожее на Чарлиплексинг............
@Nedd: Да, я полагаю, если ты прищуришься достаточно сильно. На самом деле это просто две матрицы переключатель + диод, наложенные друг на друга.

С 8 выходными и 8 входными контактами вы можете создать матрицу из 64 пересечений с переключателем на каждом пересечении. У вас могут возникнуть некоторые проблемы, когда несколько переключателей могут быть замкнуты одновременно, поэтому вы можете использовать диод на каждом переключателе. И не забудьте про подтягивания для входов. Это то, что можно сделать прямолинейно, и я чувствую, что именно это хотел услышать интервьюер.

Если нет необходимости правильно определять замыкания нескольких переключателей, вы можете использовать диодную матрицу, чтобы каждый переключатель мог поместить свой уникальный код на 8 входов. Выходы не нужны, можно обнаружить до 255 переключателей (одно состояние входа зарезервировано для «выключатель не замкнут».)

Вы можете обмануть, используя микросхемы вместо мультиплексоров/демультиплексоров, таких как сдвиговые регистры, расширители ввода-вывода или даже микроконтроллеры. Это научит вашего собеседника точнее формулировать вопрос :)

Если контакты имеют как цифровые, так и аналоговые возможности, вы можете проявить еще больше творчества. Однажды я спроектировал (но так и не построил) систему, которая могла считывать матрицу NxN с двумя GPIO/аналоговыми контактами и кучей резисторов и диодов. Максимальное значение N было ограничено падением напряжения на диоде, точностью резистора и битами аналого-цифрового преобразователя. (Нет возможности многократного нажатия.) Вероятно, непрактично, но приятно пофантазировать.

Недд опубликовал и удалил предложение Чарлиплексирования, для которого требуются контакты, которые могут быть как входными, так и выходными. Кажется, ваш вопрос исключен, но если вы используете несколько контактов для создания шины SPI или I2C и подключаете 16-контактный удлинитель GPIO в стиле MCP23017...

А как насчет остальных 36 переключателей?
Блин, я невнимательно читал :)
Что касается вашего последнего абзаца, я однажды разработал схему, используя только переключатели и резисторы, которые давали бы равномерно распределенные уровни напряжения на входе АЦП. IIRC, резисторы стандартного значения 1% позволят вам подключить до 16 переключателей к одному входу.
IIRC моя идея состояла в том, чтобы расширить это до матрицы. Либо один контакт высокий, а другой аналого-цифровой вход, либо наоборот. На стороне выхода есть R-цепочка, а на стороне входа — диоды для передачи значения на вывод A/D. О, я упоминал, что аналого-цифровой вход должен быть входом с высоким импедансом?