Форум по разработке и ремонту электронной техники Киевский форум радиолюбителей и электронщиков. Форумы по разработке и ремонту электронной техники
    Схемы электрические принципиальныеГлавная    ФорумФорум    ПоискПоиск по форуму    Личные сообщенияФайлообменник    Личные сообщенияРадиотехнический каталог   

Фотогалерея   <b>Профиль</b>Ваш профиль    Личные сообщенияЛичные сообщения    ГруппыГруппы   

FAQFAQ    РегистрацияРегистрация    ВходВход

Уважаемые посетители! Это старая версия форума. Новая версия находится по адресу: http://www.remexpert.com
Алгоритм обработки кнопок (без матриц)
На страницу Пред.  1, 2, 3  След.
 
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС...
 
Автор Сообщение
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 20 Апр 2007, 9:45    Заголовок сообщения: Ответить с цитатой

без проблем скачал - на 2 мегабитах, правда
_________________
меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DL36
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 04.10.2006
Сообщения: 192
Откуда: Херсон

СообщениеДобавлено: 22 Апр 2007, 21:32    Заголовок сообщения: Ответить с цитатой

Давно и успешно использую следующий алгоритм.

1. Поскольку у меня система обрабатывает не только кнопки, то кнопки обрабатываются периодическим опросом в главном цикле.
2. С каждой связана структура, в которой один нибл связан с нажатым состоянием кнопки, а второй нибл связан с отпущенный состоянием кнопки.
3. Через промежутки времени определяемыми, системным таймером проверяется состояние кнопки и в зависимости от этого уменьшается до нуля один нибл и увеличивается другой.
4. Другая подпрограмма просто периодически проверяет состояние ниблов.

Преимущество данного подхода в том, что не требуется выделять специальное время на опрос кнопок. А за счет задержек главного цикла дребезг подавляется великолепно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
day177
Знатный посетитель (>20)
Знатный посетитель (>20)


Зарегистрирован: 25.12.2006
Сообщения: 51
Откуда: Тула

СообщениеДобавлено: 23 Апр 2007, 11:38    Заголовок сообщения: Ответить с цитатой

to DL36
а можно ваш код на почту day177 собака yandex.ru

Цитата:
Не могу скачать архивы с предыдущих постов ... почти до конца доходит и обрывает

та же фигня - качал мозиллой и качалкой Грусть
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndryG
Модератор


Зарегистрирован: 24.07.2006
Сообщения: 411
Откуда: Helios-3

СообщениеДобавлено: 23 Апр 2007, 12:40    Заголовок сообщения: Ответить с цитатой

DL36

Можно подробней?

Если отпущено - один нибл ++ второй -- ... тогда 0xF0 - отпущено точно 0x0F - нажато точно ... я верно понял?

Если так, то зачем ДВА нибла? Можно просто один юзать.

И потом ... как В вашем алгоритме вылавливается момент НАЖАТИЯ кнопки и факт отработки этого нажатия программой?

_________________
AndryG
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 23 Апр 2007, 13:44    Заголовок сообщения: Ответить с цитатой

принцип тот же, что я давал - два счетчика - 2 нибла. Даже если за счет дребезга клавиш увеличивается "ненужный" счетчик, он не играет большой роли в общем счете.
_________________
меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DL36
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 04.10.2006
Сообщения: 192
Откуда: Херсон

СообщениеДобавлено: 25 Апр 2007, 9:42    Заголовок сообщения: Ответить с цитатой

AndryG писал(а):
DL36

Можно подробней?

Если отпущено - один нибл ++ второй -- ... тогда 0xF0 - отпущено точно 0x0F - нажато точно ... я верно понял?

Если так, то зачем ДВА нибла? Можно просто один юзать.

И потом ... как В вашем алгоритме вылавливается момент НАЖАТИЯ кнопки и факт отработки этого нажатия программой?

Тут подход очень важен, у меня ни одно подпрограмма не получает монопольно процессор. Я никогда не ожидаю момента нажатия кнопки.
Все время процессора я делю на части, до 16 частей получается нормально без RTOS.
Подпрограмма должна уложиться в отведенное время.
Вызываю таким образом
Код:

//Главный цикл
   CLRWDT();   //

   if (bittime.syscont)   syscont(3);
   if (bittime.imputpoll)   imput_poll();
   if (bittime.onoff)   onoff();
   if (bittime.service)   service();



Кнопки оврабатываю так. Эта подпрограмма вызывается только один раз на проходе. Задержка времени необходимая для подавления дребезга, формируется между проходами.
Код:

void onoff(void)
{
               //RB4
               if (RB4)
               {
                  if (incan[qcan].open)--incan[qcan].open;
                  if ((incan[qcan].closed)<8)++incan[qcan].closed;
               }//if (RB4)
               else
               {
//               fl=0;
                  if (incan[qcan].closed)--incan[qcan].closed;
                  if ((incan[qcan].open)<8)++incan[qcan].open;
               }//else if (RB4)
}
Код:
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 25 Апр 2007, 9:53    Заголовок сообщения: Ответить с цитатой

Так где здесь задержки ? И почему счетчик ограничен 8, а не 16 ?
_________________
меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DL36
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 04.10.2006
Сообщения: 192
Откуда: Херсон

СообщениеДобавлено: 25 Апр 2007, 10:04    Заголовок сообщения: Ответить с цитатой

urry писал(а):
Так где здесь задержки ?

Задержка определяется вызовом подпрограммы в главном цикле.
Код:

while(1)
{
   CLRWDT();   //

   if (bittime.syscont)   syscont(3);
   if (bittime.imputpoll)   imput_poll();
   if (bittime.onoff)   onoff();  [b]Вызов отсюда время между вызовами довольно большое[/b]       
   if (bittime.service)   service();
}



urry писал(а):
И почему счетчик ограничен 8, а не 16 ?

Для меня 8 достаточно, а проверить можно одной командой, код получается компактнее.

[/b]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
day177
Знатный посетитель (>20)
Знатный посетитель (>20)


Зарегистрирован: 25.12.2006
Сообщения: 51
Откуда: Тула

СообщениеДобавлено: 24 Дек 2007, 13:08    Заголовок сообщения: Ответить с цитатой

Цитата:
алгоритм - это считать количество 0 и 1 на входе - если преобладает то или иное - нажата или отжата. Грубо, но действенно.


нечто вроде этого?

Код:
#define kn1 PIND.7
bit kn1_state;

//код выполняется в прерывании счетчика
{
volatile unsigned char cnt,cnt1,cnt2;
cnt++;
if (kn1) cnt1++;
else cnt2++;
if (cnt==5){
if (cnt1>cnt2) kn1_state=0;
else kn1_state=1;
cnt=cnt1=cnt2=0;
}//if
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 25 Дек 2007, 14:32    Заголовок сообщения: Ответить с цитатой

ну почти правильно - есть нюансы - которые сразу режут гдаз - кроме - кнопка нажато - отжато - существует - по определению еще и 3 состояние - кнопка не определилась - считает антидребезг. Дальше - не сбрасывается счетчик при заполнении и обнулении - и чмсла 5 как-то мало.
Код:

 #define kn1 PIND.7
bit kn1_state_naj;
bit kn1_state_otj;
 
//код выполняется в прерывании счетчика
{
volatile unsigned char cnt//cnt1,cnt2;  чето много счетчиков
cnt++;
if (kn1) cnt1++;
else cnt--;
if (cnt==50)
          {
           cnt=49;
          kn1_state_naj=1;
           }
if (cnt<0)
            {
           cnt=0;
            kn1_state_otj=1;
             }

}

Ecли опрашивать так с периодичностью милисекунд 5-10 - чтобы подавляло дребезг - то может работать - хотя я предпочитаю структуры - а 2 счетчика - это для очень уж жестких случаев - типа механического энкодера

_________________
меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС... Часовой пояс: GMT + 2
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы можете просматривать вложения в этом форуме


Rambler's Top100 PageRank Яндекс цитирования
Сайты наших друзей: Гири, все о гирях, Автоматизация магазинов, супермаркетов, ресторанов, кинотеатров,
Весы электронные, Сканеры штрих-кода, Принтеры штрих-кода

Powered by phpBB © 2001, 2005 phpBB Group

Время генерации страницы: 0.577s (PHP: 88% - SQL: 12%) - SQL запросов: 12 - GZIP enabled - Debug on