Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Непрочитано 13.02.2015, 01:53  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
...можно предделитель увеличить, а можно изменить тип счётчика циклов таймера.
Вы имеете ввиду заменить char на int?

А если изменить предделитель, отредактировав строку
TCCR0B=0x03; то частота ШИМ тоже ведь измениться??? Разве нет?
Реклама:

Последний раз редактировалось prosto_andriy; 13.02.2015 в 01:59.
prosto_andriy вне форума  
Непрочитано 13.02.2015, 03:27  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

char и int схожи, размер один, int может быть отрицательным (-127..127), char нет.
Смотрите описания типов int/uint 8/16/32_t ну и других.
whoim вне форума  
Непрочитано 13.02.2015, 06:14  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Подскажите пожалуйста, как сделать так, чтобы светодиод вкл./выкл. не одиночным коротким нажатием, а двойным???
Я немного изменил код сканирования кнопки, и получилось так:

PHP код:
void    key_scan(void)
{
    if  KeyPress                //Если кнопка нажата
    {                            //Проверим, давно ли её нажали
        if (KeyNew)             //Если флаг установлен (значит "давно")
        {                                          
            count++;          //Увеличиваем счётчик задержки
            if  (count›longkey) //Если длинное нажатие
            {                                
                bright_ch();    //Начинаем менять компаратор ШИМ
                count--;        //Декремент счетчика(увеличивать-то его больше никчему)
                PWM_on = 1;
            }                   //Выход
        } 
        else                    //Нажали только что, на это и укажем
        {   
            KeyNew = 1;         //Устанавливаем флаг
        }                       //Выход  
        systemClock = 0;        //Сброс таймаута выключения подсветки
    }   
    else                        //Если кнопка не нажата Это может означать,  
    {       //что её и не нажимали или только что отпустили, вот это и проверим даьше
        if (KeyNew)             //Если флаг установлен (только что отпустили)
        {                       //Проверим, до скольки успели досчитать
            if (count‹longkey)  //Если меньше длинного(короткое нажатие)
            {//Можно было и объединить, но не люблю я двойные условия, МК их всё равно по очереди сделает
                if (count›shortkey) //Если больше минимального (короткое, но не дребезг)
                {                    
                   button_short_pressed_count++;
                   if  (button_short_pressed_count=2)
                    { led_on_off();   //Включаем/выключаем фонарь
                    
                    } 
                }  //Иначе - Это был дребезг              
            }   
            else    {Dir_on=~Dir_on;}   //Меняем направление изменения яркости
        }                       
        clr_var();              //Сброс переменных
    }                           //Выход  
    KeyEXE = 0;                 //Запрет опроса кнопок   
    #asm("sleep")               //Усыпляем МК
} 
Но дело в том, что контроллер всё равно реагирует на одиночные нажатия, а не на двойные! Непонятно почему? Ведь я добавил счетчик нажатий и условие, когда он должен срабатывать? Подскажите пожалуйста, что неправильно? Компилируется, как ни странно без ошибок.
prosto_andriy вне форума  
Непрочитано 18.02.2015, 22:51  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Доброго времени суток всем.
Трудно сказать, что там у тебя в коде, но там присутствуют противоречия. Я не стал сильно углубляться после того, как нашел парочку, хотя скорее, одно просто не влияет на программу. Я уже писал, что на Си у меня почему-то не очень получается. Но, я думаю, этот вопрос можно решить, если кодировать нажатия по принципу асинхронной передачи данных. Что-то вроде такого алгоритма:
1. на прерываниях сделан счетчик предделителя, который генерирует тактовые импульсы.
2. По фронту нажатия кнопки (для входов с подтяжкой - это отрицательный фронт) устанавливается признак работы декодера, обнуляется счетчик тактовых импульсов и регистр кода.
3. по тактовым импульсам проверяется, нажата ли кнопка, и записывается, а если не нажата не записывается 1 в нулевой бит и сдвигается влево. Частота тактирования должна быть в два раза больше скорости нажатия кнопок.
4. когда счетчик досчитает до 4, это 5 тактов, меркер работы декодера сбрасывается, выставляется меркер готовности кода в регистре.
5. в программе, когда признак готовности выставлен, можно по инструкции switch - case: выделить нужную подпрограмму и оттуда сделать желаемое действие.

Я написал, правда на асме, образец, но напичкал почти каждую строчку комментариями. Думаю, должно быть понятно. Проэкт в AVR Studio прилагаю.
Пока все.
Вложения:
Тип файла: rar Coder.rar (8.9 Кб, 30 просмотров)
МВА вне форума  
Непрочитано 18.02.2015, 23:02  
3d cube
Гражданин KAZUS.RUN
 
Регистрация: 27.11.2012
Адрес: 30км от Софии
Сообщений: 732
Сказал спасибо: 89
Сказали Спасибо 310 раз(а) в 180 сообщении(ях)
3d cube на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Для кнопки подходит сие железно

If нога = 1 Then
иф счетчик ноги ‹ 255 тхен
счетчик ноги = счетчик ноги + 1
else
if счетчик ноги › 1 тхен
счетчик ноги = счетчик ноги - 1
end if

If счетчик ноги › 200 then
бит ноги = 1
Енд иф

If счетчик ноги ‹ 100 then
бит ноги = 0
Енд иф

Такие вещи. С гистерезисом и уборкой помех.
3d cube вне форума  
Непрочитано 19.02.2015, 11:50  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от 3d cube Посмотреть сообщение
Для кнопки подходит сие железно

If нога = 1 Then
иф счетчик ноги ‹ 255 тхен
счетчик ноги = счетчик ноги + 1
else
if счетчик ноги › 1 тхен
счетчик ноги = счетчик ноги - 1
end if

If счетчик ноги › 200 then
бит ноги = 1
Енд иф

If счетчик ноги ‹ 100 then
бит ноги = 0
Енд иф

Такие вещи. С гистерезисом и уборкой помех.

Всем доброго времени суток.
Если я правильно понял, то код получается такой:
unsigned char count = 0
while(1)
{
if(PINB&1‹‹1)
{
if(count‹255)
count=count+1;
}else{
if(count›1)
count=count-1;
}
if(count›200)
PORTB=PORTB|1‹‹0;
if(count‹100)
PORTB=PORTB&~(1‹‹0);

}
Но, такой код, подходит больше не для кнопки, а для задержки какого-нибудь сигнала от продолжительности сигнала на ноге от подачи до его снятия.
Например, можно использовать для задержки искрообразования, в зависимости от продолжительности замкнутого контакта, при условии, что условие первой функции if будет инвертировано, а сигнал искрообразования подаваться по отрицательному фронту PORTB.0
В этом коде при высоком уровне на ноге - счетчик будет считать вверх, а при низком - вниз. а выход будет переключаться при порогах равных 200 и 100.
Если я неправильно понял написанный Вами алгоритм, тогда приношу извинения за критику кода, хотя код действительно очень простой и его можно переделать под кнопку, правда он уже не будет таким простым.
пока все.

Последний раз редактировалось МВА; 19.02.2015 в 11:55.
МВА вне форума  
Непрочитано 19.02.2015, 16:50  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Правильнее всего наверно обрабатывать нажатие кнопки по такому алгоритму (см. рис).
Миниатюры:
Нажмите на изображение для увеличения
Название: button_scan.jpg
Просмотров: 154
Размер:	62.0 Кб
ID:	75903  
prosto_andriy вне форума  
Непрочитано 19.02.2015, 17:14  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Правильнее всего наверно обрабатывать нажатие кнопки по такому алгоритму (см. рис).

Думаю, это не самое хорошее решение. В программе нужно избегать замкнутых циклов так, как это сильно тормозит программу. Из приведенного алгоритма, если кнопка не нажата (не 0) то и программа никогда не дойдет до конца. А если там нужно еще что-то делать?...
МВА вне форума  
Непрочитано 19.02.2015, 17:22  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
Думаю, это не самое хорошее решение. В программе нужно избегать замкнутых циклов так, как это сильно тормозит программу.
Смотря какая программа - иногда нужно избегать, иногда можно и не избегать (например если используется RTOS).



Сообщение от МВА Посмотреть сообщение
А если там нужно еще что-то делать?...
Либо организовывать автомат, который запоминает состояние алгоритма и периодически вызывается, или весь алгоритм выделить в задачу RTOS.
_Артём_ вне форума  
Непрочитано 19.02.2015, 17:37  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Так ведь этот алгоритм можно реализовать с помощью прерывания, а когда оно отработает выставлять соответствующий флаг, чтобы контроллер "имел в виду", включено устройство или выключено!
prosto_andriy вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Как правильно отследить импульс sdsrem Микроконтроллеры, АЦП, память и т.д 8 17.08.2010 21:28
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


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


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