 |
|
|
|
| Автор |
Сообщение |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 20 Апр 2007, 9:45 Заголовок сообщения: |
|
|
без проблем скачал - на 2 мегабитах, правда _________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
DL36 Живет здесь... (>100)

Зарегистрирован: 04.10.2006 Сообщения: 192 Откуда: Херсон
|
Добавлено: 22 Апр 2007, 21:32 Заголовок сообщения: |
|
|
Давно и успешно использую следующий алгоритм.
1. Поскольку у меня система обрабатывает не только кнопки, то кнопки обрабатываются периодическим опросом в главном цикле.
2. С каждой связана структура, в которой один нибл связан с нажатым состоянием кнопки, а второй нибл связан с отпущенный состоянием кнопки.
3. Через промежутки времени определяемыми, системным таймером проверяется состояние кнопки и в зависимости от этого уменьшается до нуля один нибл и увеличивается другой.
4. Другая подпрограмма просто периодически проверяет состояние ниблов.
Преимущество данного подхода в том, что не требуется выделять специальное время на опрос кнопок. А за счет задержек главного цикла дребезг подавляется великолепно. |
|
| Вернуться к началу |
|
 |
day177 Знатный посетитель (>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 |
|
| Вернуться к началу |
|
 |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 23 Апр 2007, 13:44 Заголовок сообщения: |
|
|
принцип тот же, что я давал - два счетчика - 2 нибла. Даже если за счет дребезга клавиш увеличивается "ненужный" счетчик, он не играет большой роли в общем счете. _________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
DL36 Живет здесь... (>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)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 25 Апр 2007, 9:53 Заголовок сообщения: |
|
|
Так где здесь задержки ? И почему счетчик ограничен 8, а не 16 ? _________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
DL36 Живет здесь... (>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)


Зарегистрирован: 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)


Зарегистрирован: 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 счетчика - это для очень уж жестких случаев - типа механического энкодера _________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|