реклама на сайте
подробности

 
 
> динамический опрос кнопок, запутался окончательно
Anjey_N
сообщение Mar 7 2008, 13:39
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Всем привет! Вот пришёл просить помощи. Задача несложная, только я вконец уже запутался.
Есть МК ATmega16, АЛС, индикация динамическая, кнопки М, +, -
Есть массив переменных set_temp[3]. Пока кнопки не нажаты, происходит каждые 5 сек поочерёдный вывод на индикатор содержимого массива. ( с этим я разобрался работает). При нажати на М включается режим редактирования, 2 мл разряда индикатора мигают. Кнопками + и - изменяется содержимое элемента массива. Последующее нажатие М приводит к переходу к следующему элементу массива.
Если все элементы отредактированы - записать в EEPROM.

Кто что посоветует, или поможет кодом. Свой я надлежаще оформлю и выставлю позже. Пишу на Си в ИАРе.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rimpocha
сообщение Mar 12 2008, 19:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 6-03-07
Из: Новосибирск, Seattle
Пользователь №: 25 935



http://www.embedded.com/columns/breakpoint...equestid=203518

Вот! Прелестнейшая антидребезговая утилита от Jack Ganssle

По таймеру это ей жирно, я решил. Дергаю из мэйнлупа -- справляется на отлично.
// Service routine called by a timer interrupt
bool_t DebounceSwitch2()
{
static uint16_t State = 0; // Current debounce status
State=(State<<1) | !RawKeyPressed() | 0xe000;
if(State==0xf000)return TRUE;
return FALSE;
}

Подробное описание, в статье на английском. Если есть необходимость, переведу.


--------------------
НГТУ, Физико-технический факультет, кафедра Лазерных систем
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Mar 13 2008, 15:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(rimpocha @ Mar 12 2008, 23:08) *
http://www.embedded.com/columns/breakpoint...equestid=203518

Вот! Прелестнейшая антидребезговая утилита от Jack Ganssle

По таймеру это ей жирно, я решил. Дергаю из мэйнлупа -- справляется на отлично.
// Service routine called by a timer interrupt
bool_t DebounceSwitch2()
{
static uint16_t State = 0; // Current debounce status
State=(State<<1) | !RawKeyPressed() | 0xe000;
if(State==0xf000)return TRUE;
return FALSE;
}

Подробное описание, в статье на английском. Если есть необходимость, переведу.


Необходимость есть, переведи! help.gif
Go to the top of the page
 
+Quote Post
rimpocha
сообщение Mar 13 2008, 16:25
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 6-03-07
Из: Новосибирск, Seattle
Пользователь №: 25 935



Цитата(Anjey_N @ Mar 13 2008, 21:51) *
Необходимость есть, переведи! :help:


Эх... :)
Там статья то объемненькая :)

У меня щас есть время только функцию описать.

State = (State<<1) | !RawKeyPressed() | 0xe000;
оно же в двоичном виде: (State<<1) | !RawKeyPressed() | 1110 0000 0000 0000;

State изначально = 16 ноликов.
На этом шаге мы сдвигаем State влево, а на место нулевого бита ставим 0 если кнопка нажата, иначе 1.
При этом старшие три бита всегда единички.
Дергаем нашу функцию каждые 10мс.

Тогда при нажатии кнопки (если она была отпущена) State с каждым шагом будет меняться так:
1111 1111 1111 1111 -- кнопка отпущена
1111 1111 1111 1110 -- нажали кнопку
1111 1111 1111 1100 -- держим
1111 1111 1111 1001 -- пошел дребезг
1111 1111 1111 0010
...
1111 1110 1010 1101 -- вот сколько дребезга дофига было :)
1111 1101 0101 1010 -- вот тут контакты успокоились и пошли к нам нолики ровным строем
1111 1010 1011 0100
...
1111 1101 0000 0000 -- вот сколько уже ноликов пришло и продолжают идти...

Это первая часть алгоритма. А вторая -- это условие
if(State==0xf000)return TRUE;
То есть сравниваем State с 1111 0000 0000 0000.
А состояние 1111 0000 0000 0000 означает, что кнопка нажата уже 12 ноликов подряд, и перед этими 12-ю шагами она как минимум один шаг была не нажата (единичка в 13-м разряде).

Ну вот собственно когда условие выше описанное выполняется регистрируем нажатие кнопки: возвращаем true.

Это все можно заточить под себя меняя 0xe000 и 0xf000.

И вообще алгоритм простой и быстрый, функцию можно по всякому модифицировать. Вот например я так сделал:
//------------------------------------------------------
//--- Debounce switch action
//--- function operate on external debounce-state variable
// работает с внешней переменной состояния чтоб сразу несколько кнопок опрашивать
int DebouncePress(int RawButtonPressed(char), char button, unsigned int *state){
*state = (*state<<1) | !(RawButtonPressed(button)) | 0xe000;
if(*state == 0xf000) return 1; // Pressed Нажата
if(*state == 0xefff) return 0; // Released Отпущена
return -1; // Unstable Идет дребезг
}
//-------------------------------------------------------


--------------------
НГТУ, Физико-технический факультет, кафедра Лазерных систем
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Mar 22 2008, 18:16
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(rimpocha @ Mar 13 2008, 20:25) *
Эх... smile.gif
Там статья то объемненькая smile.gif

У меня щас есть время только функцию описать.

State = (State<<1) | !RawKeyPressed() | 0xe000;
оно же в двоичном виде: (State<<1) | !RawKeyPressed() | 1110 0000 0000 0000;

State изначально = 16 ноликов.
На этом шаге мы сдвигаем State влево, а на место нулевого бита ставим 0 если кнопка нажата, иначе 1.
При этом старшие три бита всегда единички.
Дергаем нашу функцию каждые 10мс.

Тогда при нажатии кнопки (если она была отпущена) State с каждым шагом будет меняться так:
1111 1111 1111 1111 -- кнопка отпущена
1111 1111 1111 1110 -- нажали кнопку
1111 1111 1111 1100 -- держим
1111 1111 1111 1001 -- пошел дребезг
1111 1111 1111 0010
...
1111 1110 1010 1101 -- вот сколько дребезга дофига было smile.gif
1111 1101 0101 1010 -- вот тут контакты успокоились и пошли к нам нолики ровным строем
1111 1010 1011 0100
...
1111 1101 0000 0000 -- вот сколько уже ноликов пришло и продолжают идти...

Это первая часть алгоритма. А вторая -- это условие
if(State==0xf000)return TRUE;
То есть сравниваем State с 1111 0000 0000 0000.
А состояние 1111 0000 0000 0000 означает, что кнопка нажата уже 12 ноликов подряд, и перед этими 12-ю шагами она как минимум один шаг была не нажата (единичка в 13-м разряде).

Ну вот собственно когда условие выше описанное выполняется регистрируем нажатие кнопки: возвращаем true.

Это все можно заточить под себя меняя 0xe000 и 0xf000.

И вообще алгоритм простой и быстрый, функцию можно по всякому модифицировать. Вот например я так сделал:
//------------------------------------------------------
//--- Debounce switch action
//--- function operate on external debounce-state variable
// работает с внешней переменной состояния чтоб сразу несколько кнопок опрашивать
int DebouncePress(int RawButtonPressed(char), char button, unsigned int *state){
*state = (*state<<1) | !(RawButtonPressed(button)) | 0xe000;
if(*state == 0xf000) return 1; // Pressed Нажата
if(*state == 0xefff) return 0; // Released Отпущена
return -1; // Unstable Идет дребезг
}
//-------------------------------------------------------


А как Вы используете переменную char button ?
Go to the top of the page
 
+Quote Post
rimpocha
сообщение Mar 22 2008, 18:20
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 6-03-07
Из: Новосибирск, Seattle
Пользователь №: 25 935



Цитата(Anjey_N @ Mar 23 2008, 00:16) *
А как Вы используете переменную char button ?


Это параметр функции RawButtonPressed(char). Код кнопки.


--------------------
НГТУ, Физико-технический факультет, кафедра Лазерных систем
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Mar 22 2008, 18:27
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(rimpocha @ Mar 22 2008, 22:20) *
Это параметр функции RawButtonPressed(char). Код кнопки.


Меня вводит в заблуждение фраза int DebouncePress(int RawButtonPressed(char), char button, unsigned int *state) Здесь нет ошибки7
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Anjey_N   динамический опрос кнопок   Mar 7 2008, 13:39
- - aaarrr   А вопрос-то в чем - как кнопки опрашивать? Кнопки...   Mar 7 2008, 13:50
|- - Anjey_N   Цитата(aaarrr @ Mar 7 2008, 17:50) А вопр...   Mar 7 2008, 13:59
- - vet   в прерывании таймера - опрос кнопок, антидребезг, ...   Mar 7 2008, 13:59
- - algidim   У вас схема не может работать по определению, ну ...   Mar 7 2008, 15:49
|- - Anjey_N   Цитата(algidim @ Mar 7 2008, 19:49) У вас...   Mar 7 2008, 17:46
- - rezident   Поскольку для динамической индикации используется ...   Mar 7 2008, 16:57
|- - aaarrr   Цитата(rezident @ Mar 7 2008, 19:57) Поск...   Mar 7 2008, 17:00
|- - rezident   Цитата(aaarrr @ Mar 7 2008, 22:00) С чего...   Mar 7 2008, 19:47
- - algidim   Да я извиняюсь, не досмотрел, схема рабочая, прост...   Mar 7 2008, 18:27
- - Anjey_N   Вот приготовил свой код на рассмотрение. Критикуйт...   Mar 10 2008, 06:19
- - SasaVitebsk   Так, на скорую руку писал, и без проверки, но идея...   Mar 10 2008, 21:48
|- - Anjey_N   Цитата(SasaVitebsk @ Mar 11 2008, 01:48) ...   Mar 11 2008, 18:19
|- - SasaVitebsk   Цитата(Anjey_N @ Mar 11 2008, 22:19) не п...   Mar 12 2008, 09:28
- - Anjey_N   Ух, ты! В данном алгоритме кнопка одним концом...   Mar 14 2008, 15:54
- - rimpocha   Цитата(Anjey_N @ Mar 14 2008, 21:54) Ух, ...   Mar 14 2008, 18:30
- - SasaVitebsk   Цитата(Anjey_N @ Mar 14 2008, 19:54) Вы о...   Mar 14 2008, 19:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016