Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/70: Рейтинг темы: голосов - 70, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
1

Сенсорная кливиатура на MCS-51

03.03.2015, 01:37. Показов 12926. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Возможно ли сделать сенсорную клавиатуру на микроконтроллерах данной архитектуры. Почему так ставлю воппрос? Потому что по AVR нарыл кучу примеров, даже на Бейсике и Алгоритм Билдере, а вот на MCS-51 ни одного.
Вот найденый алгоритм для AVR:
1. Порт ножки переводится на вывод (1 -> DDRxn) и сбрасывается в ноль (0 -> PORTxn);
2. Порт ножки переводится на ввод, в высокоимпедансное Z-состояние (0 -> DDRxn). Так как до этого на ножке был ноль, а элементы электрической цепи ножки имеют определенную емкость, то начинается процесс заряда этой емкости через внешний резистор подтяжки;
3. С момента переключения ножки на ввод начинается отсчет времени с контролем состояния ножки (PINxn), как только на ножке появилась единица (PINxn = 1) – останавливается счетчик;
4. Полученное значение счетчика и есть емкость ножки в относительных единицах. По величине этого значения и можно судить о том есть ли прикосновение к сенсору или нет.

Как я вычитал, порты в MCS-51 квазидвунаправленые, и по сути всегда настроены на выход, просто подтяжка к + у них сделана более слабой, и потому ее легко можно пересилить, и считать, что же на самом деле пришло на вход. Но она (эта подтяжка) неоключаемая, и сопротивление резисторов на порядок меньше нужных мне 1 мОм. Только порт Р0 не имеет внутренных резисторов на + (и можно влепить внешние нужного номинала). Получаеться, я только на него могу повесить сенсорные клавиши, остальные порты в пролете ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2015, 01:37
Ответы с готовыми решениями:

Сенсорная сеть
Доброго времени суток, форумчане! Суть моего вопроса такова. Имеются 20 устройств (сенсоров). У...

Сенсорная клавиатура
Доброе утро! Есть задумка, взяться за вот этот проект...

Сенсорная клавиатура
Здравствуйте, уважаемые программисты. Давно сюда не заходил )) Хочу спросить: Можно ли с помощью...

Сенсорная клавиатура
Есть ПК с сенсорным экраном. ОС W7 Pro x86. Необходимо что бы "панель ввода планшетного ПК" или...

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

14
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
03.03.2015, 02:52 2
Похоже на то.
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 569
03.03.2015, 13:52 3
Есть масса МК с 51 архитектурой, имеющих на борту соответствующий узел ("capacitive simse").
http://www.silabs.com/products/mcu/Page ... rfosi.aspx
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
03.03.2015, 16:21 4
Цитата Сообщение от Kotz
...
Мне просто жалко для таких вспомогательных целей (выносной блок клаватуры) крутой контроллер гробить. Я бы и на базе простого AVR бы уже склепал (готовых проектов хватает), так просто хочу это барахло (АТ89S52) применить. Видимо придеться для экономии пробовать делать 8 сенсорных клавиш, а остальные - обычные тактовые кнопки ставить.
0
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 569
03.03.2015, 17:35 5
Ну если S52, то да. :)
А те контроллеры по цене сопоставимы с AVR-ками. Например: http://www.fymdchips.com/seorsh/C8051F990
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
26.08.2015, 23:08 6
Доброго времени суток. Опять я со своими MCS-51. Наверное это стоило запостить в "Алгоритмы", но раз уж есть эта тема, то решил сюда.
Немного подумав, решил сделать немного другой алгоритм, и прежде чем пытаться травить макет (все равно сейчас в отъезде) решил спросить, будет ли оно вообще работать. Новый алгоритм таков:
1. Тупо весь порт сажать в ноль, потом 1 ноп для устаканивания, потом поднимаем весь порт, и запускаем таймер.
2. Так как нажатый сенсор все равно зарядиться последним, то первые 7 мы тупо пропускаем, а вот на последнем 8 останавливаем таймер и сравниваем его с предварительно калиброваным значением, если такое же (или меньше), то не было нажатия, а если больше, то было.
3. Ну а там дальше понятно, обработка факта нажатия, присвоение кода клавиши и т.д.

Будет ли работать такой алгоритм ?
В коде вот что получилось:
Код
KeyPort   equ     P0                      ; Порт клавиатуры

Key_1   equ     P0.0                    ; Определения отдельных сенсоров
Key_2   equ     P0.1
Key_3   equ     P0.2
Key_4   equ     P0.3
Key_5   equ     P0.4
Key_6   equ     P0.5
Key_7   equ     P0.6
Key_8   equ     P0.7

zumer   equ     P3.5

symbol   equ   R3                   ; Переменная, в которой храниться код нажатой клавиши
;================================================================================================================================================================================
dseg    at      8h                      ; Первых 8 ячеек (с R0 по R7 0 банка) резервируем
; Здесь обявляем наши переменные, если они нужны
SensorH:                                ; Старший байт попугаев чувствительности сенсора
ds   1
SensorL:                                ; Младший байт попугаев чувствительности сенсора
ds   1
CodeSensor:                           ; Переменная, сброшеный бит которой показывает последний зарядившийся (а значит возможно нажатый) сенсор
ds      1

Stack:                                  ; А дальше пойдет стек
;================================================================================================================================================================================
cseg

Scan_TouchPad:

Init_Timer0:            ; Инициализируем Timer0
mov   TMOD,#1         ; Режим работы - №2 (16-бит)

Cotybration:                                 ; Калибровка по Key_1
clr   Key_1         ; Сбрасываем 1 сенсор в 0
nop                                   ; Потупим 1 мкс, чтобы на ножке установилось значение
setb   Key_1         ; Поднимаем 1 сенсор
setb   TR0                 ; Запускаем Timer0
Cotybration_again:
mov     C,Key_1                   ; Считаем состояние 1 сенсора
jnc       Cotybration_again   ; Не зарядилась ? Опять проверяем
clr   TR0                           ; Зарядился. Остановим Timer0
mov     A,TH0                        ; Занесем старший байт значения счетчика Timer0
add     A,#1         ; Добавим для гистерезиса
mov     SensorH,A                ; И занесем в старший байт попугаев сенсора

mov     A,TL0                      ; Занесем младший байт значения счетчика Timer0
add     A,#1         ; Добавим для гистерезиса
mov     SensorL,A                ; И занесем в младший байт попугаев сенсора

Main:
mov   TL0,#0                      ; Заново занесем значение в счетный регистр Timer0
mov   TH0,#0

mov   KeyPort,#0                ; Все ножки сбрасываем в 0
nop                                  ; Потупим 1 мкс, чтобы на ножках установилось значение
mov   KeyPort,#0FFh           ; Все ножки устанавливаем в 1
setb    TR0                        ; Запустим Timer0
Again:
mov     A,KeyPort               ; Считаваем состояние сенсоров
jz      Again                       ; Пока хотя бы один не зарядиться
Again_2:                                   ; Какой-то зарядился
mov     A,KeyPort             ; Считаем состояние сенсоров
cjne    A,#0FFh,NoPush       ; Если не все зарядились, значит не было нажатия (нажимаемый сенсор зарядиться последним)
clr     TR0                         ; Все зарядились, остановим Timer0
jmp     GetPush
NoPush:
mov     CodeSensor,A            ; Занесем текущее состояние сенсоров, чтобы знать, какой зарядился последним
jmp     Again_2                     ; И валим проверять снова
GetPush:
mov     A,TH0
cjne    A,#SensorH,PushOrNo   ; Сравним время задядки последнего сенсора с образцом
mov     A,TL0                      ; Такое же, значит надо проверить младший байт попугаев
cjne    A,#SensorL,PushOrNo
jmp     No                           ; И младший байт такой же, значит не было нажития, ведь должно быть больше
PushOrNo:
jc      No                            ; Меньше, значит не было нажатия, ведь должно быть больше
; Обработка нажатия сенсора
No:                                           ; Значит последний сенсор зарядился сам по себе, и никто к нему не прикасался
mov     CodeSensor,#0FFh   ; Поэтому занесем в переменную сенсора все единицы

ret
end
П.С. Кстатии, а по-русски как правильно читается: МКС-51 или МЦС-51 ???
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
27.08.2015, 01:17 7
Цитата Сообщение от Kmusmos
...П.С. Кстатии, а по-русски как правильно читается: МКС-51 или МЦС-51 ???
Мне встречалась такая транскрипция - Micro Controler System, а уж как перевести, решайте сами...
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 49
27.08.2015, 15:18 8
Цитата Сообщение от Kmusmos
Будет ли работать такой алгоритм ?
Никто не мешает проверить в железе.
ЭмСиЭс.

Про АВР. Делал настройку порта на ввод. Периодически опрашивал. (От пальца идут наводки.) За определенный кусок времени подсчет "1". Если количество более N, то принимаем решение о прикосновении. Один минус - при питании от батарейки система не работает.
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
24.09.2015, 21:58 9
Дошли руки вытравить платку под это дело, а также написать свой алгортм на ассемблере. Но оно не взлетело. Ну не то что чтобы совсем не взлетело, но летит оно как-то криво и очень низко. Короче при касании разных сенсоров по UART шлется мусор из разных комбинаций "E0" и "00" (хотя должен слатся ASCII код символа). Подозреваю что это из-за того, что UART написан без применения прерываний, просто на основе анализа флагов TI/RI. Если касания нет, мусор не шлется, то есть сам факт касания распознается (прада пока только при непосредственном контакте к площадкам, или при наличии очень тонкой изолирующей прокладки. С обратной стороны, через текстолит реагировать не хочет).
Код (только модуля клавиатуры, основной цикл и юарт в отдельных модулях):
Код
; Все выводы Р0 подтягиваем к VCC резисторами номиналом 1 МОм.
; 1. Порт клавиатуры сбрасывается в ноль (mov KeyPort,#0).
; 2. Весь порт клавиатуры устанавливается в 1 (mov KeyPort,#0FFh). Так как до этого на ножках был ноль, а элементы электрической цепи ножки имеют определенную емкость,
;   то начинается процесс заряда этих емкостей через внешние резисторы подтяжки 1 МОм.
; 3. С момента поднятия ножкек начинается отсчет времени (setb TR0) с контролем состояния ножек (mov A,KeyPort), как только на любой ножке появилась единица (jz Again) – начинаем проверять когда зарядится весь порт (cjne A,#0FFh,NoPush).
; 4. Как только весь порт зарядиться, останавливаем счетчик. Полученное значение счетчика и есть емкость последней заярженой ножки в попугаях. По величине этого значения и можно судить о том есть ли прикосновение к сенсору.
;   С прикосновением, время зарядки сенсора будет увеличиваться, таким образом, значение из счетного регистра Timer0, будет больше калибровочного значения, записаного в переменных SensorH и SensorL
;==============================================================================================================================================================================================================================
KeyPort   equ     P0                      ; Порт клавиатуры

Key_1   equ     P0.0                    ; Определения отдельных сенсоров
Key_2   equ     P0.1
Key_3   equ     P0.2
Key_4   equ     P0.3
Key_5   equ     P0.4
Key_6   equ     P0.5
Key_7   equ     P0.6
Key_8   equ     P0.7

zumer   equ     P3.5

symbol   equ   R3                   ; Переменная, в которой храниться код нажатой клавиши

; Не использовать RO и R1, используються для формирования задежек

;==============================================================================================================================================================================================================================
dseg    at      8h                      ; Первых 8 ячеек (с R0 по R7 0 банка) резервируем
; Здесь обявляем наши переменные, если они нужны
SensorH:                                ; Старший байт попугаев чувствительности сенсора
ds   1
SensorL:                                ; Младший байт попугаев чувствительности сенсора
ds   1
CodeSensor:                             ; Переменная, сброшеный бит которой показывает последний зарядившийся (а значит возможно нажатый) сенсор
ds      1

Stack:                                  ; А дальше пойдет стек
;==============================================================================================================================================================================================================================
cseg

Init_Timer0:            ; Инициализируем Timer0
mov   TMOD,#1         ; Режим работы - №2 (16-бит)

Cotybration:                            ; Калибровка по Key_1
clr   Key_1         ; Сбрасываем 1 сенсор в 0
nop                             ; Потупим 1 мкс, чтобы на ножке установилось значение
setb   Key_1         ; Поднимаем 1 сенсор
setb   TR0         ; Запускаем Timer0
Cotybration_again:
mov     C,Key_1                 ; Считаем состояние 1 сенсора
jnc       Cotybration_again   ; Не зарядилась ? Опять проверяем
clr   TR0                     ; Зарядился. Остановим Timer0
mov     A,TH0                ; Занесем старший байт значения счетчика Timer0
add     A,#1         ; Добавим для гистерезиса
mov     SensorH,A               ; И занесем в старший байт попугаев сенсора
mov     A,TL0                   ; Занесем младший байт значения счетчика Timer0
add     A,#1         ; Добавим для гистерезиса
mov     SensorL,A               ; И занесем в младший байт попугаев сенсора

mov   TH0,#3Ch      ; Заново занесем значение в счетный регистр Timer0
mov   TL0,#0AFh               ; При данном значении прерывание возникает каждые 50 мс
setb   ET0         ; Разрешаем прерывания от Timer0
setb   TR0         ; Запускаем Timer0

ret

Scan_TouchPad:
clr     EA                      ; Запретим все прерывания
clr   TR0                     ; Остановим Timer0

mov   TL0,#0                  ; Заново занесем значение в счетный регистр Timer0
mov   TH0,#0

mov   KeyPort,#0              ; Все ножки сбрасываем в 0
nop                             ; Потупим 1 мкс, чтобы на ножках установилось значение
mov   KeyPort,#0FFh           ; Все ножки устанавливаем в 1
setb    TR0                     ; Запустим Timer0
Again:
mov     A,KeyPort               ; Считаваем состояние сенсоров
jz      Again                   ; Пока хотя бы один не зарядиться
Again_2:                                ; Какой-то зарядился
mov     A,KeyPort      ; Считаем состояние сенсоров
cjne    A,#0FFh,NoPush          ; Если не все зарядились, значит не было нажатия (нажимаемый сенсор зарядиться последним)
clr     TR0                     ; Все зарядились, остановим Timer0
jmp     GetPush
NoPush:
mov     CodeSensor,A            ; Занесем текущее состояние сенсоров, чтобы знать, какой зарядился последним
jmp     Again_2                 ; И валим проверять снова
GetPush:
mov     A,TH0
cjne    A,#SensorH,PushOrNo   ; Сравним время задядки последнего сенсора с образцом
mov     A,TL0                   ; Такое же, значит надо проверить младший байт попугаев
cjne    A,#SensorL,PushOrNo
jmp     No                      ; И младший байт такой же, значит не было нажития, ведь должно быть больше
PushOrNo:
jc      No                      ; Меньше, значит не было нажатия, ведь должно быть больше
setb   F0         ; Обработка нажатия сенсора, установим флаг, дающий понять, что было касание сенсора
clr     zumer                   ; Озвучим касание сенсора
jmp     TouchPad_heomdler
No:                                     ; Значит последний сенсор зарядился сам по себе, и никто к нему не прикасался
mov     CodeSensor,#0FFh   ; Поэтому занесем в переменную сенсора все единицы
jmp     End_TouchPad_heomdler

TouchPad_heomdler:
mov     A,CodeSensor            ; Занесем код нажатого сенсора
cjne    A,#11111110b,Sensor_2   ; И сравним с первым нажатым сенсором
mov     symbol,#41h             ; Это он
jmp   End_TouchPad_heomdler   ; Ну и пропускаем дальнейшую проверку
Sensor_2:                               ; Это не 1 сенсор, проверяем 2, и т.д.
cjne    A,#11111101b,Sensor_3
mov     symbol,#42h
jmp   End_TouchPad_heomdler
Sensor_3:
cjne    A,#11111011b,Sensor_4
mov     symbol,#43h
jmp   End_TouchPad_heomdler
Sensor_4:
cjne    A,#11110111b,Sensor_5
mov     symbol,#44h
jmp   End_TouchPad_heomdler
Sensor_5:
cjne    A,#11101111b,Sensor_6
mov     symbol,#45h
jmp   End_TouchPad_heomdler
Sensor_6:
cjne    A,#11011111b,Sensor_7
mov     symbol,#46h
jmp   End_TouchPad_heomdler
Sensor_7:
cjne    A,#10111111b,Sensor_8
mov     symbol,#47h
jmp   End_TouchPad_heomdler
Sensor_8:
cjne    A,#01111111b,Sensor_8
mov     symbol,#48h

End_TouchPad_heomdler:
;   call   Del_100ms               ; Задержка

mov   TH0,#3Ch      ; Заново занесем значение в счетный регистр Timer0
mov   TL0,#0AFh               ; При данном значении прерывание возникает каждые 50 мс
setb    EA                      ; Разрешаем все прерывания
setb   TR0         ; Запускаем Timer0

reti

Del_100ms:
mov   R2,#4h
mov   R1,#0A0h
mov   R0,#4Ch
djnz   R0,$
djnz   R1,$-4
djnz   R2,$-8
mov   R0,#49h
djnz   R0,$
ret
end
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
25.09.2015, 12:33 10
Сенсоры похожи на обычные пятачки для нажимных кнопок, рядом проходят сигнальные дорожки. Их бы окружить кольцом из земляного полигона. ИМХО.
P.S. Сенсорных клавиатур делать не приходилось...
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
25.09.2015, 13:46 11
Хорошая мысль, надо будет попробовать. Я ориентировалкся на такую конструкцию. Просто это опять плату новую травить, а у меня с этим проблемы, так что это будет не скоро.


<Изображение удалено>
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
25.09.2015, 16:13 12
Оно работает. Дело было не в бобине. Это я скорость юарта неправильно настроил. Пока проблема в том, что сенсоры нестабильно отрабатывают нажатие (держишь палец - нет символа, и тут вдруг бац, и 2-3 символа проскочило) + надо фактически прикасатся к сенсорам (низкая чувствительность). Но начало положено))
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
25.09.2015, 16:35 14
Цитата Сообщение от omokost
У Silabs есть ...
Вау, за последний документ особенное спасибо. Мне кажется, что если я все сделаю по тем рекомендациям, все параметры должны улучшится)))
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
25.09.2015, 16:55 15
Правильнее, на мой взляд, переделать логику фиксации срабатывания не на касание сенсора, а на его отпускание. Т.е. регистрируем касание (запускаем счетчик), в течении 200-300мс его подтверждаем (если помеха, сбрасываем счетчик), реагируем на отпускание (счетчик досчитал и входной сигнал пропал).
0
25.09.2015, 16:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2015, 16:55
Помогаю со студенческими работами здесь

STM32L + сенсорная библиотека.
Всем привет. ПОмогите разобраться. Не могу запустить сенсорные кнопки на дискавери борде. Когда...

Сенсорная клавиатура Windows 8
Доброго времени суток. Столкнулся с такой проблемой. На планшете установлена win 8.1, в нем есть...

Сенсорная клавиатура на ATmega16A
Затеялся я сделать сенсорную матрицу 4Х4 на базе 16меги и qt lib4.1 .Пользуясь мануалом наваял...

Delphi и сенсорная панель
Здравствуйте, хочу написать программу(справочник) для сенсорного киоска, в delphi 7. Сложно ли...

сенсорная панель нетбука
у меня нетбук фирмы samsung. купила относительно недавно - в конце марта, но уже сейчас проблема -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru