реклама на сайте
подробности

 
 
> Подключение кнопочной клавиатуры к AVR.
Stolbov
сообщение Aug 14 2018, 18:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 5-08-17
Из: Санкт-Петербург
Пользователь №: 98 653



Всем добрый вечер!
Вообщем, я делаю небольшую поделку на основе микроконтроллера AVR,
но так как мне нужно было 6 кнопок, а выводов осталось мало, я решил
попробовать "выкрутиться" из этой ситуации таким образом, как это показано
на рисунке.
Прикрепленное изображение

PA0 и PA1 - ножки микроконтроллера, на которых постоянно находится
высокий уровень. В первый момент времени я устанавливаю на PB0 низкий
уровень, и, получается, что когда мы нажимаем кнопку S1 или S4, на одном из
входов МК так же установится низкий уровень напряжения. Таким образом,
можно отследить, какая кнопка нажата в момент времени. Остальные кнопки
опрашиваются по этому же алгоритму (подаём 0 на PB1, а потом на PB2).
За сим вопрос: правильно ли я вообще делаю? Когда я проводил эксперимент
с одной кнопкой, всё работало, и я с лёгкостью мог отследить её нажатие, но
когда я собрал эту схему на макетке, всё пошло крахом: ни одна кнопка не отзывается.
Если кто-нибудь сможет разобраться, есть ли у этой схемы шанс заработать,
буду премного благодарен. Код опроса этой конструкции так же прилагаю
(может быть, его можно было бы сделать изящнее, но получилось вот так).
Код
#define STEP1 1 //Метки для атомата
#define STEP2 2
#define STEP3 3

//...

DDRA |= (0<<PORTA0)|(0<<PORTA1); //Настройка ножек порта А на вход
DDRB |= (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2); //Настройка ножек порта B на выход

//..

int button_flag; //Флаг для цикла
int button_state; //Для хренения состояния автомата

//..

void key_polling()
{
    button_state = STEP1; //Первое состояние
    button_flag = 1; //Устанавливаем флаг
    while(button_flag == 1)
    {
        switch(button_state)
        {
            case STEP1: //Опрашиваем кнопки 1 и 4
                PORTB |= (0<<PORTB0)|(1<<PORTB1)|(1<<PORTB2); //На ножке PB0 устанавливаем низкий уровень
                if((PINA & (1<<PORTA0) == 0)) //Если на PA0 - 0, то...
                {
                    //Некое действие
                    button_state = STEP2; //Переходим к опрос следующей двойки
                }
                else if((PINA & (1<<PORTA1) == 0)) //Если на PA1 - 0, то...
                {
                    //Что-то делаем
                    button_state = STEP2;
                }
                else //Если не получили низкий уровень ни на одной из ножек
                {
                    button_state = STEP2;
                }        
            break;
            
            case STEP1: //Опрашиваем кнопки 2 и 5
                PORTB |= (1<<PORTB0)|(0<<PORTB1)|(1<<PORTB2); //На PB1 устанавливаем низкий уровень
                //Код, аналогичный блоку STEP1
            break;
            
            case STEP3: //Опрашиваем кнопки 3 и 6
                PORTB |= (1<<PORTB0)|(1<<PORTB1)|(0<<PORTB2); //На PB2 устанавливаем низкий уровень
                //Код, аналогичный блоку STEP1
                button_flag = 0; //Так как все кнопки опросили, обнуляем флаг для выхода из цикла
            break;
        }
    }
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Aug 15 2018, 06:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Stolbov @ Aug 14 2018, 21:23) *
За сим вопрос: правильно ли я вообще делаю?

Неправильно если могут быть одновременно нажаты несколько кнопок. Необходимы диоды.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 15 2018, 07:49
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Aug 15 2018, 10:53) *
Неправильно если могут быть одновременно нажаты несколько кнопок. Необходимы диоды.

Да можно и без диодов, в общем-то. Сканировать не жесткими Push-Pull-ными '0' и '1', а '0' и 'Hi-Z'. КЗ не случится.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 15 2018, 13:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Aug 15 2018, 10:49) *
Да можно и без диодов, в общем-то. Сканировать не жесткими Push-Pull-ными '0' и '1', а '0' и 'Hi-Z'. КЗ не случится.

Без диодов невозможно корректно сканировать если возможны произвольные одновременные нажатия. От слова - никак. Никакие пуш-пуллы тут не помогут.

Цитата(haker_fox @ Aug 15 2018, 12:56) *
Ваше решение - матричная клавиатура. http://cxem.net/mc/book45.php
Впрочем, вы почти её и реализовали. Но всё же лучше сделать, как на схеме по ссылке. Поставить подтягивающие резисторы и диоды.
Тогда, настроив подтянутые к VCC пины на вход, и подавая "бегущий" ноль на выходы (с диодами), вы можете определить нажатую клавишу. Ну или несколько клавиш (для этого диоды и нужны).

То что на приведённой Вами схеме, нормально будет работать только с некоторыми одновременными нажатиями. Но не со всеми.
При нормальной реализации диоды ставят не так как там, а последовательно с кнопками.

Цитата(haker_fox @ Aug 15 2018, 16:02) *
Ну кому как нравится)

"Нравятся" - это девушки. А схема - или работает или нет. rolleyes.gif
Приведённая Вами не работает со многими тройными нажатиями. А если поставить диоды правильно, то будет работать с любыми комбинациями нажатий.

Цитата(haker_fox @ Aug 15 2018, 16:02) *
Это быстро для вас или меделенно?

Видимо автор полагает что он умеет нажимать на кнопки с частотой 1кГц. biggrin.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 15 2018, 14:51
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (jcxz @ Aug 15 2018, 21:34) *
То что на приведённой Вами схеме, нормально будет работать только с некоторыми одновременными нажатиями. Но не со всеми.
При нормальной реализации диоды ставят не так как там, а последовательно с кнопками.

Почему не будет работать? Мы подаём ноль на конкретный столбец. И мы знаем, на какой. Следовательно, если нажать одновременно кнопки и в текущем столце (на который подан ноль), и в других, то они нам ни как не помешают. Но будут опрошены, когда лог. 0 дойдёт до них.
QUOTE (jcxz @ Aug 15 2018, 21:34) *
Приведённая Вами не работает со многими тройными нажатиями.

Приведите, пожалуйста, пример такой тройной комбинации.

QUOTE (Stolbov @ Aug 15 2018, 22:02) *
Я пока пытаюсь привести всё в "человеческий" вид, но пока не выходит.

Ну приведите в порядок железо (схему). Затем программу. Нарисуйте алгоритм обработки клавиатуры на бумажке, смоделируйте его вручную. Многое прояснится.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 15 2018, 15:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(haker_fox @ Aug 15 2018, 17:51) *
Приведите, пожалуйста, пример такой тройной комбинации.

По Вашей ссылке: предположим что нажаты SB1 и SB5. И теперь нажимаем ещё SB4 или SB8 (не отпуская SB1, SB5).
Теперь как Вы определите, что именно нажато - SB4 или SB8 или одновременно SB4 && SB8? smile3046.gif
Аналогично для всех прочих пар SB2 && SB6, SB3 && SB7. И для других столбцов.

Цитата(haker_fox @ Aug 15 2018, 17:51) *
Почему не будет работать? Мы подаём ноль на конкретный столбец. И мы знаем, на какой.

...и он тут же оказывается на другом столбце, как только нажимаются 2 кнопки. После этого уже ничего не знаем. laughing.gif
Без диодов последовательно кнопкам - никак.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 16 2018, 01:25
Сообщение #7


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (jcxz @ Aug 15 2018, 23:04) *
Без диодов последовательно кнопкам - никак.

jcxz, искренне благодарен за объяснение! rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Stolbov   Подключение кнопочной клавиатуры к AVR.   Aug 14 2018, 18:23
- - @Ark   Ноги порта PB должны быть первоначально конфигурир...   Aug 14 2018, 20:01
- - Plain   Скорость работы неизвестна, и кнопки фантастически...   Aug 14 2018, 20:09
- - vladec   Цитата(может быть, его можно было бы сделать изящн...   Aug 15 2018, 06:25
|- - @Ark   Цитата(vladec @ Aug 15 2018, 09:25) Для ш...   Aug 15 2018, 06:48
- - jeelman   если не требуется большая защищённость от помех и ...   Aug 15 2018, 07:20
- - haker_fox   QUOTE (Stolbov @ Aug 15 2018, 02:23) Если...   Aug 15 2018, 09:56
|- - Arlleex   Цитата(haker_fox @ Aug 15 2018, 13:56) Ва...   Aug 15 2018, 10:05
- - Stolbov   haker_fox, мне нужна быстрая реакция на нажатие. Н...   Aug 15 2018, 10:32
|- - haker_fox   QUOTE (Stolbov @ Aug 15 2018, 18:32) hake...   Aug 15 2018, 13:02
|- - @Ark   Цитата(Stolbov @ Aug 15 2018, 13:32) Я се...   Aug 15 2018, 13:40
- - Stolbov   haker_fox, я просто не верно выразился по поводу ...   Aug 15 2018, 14:02
|- - Plain   Цитата(Stolbov @ Aug 15 2018, 17:02) пыта...   Aug 15 2018, 14:59
- - Arlleex   Ну да. Такие комбинации я не учел Без диодов дей...   Aug 15 2018, 16:46


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 06:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016