Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.04.2011, 23:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от oleg_harp
|
Ну, Ваше дело.
|
Да мне-то не жалко. Но что же теперь, по всем архивам имя переменной править?
А в алгоритме участвует либо только-что нажали, либо только-что отпустили.
|
|
|
|
17.04.2011, 23:12
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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;} //Тормозим на минимуме
|
|
|
|
|
17.04.2011, 23:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
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.
|
|
|
|
17.04.2011, 23:31
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Прерывание раз в 8 мс.
PHP код:
|
if KeyPress //Если кнопка нажата
{ //Проверим, давно ли её нажали
if (KeyNew) //Если флаг установлен (значит "давно")
{
...
}
else //Нажали только что, на это и укажем
{
KeyNew = 1; //Устанавливаем флаг
} //Выход
}
|
Получается что антибребезг у нас всего 8 мс? Т.е. если при втором входе в прерывание на пине по прежнему ноль, то считаем кнопку нажатой? Правильно?
|
|
|
|
17.04.2011, 23:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
На самом деле антидребезг у нас 60 раз по 8 мс(на самом деле не по 8mS, а по 2uS - я частоту ШИМ поменял, но это неважно)
PHP код:
|
#define shortkey 0x3C //60 . Константа - минимум для короткого нажатия
|
помните? Вот пока счётчик не доберётся до 60 и будет сплошной антидребезг. За это время ничего включаться/выключаться всё/равно не будет. А реально этот счётчик несколько раз сбросится, пока не успокоится подвижный контакт кнопки.
Последний раз редактировалось omercury; 17.04.2011 в 23:45.
|
|
|
|
17.04.2011, 23:48
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Ну в принципе понял, однако в голове код ЦЕЛИКОМ всё равно не укладывается. Отдельные куски понимаю. Общую картину не могу представить.
Ладно, не буду больше мучить. Не по зубам мне задачка. И так огромное спасибо за помощь.
|
|
|
|
17.04.2011, 23:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
А целиком и не надо. Достаточно алгоритма. Если хотите, разберём Ваш код.
И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.
Последний раз редактировалось omercury; 18.04.2011 в 00:02.
|
|
|
|
18.04.2011, 00:05
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Да вот у меня видно с алгоритмом как раз и проблема. Не программист я. Энергетик по образованию. Интересна тема микроконтроллеров. Стараюсь разбираться. Но вот видно сказывается отсутствие курсовых и т.д. на тему рисования алгоритмов ромбиками, кружочками и т.д.
Цитата:
|
Если хотите, разберём Ваш код.
|
Я конечно не против. Только там разбирать то толком нечего. Там похоже всё не правильно. Поэтому и не работает. Я уж и забыл про него.
Цитата:
|
И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.
|
Зачем вы меня расстроили... Пускай я потом бы удивлялся что аккумулятора не на долго хватает. Хотя... 4 шт. по 3700 мА*ч каждый... Я не знаю сколько должен фонарь пролежать чтобы МК его разрядил. Я конечно попробую переделать код. Но думаю это не возможно.
Цитата:
|
хоть МК спит, но таймер продолжает работать
|
А так не прокатит?
Код:
|
TCCR2=0x00;
#asm("sleep") |
Последний раз редактировалось poligon_85; 18.04.2011 в 00:12.
|
|
|
|
18.04.2011, 00:13
|
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
oleg_harp, со своим вариантом не разбирались?
|
Вы насчёт мерцания? Да, это была низкая частота шим. При 7,8 kHz получалось 30Hz. В Proteus не мог этого увидеть. Пришлось спаять. Увеличил частоту ШИМ в 4 раза. Мерцание исчезло. Других проблем не было.
|
|
|
|
18.04.2011, 00:19
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
И ещё. В данном случае во всей этой конструкции сейчас есть один существенный изъян - хоть МК спит, но таймер продолжает работать, пока подключено питание. Кнопку всё же придётся повесить на прерывание, чтобы будить МК при отключенном светодиоде. Это снизит потребление в выключенном состоянии.
|
Дык... ещё в начале сказал
Цитата:
|
В такой задаче прерывания и нафиг не впёрлись, разве что только выходить из сна... Всё остальное в цикле по флагам...
|
... и таймера тоже...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:15.
|
|