Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Помогите решить глюк с клавиатурой

Непрочитано 15.12.2009, 03:51  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

2PicAVR Ты гений!!! очень твои советы помогли в реализации ПОМЕХОУСТОЙЧИВОГО устройства

Финальный результат размышлений:

Код:
unsigned short int scancode //Переменная в которую ложим сканкод нажатой (нажатых) клавиш 

DDRx=0b11110000; //Строки на старших питаем и столбцы на младших разрядах читаем
PORTx=0b11110000; //узнаем а не нажато ли что либо
if (PINx & 0xf != 0) {
scancode=PINx & 0xf; // Столбец ставим в сканкод
DDRx=0b00001111; //Строки на старших теперь читаем а столбцы на младших разрядах питаем
PORTx=0b00001111; 
scancode+=((PINx&0xf0) ›› 4)&0xf; //Теперь строку прибавляем к сканкоду
}
Конечно, на выходе у нас не строковые значения, но уже реальный сканкод комбинации клавиш который нам будет весьма просто использовать в работе.


Агаа, а я вот не подумал о том что нажать могут 2 или более кнопок одновременно. Если уж такое дело, то нужен как минимум восьми битный сканкод. Что упрощает задачу


Код:
unsigned short int scancode //Переменная в которую ложим сканкод нажатой (нажатых) клавиш 

DDRx=0b11110000; //Строки на старших питаем и столбцы на младших разрядах читаем
PORTx=0b11110000; //узнаем а не нажато ли что либо
if (PINx & 0xf != 0) {
scancode=PINx & 0xf; // Столбец ставим в сканкод
DDRx=0b00001111; //Строки на старших теперь читаем а столбцы на младших разрядах питаем
PORTx=0b00001111; 
scancode+=PINx&0xf0; //Теперь строку прибавляем к сканкоду
}
Реклама:

Последний раз редактировалось MasterMushi; 15.12.2009 в 04:03. Причина: забыл про безопасность битовых сдвигов и нажатие 2х клавиш
MasterMushi вне форума  
Непрочитано 15.12.2009, 17:03  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от MasterMushi Посмотреть сообщение
2PicAVR Ты гений!!! очень твои советы помогли в реализации ПОМЕХОУСТОЙЧИВОГО устройства
Да это просто опыт... ИМХО все утройства должны иметь помехозащищёные програмные обработки входов.

Сообщение от MasterMushi Посмотреть сообщение
Агаа, а я вот не подумал о том что нажать могут 2 или более кнопок одновременно.
Если кнопок не много, от имеет смысл результат представлять по другому. Каждая клавиша это один бит. Например 1 байтная переменная STATKEY будет содержать информацию о 8 клавишах, соответственно без разницы сколько будет нажато одновременно... Обо всех информация сохранится. Обычно так делаю до 20-30 клавиш. Удобство получения информации по каждой клавише покрывает расход 3х байт RAM. (32 клавиши = 4 байта. Unsigned long )

Сканкоды имеют смысл, если не нужно отлавливать нажатия более одной клавиши, или этих клавиш много... как например в клавиатуре компа.

Последний раз редактировалось picavr; 15.12.2009 в 17:12.
picavr вне форума  
Непрочитано 20.12.2009, 20:53  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

А какой номинал резисторов нужно ставить на клавиатуру?
os1n вне форума  
Непрочитано 20.12.2009, 21:43  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

2picavr

Сообщение от picavr Посмотреть сообщение
Вызовы процедуры с произвольным периодом 1-30 милисек, подкоректировать константы времени на срабатывание и на повтороное срабатывание, обычно первое срабатываени 30-80 милисек, повторноесрабатываение (при удержании) 0,15-0,3 сек
Так получается, что в данном случае запуск сканирования производится постоянно, но не всегда доходит до конца, правильно?

И можно вас попросить кинуть код под ваш алгоритм.
os1n вне форума  
Непрочитано 21.12.2009, 00:16  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от os1n Посмотреть сообщение
А какой номинал резисторов нужно ставить на клавиатуру?
Пардон, уже нашел, кому интересно:
Миниатюры:
Нажмите на изображение для увеличения
Название: keypad.png
Просмотров: 57
Размер:	22.6 Кб
ID:	3037  
os1n вне форума  
Непрочитано 30.05.2010, 15:46  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Советую прочитать всем, кто еще не разобрался

Глюк решен, благодаря собственным усилиям и не без помощи вышеперечисленных спецов (еще раз спасибо).

Но советую просмотреть внешнюю ссылку:
http://eugenemcu.ru/publ/2-1-0-45

Все очень доступно описано и код практически рабочий

Выкладываю доработанный код:

--------------------------------------------------------------------
--------------------------------------------------------------------
//#include ‹mega8535.h›
//#include ‹DELAY.H› // для обработки задержек
#define PORTx PORTB
#define DDRx DDRB
#define PINx PINB

char Key;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Key=0;
PORTx=0xFF;
PORTx&=~(1‹‹0); // Выбрать столбец 1.
switch (PINx)
{
case 0b11101110: {Key=1; break;} // Кнопка 1A.
case 0b11011110: {Key=2; break;} // Кнопка 1B.
case 0b10111110: {Key=3; break;} // Кнопка 1C.
case 0b01111110: {Key=4; break;} // Кнопка 1D.
}
PORTx=0xFF; // Исходное состояние.

PORTx&=~(1‹‹1); // Выбрать столбец 2.
switch (PINx)
{
case 0b11101101: {Key=5; break;} // Кнопка 2A.
case 0b11011101: {Key=6; break;} // Кнопка 2B.
case 0b10111101: {Key=7; break;} // Кнопка 2C.
case 0b01111101: {Key=8; break;} // Кнопка 2D.
}
PORTx=0xFF; // Исходное состояние.

PORTx&=~(1‹‹2); // Выбрать столбец 3.
switch (PINx)
{
case 0b11101011: {Key= 9; break;} // Кнопка 3A.
case 0b11011011: {Key=10; break;} // Кнопка 3B.
case 0b10111011: {Key=11; break;} // Кнопка 3C.
case 0b01111011: {Key=12; break;} // Кнопка 3D.
}
PORTx=0xFF; // Исходное состояние.

PORTx&=~(1‹‹3); // Выбрать столбец 4.
switch (PINx)
{
case 0b11100111: {Key=13; break;} // Кнопка 4A.
case 0b11010111: {Key=14; break;} // Кнопка 4B.
case 0b10110111: {Key=15; break;} // Кнопка 4C.
case 0b01110111: {Key=16; break;} // Кнопка 4D.
}
PORTx=0; // Исходное состояние порта. Не обязательно
PORTC.3=1; // Подключил лампочку, чтобы удостовериться,
delay_ms(100); // что прерывание обрабатывается
PORTC.3=0; // рекомендую не убирать.
}

--------------------------------------------------------------------
Обращение в проге:
--------------------------------------------------------------------



while (1)
{
lcd_gotoxy(0,1);
lcd_putchar(Key+0x30);
out(Key,3); // Внешняя прога, включена в архив
};

--------------------------------------------------------------------
--------------------------------------------------------------------

Рекомендую просмотреть вложение.
Прога собрана в CodeVisionAVR. Тестилась в Рroteus"е на ATMEGA8535.
Клавиатура 4х4.

Если есть замечания - обращайтесь.
Вложения:
Тип файла: rar Keyb.rar (87.1 Кб, 39 просмотров)

Последний раз редактировалось os1n; 30.05.2010 в 15:49.
os1n вне форума  
Сказали "Спасибо" os1n
MasterMushi (01.06.2010)
Непрочитано 31.05.2010, 16:46  
estet
Почётный гражданин KAZUS.RUN
 
Аватар для estet
 
Регистрация: 17.05.2005
Адрес: Украина
Сообщений: 1,972
Сказал спасибо: 301
Сказали Спасибо 503 раз(а) в 367 сообщении(ях)
estet на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Не замечание, а вопрос. Как неспецу в Си, поясните: какова (в циклах) разница между выборкой столбца и чтением строки, т.е. интервал между выводом и вводом? Я к тому, что при других условиях (рабочая частота выше, клавиатура вынесена) глюки возобновятся.
estet вне форума  
Непрочитано 01.06.2010, 02:34  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

os1n,
Посмотрел твой код и понял что он гораздо проще и без применения DDRx )))
Как я раньше не подумал что переключать порт на выход не надо, достаточно только активировать подтягивающие сопротивления на входах ))

estet,
В приведенных примерах интервал - только частота процессора. Если надо задавать задержки между стартом сигнала и началом опроса, то можно вставить и асмовые кусочки пропуска тактов. А можно воспользоваться библиотекой задержек, ( тоесть функцией delay_us(); )
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти схемы Toshiba Satellite A300-1ec и Toshiba Satellite A300d Alex-Alpha Поиск схем. Делимся схемами 1 11.03.2010 22:09
Помогите перевернуть пилу akula58 Электроника - это просто 73 11.02.2010 11:30
Помогите решить задачки Doc_Brown Автоматика и аппаратура связи 0 29.10.2009 23:18
Помогите решить, плиз: usb - не опознается Haze_ Микроконтроллеры, АЦП, память и т.д 3 09.10.2009 21:35


Часовой пояс GMT +4, время: 16:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.