0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
|
|
1 | |
Сенсорная кливиатура на MCS-5103.03.2015, 01:37. Показов 12926. Ответов 14
Метки нет (Все метки)
Доброго времени суток. Возможно ли сделать сенсорную клавиатуру на микроконтроллерах данной архитектуры. Почему так ставлю воппрос? Потому что по AVR нарыл кучу примеров, даже на Бейсике и Алгоритм Билдере, а вот на MCS-51 ни одного.
Вот найденый алгоритм для AVR: 1. Порт ножки переводится на вывод (1 -> DDRxn) и сбрасывается в ноль (0 -> PORTxn); 2. Порт ножки переводится на ввод, в высокоимпедансное Z-состояние (0 -> DDRxn). Так как до этого на ножке был ноль, а элементы электрической цепи ножки имеют определенную емкость, то начинается процесс заряда этой емкости через внешний резистор подтяжки; 3. С момента переключения ножки на ввод начинается отсчет времени с контролем состояния ножки (PINxn), как только на ножке появилась единица (PINxn = 1) – останавливается счетчик; 4. Полученное значение счетчика и есть емкость ножки в относительных единицах. По величине этого значения и можно судить о том есть ли прикосновение к сенсору или нет. Как я вычитал, порты в MCS-51 квазидвунаправленые, и по сути всегда настроены на выход, просто подтяжка к + у них сделана более слабой, и потому ее легко можно пересилить, и считать, что же на самом деле пришло на вход. Но она (эта подтяжка) неоключаемая, и сопротивление резисторов на порядок меньше нужных мне 1 мОм. Только порт Р0 не имеет внутренных резисторов на + (и можно влепить внешние нужного номинала). Получаеться, я только на него могу повесить сенсорные клавиши, остальные порты в пролете ?
0
|
03.03.2015, 01:37 | |
Ответы с готовыми решениями:
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
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
0
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
27.08.2015, 01:17 | 7 |
Сообщение от Kmusmos
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
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
25.09.2015, 16:17 | 13 |
У Silabs есть аппноты для расчета сенсорной клавиатуры для собственных камней MCS-51.
AN367-Руководство по определению соотношения сигнал/шум и выбору требуемого порога срабатывания при разработке сенсорных клавиатур (Understomding Capacitive Sensing syknal to moysi ratios omd setting reliable thresholds) AN376-Описание эффективности типовых методик защиты от статического электричества при разработке сенсорных клавиатур (Effects of ESD Protection Devices on Capacitive Sensing Performance AN447-Руководство по дизайну кнопок для реализации сенсорных клавиатур на базе микроконтроллеров C8051F70x/71x и C8051F80x-83x (Printed Circuit Desykn Notes for Capacitive Sensing wyth the CS0 Module)
0
|
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 137
|
|
25.09.2015, 16:35 | 14 |
Сообщение от omokost
0
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
25.09.2015, 16:55 | 15 |
Правильнее, на мой взляд, переделать логику фиксации срабатывания не на касание сенсора, а на его отпускание. Т.е. регистрируем касание (запускаем счетчик), в течении 200-300мс его подтверждаем (если помеха, сбрасываем счетчик), реагируем на отпускание (счетчик досчитал и входной сигнал пропал).
0
|
25.09.2015, 16:55 | |
25.09.2015, 16:55 | |
Помогаю со студенческими работами здесь
15
STM32L + сенсорная библиотека. Сенсорная клавиатура Windows 8 Сенсорная клавиатура на ATmega16A Delphi и сенсорная панель сенсорная панель нетбука Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |