Jump to content
freebits

Atmega16A подключение матричной клавиатуры. Какой способ лучше

Recommended Posts

20 минут назад, Serb_ret сказал:

Причем тут мое описание назначения диодов в исходном алгоритме к Вашему алгоритму???

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

17 минут назад, IMXO сказал:

продолжай не понимать далее.

Только с Вашего разрешения)

Share this post


Link to post
Share on other sites

 

4 минуты назад, DrobyshevAlex сказал:

Мне просто интересно почему первая схема правильная а если выкинуть диоды то алгоритм не рабочий)

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

4 часа назад, Serb_ret сказал:

Защита в следующем: при PD4 в лог 0, а остальные в лог1, при нажатии например кнопок 4, 8 одновременно выход PD5 (лог1) закорачивается на выход PD4 (лог0). Диод от этого защищает.

 

Share this post


Link to post
Share on other sites
14 минуты назад, Serb_ret сказал:

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

Ох... как жу сложно. Забудьте все) И начнем сначала :)

Да я признаю, что написал как будто вопрос. Но суть то не в этом. Дальше я расписал в своем первом же посте

В 06.01.2019 в 07:09, DrobyshevAlex сказал:

все порты на вход

Мне отвечают. 

В 06.01.2019 в 08:11, IMXO сказал:

от КЗ , уберите диоды и нажмите кнопки в одной линии , получите замыкание на выходе порта.

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

В 06.01.2019 в 07:09, DrobyshevAlex сказал:

я бы сделал

То есть я имею ввиду "зачем вообще порты на вывод настраивать?" в данной схеме.

Ок, я понимаю что если порты на вывод будет КЗ. И я пишу

В 06.01.2019 в 11:45, DrobyshevAlex сказал:

я Вам описал алгоритм который позволит избавится от диодов

На что мне пишут

14 часа назад, IMXO сказал:

херню вы описали

И прикрепляют картинку. Все больше инфы нет. Но мы же видим выше сообщение о том что диоды нужны от КЗ. И нигде нет речи о том что алгоритм в статье "херня".

То есть выходит что алгоритм в статье верный а мой нет.

Картинка показала наглядно что при смыкании нескольких кнопок будет КЗ на соседнем столбце.

5 часов назад, DrobyshevAlex сказал:

То есть Вы с 1-го столбца замкнули кнопкой на 2ой? И что? Ни какого КЗ не будет

Тут видно что я виду речь про КЗ.

Я не спорил о том что можно с диодами повесить что то. Я не спорил то если доработать первую схему можно считать все кнопки.

 

 

 

 

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

 

А как с Вами то сложно,

Изначально автор совершил ошибку 

В 06.01.2019 в 05:39, freebits сказал:

Но произошло следующее - через нажатую кнопку, например кнопку 2, с входного бита PC2 (который всегда в лог 1) через диод ток закоротился на присутствующий в бите PC5  в этот момент времени лог 0.

Хотя даже в изначальной схеме PC2 должен был работать на вход. Он просто ошибся и спалил PC2. Почему он так сделал - не известно (неправильно понял алгоритм, совершил опечатку при написании кода, забыл перевести порт в нужное состояние).  О чем я между прочим и указал

5 часов назад, Serb_ret сказал:

Вход PC2 должен быть подтянут к питанию (лог 1) а не в Лог 1. Порт обязательно должен работать на вход. Если вдруг порт стал работать на выход и в состоянии лог 1 то никакой диод не поможет

Потом пошел вопрос : зачем там диоды ... В схеме с алгоритмом который описан в статье, а Вы пишите не нужен не указывая про использование другого алгоритма. 

Потом пошел весь офтоп нужен диод или нет.

 

Share this post


Link to post
Share on other sites
В 06.01.2019 в 13:19, freebits сказал:

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

а теперь расскажи мне, как через ЗАКРЫТЫЙ диод выходы соединятся?

диоды для того и стоят, чтобы между выходами не было кз...

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

1 час назад, Starichok сказал:

а теперь расскажи мне, как через ЗАКРЫТЫЙ диод выходы соединятся?

произошел сбой алгоритма, именно алгоритма, в то время как часть пинов должны были работать на вход с подтяжкой к лог1. а в итоге весь порт стал работать на выход с лог1,  а потом при проверке стали появлятся лог0

В 06.01.2019 в 10:19, freebits сказал:

т.к. я в одном из запусков все биты порта перевел в режим выхода, и нажал на кнопку в момент опроса строк нулями. 

т.е. PD0  (если рассматривать схему в первом посте) в состоянии лог 1 а PD4 в состоянии лог 0, диод открыт, ток не ограничен. 

Этот сбой не спасли бы ни другие алгоритмы, ни диоды, разве что только только резисторы на выходы порта по 330 Ом или более, тогда ток был бы не более 15 мА

 

 

Share this post


Link to post
Share on other sites

Проблема надуманная

Если уж так боитесь или надо использовать комбинации на клавиатуре

1. Включите последовательно резисторы с выходами

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

 

пссс. а про сбой алгоритма это уже точно .....

что же если код написан криво теперь обвешиваться аппаратными защитам - БРЭЭЭЭЭЭЭЭЭЭЭЭЭД

на это  иесть отладка

Share this post


Link to post
Share on other sites

В итоге, на текущий момент, я реализовал опрос клавиатуры следующим образом (порт PC перестал использовать, вместо него используется порт D):

Keyboard_Poll.png.ae1bac8d3c0a7ec31a2a3dda822a5f6e.png

Пины PD2-PD4 - выходы.

Пины PD5-PD7 - входы.

C выходов на клавиатуру отправляются сигналы:

110
101
011

Т.е. опрос происходит с помощью отслеживания нуля. Опрос с единицами не получился т.к. порт не фиксирует лог 0 при отсутствующем сигнале. Т.е. например, если нажата кнопка, при которой в PC6 приходит 1,  то на остальных (PC5 и PC7) присутствует неопределенное состояние, т.к. для лог 0 нужна земля. Т.е. нужно усложнять схему подключения, чтобы все работало.

При нажатии двух кнопок одновременно два входных вывода могут теоретически оказаться в КЗ. Но, во-первых на входных выводах всегда присутствует лог 1. Во-вторых, они находятся в режиме входа, при котором работает только внутренняя подтяжка к питанию через внутренний резистор при  установке лог 1, а при лог 0, вообще ничего не происходит.

КЗ может случится лишь в ситуации, когда входные пины (PD5-PD7) не будут установлены в режим входных, и если случайно будут нажаты две кнопки и случайно те два вывода, между которыми создастся КЗ, окажутся в противоположных логических состояниях. Такое весьма маловероятно, но все же может произойти, поэтому видимо придется внедрить диоды на место. 

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

Edited by freebits

Share this post


Link to post
Share on other sites

Я тут скоро тоже займусь матричной клавой... 4х4. Но у меня есть идея, как мне кажется, куда как более простого и эффективного алгоритма опроса. Идея в том, что не надо циклически опрашивать столбики/строки матрицы, а делать опрос всех кнопок (при матрице 4х4 и менее) за 2 опроса. Т.е. в вашем варианте вы делаете минимум 3 опроса чтобы узнать состояние любой из кнопок, а в моем алгоритме потребуется всего 2, причем можно делать это "в одно прерывание". Не желаете попробовать, пока у меня руки не дошли?

Вот набросок функции, возвращающей состояние всех 16 кнопок в виде комбинаций битов в байте (разумеется, возможны странности при одновременном нажатии трех кнопок):

uint8_t void kbd_scan(void){
	// подаем на все столбцы нули, а строки делаем входами с подтяжкой
	DDR(PORT_KBD) = 0xF0;
	PORT(PORT_KBD) = 0x0F;
	// запоминаем инверсное значение состояния строк
	uint8_t rows = (~PIN(PORT_KBD)) & 0x0F;
	// делаем столбцы входами с подтяжкой, а на строки подаем запомненное значение с инверсией
	DDR(PORT_KBD) = 0x0F;
	PORT(PORT_KBD) = ~rows;
	// запоминаем инверсное значение состояния столбцов
	uint8_t cols = (~PIN(PORT_KBD)) & 0xF0;
	// отключаем порт
	DDR(PORT_KBD) = 0;
	// если строки и столбцы ненулевые
	if(rows && cols){
		// возвращаем код нажатых кнопок
		return = rows | cols;
	}
  	return 0; // возвращаем 0 - не нажато ни одной
}

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

Edited by ARV

Share this post


Link to post
Share on other sites
14 минуты назад, ARV сказал:

 


uint8_t void kbd_scan(void)

 

В порядке обмена опытом.

Как понимать наличие типа uint8_t у функции void, которая, тем не менее, возвращает значение?  :unknw:

 

Edited by my504

Share this post


Link to post
Share on other sites

Извиняюсь, опечатался. Сообщение исправить уже не могу....

Edited by ARV

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...