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

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

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

 
Опции темы

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

Непрочитано 17.04.2011, 23:03  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от oleg_harp Посмотреть сообщение
Ну, Ваше дело.
Да мне-то не жалко. Но что же теперь, по всем архивам имя переменной править?

А в алгоритме участвует либо только-что нажали, либо только-что отпустили.
Реклама:
omercury вне форума  
Непрочитано 17.04.2011, 23:12  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Момент 2.

в первой строке идёт инкремент счётчика. Если при выполнении условия (долгом нажатии) продолжать увеличивать счётчик, он, в конце концов, перескочит "255" и станет "0" "1" и т.д. Это приведёт к невыполнению условия
PHP код:
if  (count›longkey) //Если длинное нажатие 
то есть к сбросу переменных и прекращению увеличения яркости. И так до следующего раза, когда счётчик досчитает до longkey. Увеличение будет работать "рывками" в диапазоне от longkey до "255".
Всё, понял этот кусок.

P.S. Но моя логика всё равно написала бы не так:
PHP код:
OCR2++;             //Уменьшаем яркость
  if  (OCR2==0) {OCR2=0xFF;}  //Тормозим на минимуме 
а так:
PHP код:
OCR2++;             //Уменьшаем яркость
  if  (OCR2==255) {OCR2=0xFF;}  //Тормозим на минимуме 
poligon_85 вне форума  
Непрочитано 17.04.2011, 23:16  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

В этом случае останется засветка в 1/255 цикла таймера.

oleg_harp, со своим вариантом не разбирались?

Посмотрел, что "наколбасил" CVAVR - ужаснулся. Вот!
PHP код:
; 0000 002D             OCR2++;             //Уменьшаем яркость
    IN   R30,0x23
    SUBI R30,-LOW(1)
    OUT  0x23,R30
; 0000 002E             if  (OCR2==0){OCR2=0xFF;}  //Тормозим на минимуме
    IN   R30,0x23
    CPI  R30,0
    BRNE _0x5
    LDI  R30,LOW(255)
    OUT  0x23,R30 

Последний раз редактировалось omercury; 17.04.2011 в 23:28.
omercury вне форума  
Непрочитано 17.04.2011, 23:31  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Прерывание раз в 8 мс.
PHP код:
if  KeyPress                //Если кнопка нажата
    {                            //Проверим, давно ли её нажали
        if (KeyNew)             //Если флаг установлен (значит "давно")
        {                                          
         ...
        } 
        else                    //Нажали только что, на это и укажем
        {   
            KeyNew = 1;         //Устанавливаем флаг
        }                       //Выход
    } 
Получается что антибребезг у нас всего 8 мс? Т.е. если при втором входе в прерывание на пине по прежнему ноль, то считаем кнопку нажатой? Правильно?
poligon_85 вне форума  
Непрочитано 17.04.2011, 23:41  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

На самом деле антидребезг у нас 60 раз по 8 мс(на самом деле не по 8mS, а по 2uS - я частоту ШИМ поменял, но это неважно)
PHP код:
#define shortkey  0x3C    //60 . Константа - минимум для короткого нажатия 
помните? Вот пока счётчик не доберётся до 60 и будет сплошной антидребезг. За это время ничего включаться/выключаться всё/равно не будет. А реально этот счётчик несколько раз сбросится, пока не успокоится подвижный контакт кнопки.

Последний раз редактировалось omercury; 17.04.2011 в 23:45.
omercury вне форума  
Непрочитано 17.04.2011, 23:48  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Ну в принципе понял, однако в голове код ЦЕЛИКОМ всё равно не укладывается. Отдельные куски понимаю. Общую картину не могу представить.

Ладно, не буду больше мучить. Не по зубам мне задачка. И так огромное спасибо за помощь.
poligon_85 вне форума  
Непрочитано 17.04.2011, 23:52  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

А целиком и не надо. Достаточно алгоритма. Если хотите, разберём Ваш код.


И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.

Последний раз редактировалось omercury; 18.04.2011 в 00:02.
omercury вне форума  
Непрочитано 18.04.2011, 00:05  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Да вот у меня видно с алгоритмом как раз и проблема. Не программист я. Энергетик по образованию. Интересна тема микроконтроллеров. Стараюсь разбираться. Но вот видно сказывается отсутствие курсовых и т.д. на тему рисования алгоритмов ромбиками, кружочками и т.д.

Цитата:
Если хотите, разберём Ваш код.
Я конечно не против. Только там разбирать то толком нечего. Там похоже всё не правильно. Поэтому и не работает. Я уж и забыл про него.

Цитата:
И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.
Зачем вы меня расстроили... Пускай я потом бы удивлялся что аккумулятора не на долго хватает. Хотя... 4 шт. по 3700 мА*ч каждый... Я не знаю сколько должен фонарь пролежать чтобы МК его разрядил. Я конечно попробую переделать код. Но думаю это не возможно.

Цитата:
хоть МК спит, но таймер продолжает работать
А так не прокатит?
Код:
TCCR2=0x00;
#asm("sleep")

Последний раз редактировалось poligon_85; 18.04.2011 в 00:12.
poligon_85 вне форума  
Непрочитано 18.04.2011, 00:13  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
oleg_harp, со своим вариантом не разбирались?
Вы насчёт мерцания? Да, это была низкая частота шим. При 7,8 kHz получалось 30Hz. В Proteus не мог этого увидеть. Пришлось спаять. Увеличил частоту ШИМ в 4 раза. Мерцание исчезло. Других проблем не было.
oleg_harp вне форума  
Непрочитано 18.04.2011, 00:19  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.
Дык... ещё в начале сказал
Цитата:
В такой задаче прерывания и нафиг не впёрлись, разве что только выходить из сна... Всё остальное в цикле по флагам...
... и таймера тоже...
st_1 вне форума  
 
Опции темы

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

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, время: 03:22.


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