Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Клавиатура 3 линии 6 кнопок на линиях АРМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
prottoss
Привет всем! Встала необходимость реализовать подобную клаву (на 3 линиях 6 кнопок) на МК AT91SAM7X128 в связи с отсутствием свободных линий ВВ. Алгоритм ясен и легко реализуем, к примеру, на AVR. НО есть сомнения, что такое возможно соорудить на вышеназванном камне. Кто нибудь строил подобную клавиатуру? Прилагаю рисунок:
Код
GPIOA-----x------------x-------------Key4-----GND
_              |             |
_           Key1       Key3
_              |             |
GPIOA-----x-------------|-------------Key5-----GND
_              |             |
_           Key2         |
_              |             |
GPIOA-----x------------x-------------Key6-----GND
HARMHARM
Что-то не очень понятная схема. А соорудить скорее всего можно, учитывая переключаемые pull-up и pull-down.
prottoss
Цитата(HARMHARM @ Jul 18 2008, 22:28) *
Что-то не очень понятная схема. А соорудить скорее всего можно, учитывая переключаемые pull-up и pull-down.
Что не понятного? Есть три линии, назовем их A, B, C. Есть три кнопки, которые подключены между линиями, назовем их линейными - Key1, Key2, Key3. И есть три кнопки, которые подключены между оджной линией и землей - Key4, Key5, Key6. Токоограничительные резисторы я опустил для простоты.
zltigo
Цитата(prottoss @ Jul 18 2008, 15:54) *
легко реализуем, к примеру, на AVR. НО есть сомнения, что такое возможно соорудить на вышеназванном камне.

Какие, простите, проблемы могут возникнуть при реализации оного на любом контроллере? Какой из контроллеров не может изображать opendrain и считывать состояние выхода, или переключать вход/выход?
А вообще нормальнее использовать дополнительно 6 диодов/сборок и банально считывать код нажатой кнопки без дополнительных телодвижений, если, конечно не ставить задачу получить еще и нажание комбинаций кнопок.
uriy
Вроде должно работать! Только с нажатием нескольких кнопок вроде сложновато. А в чем в данном случае принципиальное отличие SAM от AVR? Опередили пока писал.
Sergio66
Цитата(prottoss @ Jul 18 2008, 18:31) *
Что не понятного? Есть три линии, назовем их A, B, C. Есть три кнопки, которые подключены между линиями, назовем их линейными - Key1, Key2, Key3. И есть три кнопки, которые подключены между оджной линией и землей - Key4, Key5, Key6. Токоограничительные резисторы я опустил для простоты.

Идея проста как апельсин...
3 линии и 6 кнопок...
Задача делится на 3 части:
1 - все 3 линии на прием с pull up и опрашиваем их. Ксли замкнута хотябы одна кнопка, сажающая одну из линий на массу, то мы это видим и считываем код клавиши.
2 - второй шаг - ждем, когда отпущена (или не нажималась) кнопка (шаг 1) и программируем одну из 3 линий на передачу и выставляем там "0". опррашиваем 2 оставшиеся линии на предмет замкнутости 2 кнопок, соединяющих эти 2 линии с той, что мы перевели в "0".
3 - последний шаг, переводим на передачу и втиорую из трех линий и "0". и смотрим на состояние третей линии, которое определяется положением 6-й кнопки, которая соединяет вторую и третью линии.
Это по схеме, приведенной автором.
вот такой нехитрый алгоритм.
При этом важно, что к каждому следующему шагу переходим только в том случае, если на предыдущем шаге не обнаружено нажатий.
Dog Pawlowa
Цитата(prottoss @ Jul 18 2008, 16:54) *
Привет всем! Встала необходимость реализовать подобную клаву (на 3 линиях 6 кнопок) на МК

Тут главное диоды в развязке матрицы не забыть. А то ложные нажатия и прочие радости обеспечены.
prottoss
Цитата(Dog Pawlowa @ Jul 18 2008, 22:58) *
Тут главное диоды в развязке матрицы не забыть. А то ложные нажатия и прочие радости обеспечены.
А зачем здесь диоды?

Возможно, у меня сомнения, от моего недопонимания работы процессора. Я работаю всего лишь полгода с ним. В форуме как то проскакивали реплики, про то, что не возможно махать ногами, как в АВР, к примеру. Но я не вдавался в тему, потому как это было не надо. Смотрю даташит, но не пойму - почему.



Цитата(uriy @ Jul 18 2008, 22:43) *
Вроде должно работать! Только с нажатием нескольких кнопок вроде сложновато. А в чем в данном случае принципиальное отличие SAM от AVR? Опередили пока писал.
Несколько кнопок нажимать не надо, только фиксирование нажатия одной кнопки
YAM
Можно вообще одной ногой все кнопки обрабатывать, если она - вход АЦП... smile.gif
prottoss
Цитата(YAM @ Jul 19 2008, 00:47) *
Можно вообще одной ногой все кнопки обрабатывать, если она - вход АЦП... smile.gif
Можно, но я пытаюсь обсудить то, что написано в заголовке темы. Другие варианты в данном случе не приемлемы.
Deka
Цитата(prottoss @ Jul 18 2008, 21:02) *
Можно, но я пытаюсь обсудить то, что написано в заголовке темы. Другие варианты в данном случе не приемлемы.


Вот так у меня организован опрос блока джамперов для AVR на ассемблере. Может пригодится...

Код
[font="Courier"]; PORT D
;
; bModeB1 ------0 -2- 0---+
;                         |
;               3     1   |
;                         |
; bModeB2 ------0 -4- 0---+
;                         |
;               5     1   |
;                         |
; bModeB3 ------0 -6- 0---+
;                        _|_
;
; Выбор времени работы клапана
; Возможные значения: 10, 20, 30, 40, 50 или 60 секунд.
;
; bModeB1, bModeB2 и bModeB3 подтянуты к напряжению питания при помощи внутренних резисторов МК.
; Перемычка может занять одно из 7-ми положений.
; Если bModeB1, bModeB2 и bModeB3 не замкнуты на землю и не замкнуты между собой - выбран режим № 1
; Если bModeB1 замкнут перемычкой на "землю" - выбран режим № 2
; Если bModeB2 замкнут перемычкой на "землю" - выбран режим № 4
; Если bModeB3 замкнут перемычкой на "землю" - выбран режим № 6
; Если bModeB2 замкнут перемычкой с bModeB1 - выбран режим № 3
; Если bModeB2 замкнут перемычкой с bModeB3 - выбран режим № 5
;
;.def  ModeB  = R20  ; Режим работы B (10, 20, 30, 40, 50 или 60 секунд)
;
GetTimeB:
;---------------------------------------;
_TestBM2:             ; Тестирование линии B1 - режим № 2
   sbic PinD, bModeB1 ; Пропустить следующую команду, если bModeB1 = 0
   rjmp _TestBM4      ; Иначе перейти к тестированию линии B2 - режим № 4
   ldi  Temp, 20      ; Выбран режим № 2 - 20 секунд
   rjmp _GetTimeB     ; Выход
_TestBM4:             ; Тестирование линии B2 - режим № 4
   sbic PinD, bModeB2 ; Пропустить следующую команду, если bModeB2 = 0
   rjmp _TestBM6      ; Иначе перейти к тестированию линии B3 - режим № 6
   ldi  Temp, 40      ; Выбран режим № 4 - 40 секунд
   rjmp _GetTimeB     ; Выход
_TestBM6:             ; Тестирование линии B3 - режим № 6
   sbic PinD, bModeB3 ; Пропустить следующую команду, если bModeB3 = 0
   rjmp GetExTimeB    ; Иначе тестируем линии B2 & B1 - режим № 3
   ldi  Temp, 60      ; Выбран режим № 6 - 60 секунд
   rjmp _GetTimeB     ; Выход
;---------------------------------------;
GetExTimeB:           ; *** ВХОД В РАСШИРЕННЫЙ РЕЖИМ ***
   cbi  PortD, bModeB2; Установить логический 0 на выходе bModeB2
   sbi  DDRD, bModeB2 ; Установить bModeB2 как выход
   rjmp PC+1          ; Подождать установки уровня
;-------------------------------;
_TestBM3:             ; Тестирование линии B2 & B1 - режим № 3
   sbic PinD, bModeB1 ; Пропустить, если bModeB1 = 0 - режим № 3
   rjmp _TestBM5      ; Иначе тестируем линии B2 & B3 - режим № 6
   ldi  Temp, 30      ; Выбран режим № 3 - 30 секунд
   rjmp _GetExTimeB   ; Выход
_TestBM5:             ; Тестирование линий B2 & B3 - режим № 5
   sbic PinD, bModeB3 ; Пропустить, если bModeB3 = 0 - режим № 5
   rjmp _TestBM1      ; Иначе тестируем линии B1 & B2 & B2 - режим № 1
   ldi  Temp, 50      ; Выбран режим № 5 - 50 секунд
   rjmp _GetExTimeB   ; Выход
_TestBM1:             ; Тестирование линий B1 & B2 & B3 - режим № 1
   ldi  Temp, 10      ; Выбран режим № 1 - 10 секунд
;-------------------------------;
_GetExTimeB:          ; *** ВЫХОД ИЗ РАСШИРЕННОГО РЕЖИМА ***
   cbi  DDRD, bModeB2 ; Установить bModeB2 как вход
   sbi  PortD, bModeB2; Установить логический 1 (подтягивающий резистор) для bModeB2
;---------------------------------------;
_GetTimeB:
   ret
;[/font]
proba
последовательно всеми Key стоит ставить резисторы несколько к-ом, тогда возможно незавимимыи опрос всех клавиш, т.е. можно наити несколько одновременно нажатых кнопок. если последовательно с key1..key3 ставить диоды, то можно добавить еще 3 клавиш, где диоды в противоположном направлениии в отношении key1..key3.
Dog Pawlowa
Цитата(prottoss @ Jul 18 2008, 18:56) *
А зачем здесь диоды?
Возможно, у меня сомнения, от моего недопонимания работы процессора. ...

А при чем тут процессор?

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

Гугл нашел, я даже не смотрел, что написано ...http://kazus.ru/articles/405.html
prottoss
Цитата(Dog Pawlowa @ Jul 20 2008, 00:36) *
А при чем тут процессор?
Да, наверное не при чем... Наверное я просто испугался того, чего не виделsmile.gif

Цитата(Dog Pawlowa @ Jul 20 2008, 00:36) *
В любой матрице без диодов при трех нажатых кнопках автоматически генерируется четвертое нажатие. Поводите карандашом по схеме. Посмотрите схемы матричных клавиатур.
Мне нужно отслеживать только единичные нажатия.
Dog Pawlowa
Цитата(prottoss @ Jul 19 2008, 20:29) *
... Мне нужно отслеживать только единичные нажатия.

Неделю назад попалась под руки моя старая клавиатура с криво установленными диодами.
Все мы так думаем smile.gif
defunct
Цитата(prottoss @ Jul 18 2008, 16:54) *
Привет всем! Встала необходимость реализовать подобную клаву (на 3 линиях 6 кнопок) на МК AT91SAM7X128 в связи с отсутствием свободных линий ВВ.

Можно взять 1 вывод АЦП (из не подключенных к портам) и повесить на него все 6 кнопок ч/з резисторы разного номинала. т.о. можно распознать одновременное нажатие любой комбинации кнопок.
Шаг АЦП будет 2^10/ 2^6 = 16.
Точность резисторов должна быть не ниже 2^4 / 2^10 = 1.5%.

Если облом с однопроцентниками, то можно взять 2 вывода АЦП (3 кпоки на каждый). Допустимая точность резисторов при этому будет 2^7 / 2^10 = 12.5% и всего 3 разных номинала.
zltigo
Цитата(defunct @ Jul 19 2008, 23:22) *
и повесить на него все 6 кнопок ч/з резисторы разного номинала...

1. Против аналогового подхода Автор уже возражал.
2. Точные резисторы, да еще в большом количестве, тоже не нужны, ибо можно использовать матрицу и с резисторами.
defunct
Цитата(zltigo @ Jul 20 2008, 11:58) *
1. Против аналогового подхода Автор уже возражал.

Пропустил.. тогда - пардон.
navy2000
А может поставить 74xx597(или аналогичный), на входы кнопки (1 корпус на 8 кнопок, можно каскадировать). Читаем любое количество кнопок, хоть по одной, хоть одновременно. При необходимости, количество кнопок можно увеличить.
KAlex
Вот схемка(PCAD2002)
3 линии - 8 кнопок и св.диодов. Работает отлично, правда требует некоторых програмных затрат.
Легко сделать расширение до 16.
prottoss
Цитата(KAlex @ Jul 21 2008, 19:50) *
Вот схемка(PCAD2002)
3 линии - 8 кнопок и св.диодов. Работает отлично, правда требует некоторых програмных затрат.
Легко сделать расширение до 16.
Кроме программных затрат, требуются и аппаратные, что опять мимо темыsmile.gif В принципе, вопрос уже решен. Но исходники пока выложить не могуsad.gif
prottoss
Драйвер написал. Все отлично работает... НО для меня так и остались загадкой реплики типа "...ARM не АВР - дрыгать ногами нет возможности...". Все прекрасно дрыгается. smile.gif
dENIM
Цитата(prottoss @ Jul 23 2008, 20:02) *
Драйвер написал. Все отлично работает... НО для меня так и остались загадкой реплики типа "...ARM не АВР - дрыгать ногами нет возможности...". Все прекрасно дрыгается. smile.gif

это видимо про то, что у авр частота дрыгания ногами = частоте тактов
а в арме все оочень медленно, по сравнению с тактовой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.