freebits

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

36 posts in this topic

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Serb_ret    16

 

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

Опорное решение: компоненты для защиты RS-485

Компания Bourns анонсировала новую (4-ю) версию демонстрационной платы для тестирования защиты низковольтных слаботочных цепей от токовых перегрузок и импульсных перенапряжений, в частности, для защиты интерфейса RS-485. Мы собрали для вас всю самую интересную информацию по данной теме на одной странице.

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

Serb_ret    16

 

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

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

В 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
Starichok    1424
В 06.01.2019 в 13:19, freebits сказал:

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

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

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

Share this post


Link to post
Share on other sites

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

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

Serb_ret    16
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
hasl    67

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

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites
freebits    1

В итоге, на текущий момент, я реализовал опрос клавиатуры следующим образом (порт 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
ARV    763

Я тут скоро тоже займусь матричной клавой... 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
my504    503
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
ARV    763

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

Edited by ARV

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Сообщения

    •   Так это американцы.  В России ничего нового. Будет меняться как и всё. Если только будет вещание, а если нет тогда да, кладбищенский гранит на века. Даже не я, хочу заметить. накуя мне это надо, мой приемник работает, вчера слушал. В подавлении АМ.  в ваши ошибочные словеса?  Так я сразу показал ваши ошибки. Ну вот и придумай как разжать. Передатчик не откажется от компрессии. Поляков утверждает что динамика диодного ЧД не превышает 20-30дб и только может быть ФАПЧ даст больше. Но меня интересует несинхрон.  Повысить динамику в приемнике позволяет только концепция ЧМ как ШИМ и однобитный ЦАП. Можно и так конечно слушать но не удобно, либо шум ограничителя все забьет либо слабые станции будут приниматься гораздо тише сильных, как и происходит в ламповых приемниках где нет ограничителя. Если разница сильный слабый составит  более 20дб то приема станции вообще не будет. Можно конечно АРУ добавить  и совсем слабое ограничение. Глубокое ограничение вырезает информацию и искажает. То что не вырезано находилось на самой нижней полке  после ограничения оно переместиться на верхнюю и пройдет через ЧМ-детектор с максимальной громкостью. Это искажение. Но часть информации ограничитель уже вырезал безвозвратно. Ламповые приемники потому и звучат привлекательно потому что ограничения в них почти нет.
    • Очень напрасно. Крайне советую выбрать Keil. Весь функционал работает "из коробки" и никаких танцев с бубном не требуется. Еще более рекомендую забыть про бред под названием SPL. Конечно, если нужна стабильная и предсказуемая работа МК...
    • Это с Keil-ом то что-ли не пошло? Вы лучше затрите эту строчку поскорее из поста, а то все сильно удивятся Лично я не считаю кокос нормальным средством программирования и отладки для STM. Нахлебался с ним. Глюк на глюке, да еще и тормоз. Но это к теме не относится. Средства кодописания тут в разделе уже раз 50 обсосаны и разобраны на атомы.
    • Например о TL866II, в котором в перечне поддерживаемых чипов указан раздел SRAM/DRAM. Само собой для памяти без батареи  имеется ввиду тест записи с проверкой чтением. А планка с такой дурой, как панелька под TSOP, потом куда надо влезет? 
    • Я абсолютно согласен! Но нынешний закон давет право выбора: работать на дядю и платить обязательные отчисления, или работать на себя, и все отчисления планировать самому, как хочется.  
    • Если это происходит не в сильный мороз, то бегом к автоэлектрику.