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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 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  (countlongkey//Если длинное нажатие
            
{                                
                
bright_ch();    //Начинаем менять компаратор ШИМ
                
count--;        //Декремент счетчика(увеличивать-то его больше никчему)
                
PWM_on 1;
            }                   
//Выход
        

        else                    
//Нажали только что, на это и укажем
        
{   
            
KeyNew 1;         //Устанавливаем флаг
        
}                       //Выход  
        
systemClock 0;        //Сброс таймаута выключения подсветки
    
}   
    else                        
//Если кнопка не нажата Это может означать,  
    
{       //что её и не нажимали или только что отпустили, вот это и проверим даьше
        
if (KeyNew)             //Если флаг установлен (только что отпустили)
        
{                       //Проверим, до скольки успели досчитать
            
if (countlongkey)  //Если меньше длинного(короткое нажатие)
            
{//Можно было и объединить, но не люблю я двойные условия, МК их всё равно по очереди сделает
                
if (countshortkey//Если больше минимального (короткое, но не дребезг)
                
{                    
                   
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.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 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.RU
 
Регистрация: 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.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 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.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

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

Думаю, это не самое хорошее решение. В программе нужно избегать замкнутых циклов так, как это сильно тормозит программу. Из приведенного алгоритма, если кнопка не нажата (не 0) то и программа никогда не дойдет до конца. А если там нужно еще что-то делать?...
МВА вне форума  
Непрочитано 19.02.2015, 17:22  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 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, время: 18:17.


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