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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 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.RU
 
Аватар для estet
 
Регистрация: 17.05.2005
Адрес: Украина
Сообщений: 1,963
Сказал спасибо: 295
Сказали Спасибо 496 раз(а) в 361 сообщении(ях)
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, время: 21:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot