Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.02.2015, 05:12
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от NewWriter
|
ну ниче се, сколько дней уже ведутся дискуссии то...
|
Что поделаешь, компилятору опять не понравился код - утверждает, что...
PHP код:
|
Warning: C:\..\AVR_progs\tiny13\untitled.c(99): expression with possibly no effect
|
Насколько я понял, он хочет сказать мне: "не понимаю зачем ты это написал"?
Получается, функция, которая ему не понравилась BACKLIGHT_on_off(); ничего не делает? Но почему? Ведь там же есть строка которая должна включать светодиод!
В чем же ошибка, подскажите пожалуйста, кто в этом разбирается!
Файл с прогой добавляю!
|
|
|
|
27.02.2015, 06:53
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
но там внутри есть куча "граблей", я имею в виду сам алгоритм. Если начнете по нему писать сами увидите.
|
Я уже писал нечто подобное для одной поделки, но для PIC12, "граблей" особо не встречал, честно. Я бы без проблем мог привести код, но для автора он будет бесполезен, потому что для PIC написан. А ATTiny изучать как-то не хочется, есть более интересные МК.
Автору - какой у тебя программатор? Может PIC-и прошивать? Если да, могу дать под них готовый
|
|
|
|
27.02.2015, 10:34
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Получается, функция, которая ему не понравилась BACKLIGHT_on_off(); ничего не делает? Но почему? Ведь там же есть строка
PHP код:
led_on = 1;
|
Всем доброго времени суток.
Данная сторка действительно бесполезна, по-моему об этом Вам в своих комментариях писал Proshha. Еще раз объясню. В режиме, когда светодиод управляется таймером в режиме ШИМ, PORTB.0 включается и выключается с частотой ШИМ таймером, и поэтому то, что вы пытались его включить вручную - он тут-же начнет дергать ногой от таймера.
Если нужно выключить ШИМ - запиши, на СИ, TCCR0A&=~(3‹‹6); Этим Вы сбросите биты СOM0A0 и COM0A1, что отключит таймер от вывода. А чтоб включить - надо записать TCCR0A|=3‹‹6; этим Вы опять выставите эти биты на место, при этом вы не зацепите биты WGM00 и WGM01, которые отвечают за режим работы.
PS. Перед усыплением нужно обязательно вписать строку, после того, как отключите таймер, для Вашего случая, led_on=0. Потому-что, если МК заснет, а на ноге в этот момент будет высокий уровень - он так и останется в спящем режиме и светодиод будет гореть на полную мощность.
Последний раз редактировалось МВА; 27.02.2015 в 10:43.
|
|
|
|
27.02.2015, 11:03
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от NewWriter
|
Я уже писал нечто подобное для одной поделки, но для PIC12, "граблей" особо не встречал, честно. Я бы без проблем мог привести код, но для автора он будет бесполезен, потому что для PIC написан. А ATTiny изучать как-то не хочется, есть более интересные МК.
Автору - какой у тебя программатор? Может PIC-и прошивать? Если да, могу дать под них готовый
|
C PIC я не работал, программатор у меня самый дешевый AVR USBASP. Код для PIC мне не интересен, так ка не я занимаюсь этой проблемой. Кстати, последний проект, который я выкладывал, правда он на ASMe, на моей демоплате работает без замечаний. Для Prosto Andriy нужно, просто изменить делитель таймера на 1024 и подобрать дополнительные константы делителей, которые отвечают за длительность нажатия и паузы. Или еще, как вариант, выпаять кварц и конденсаторы, и выставить фьюзы по умолчанию. Да..., еще в функции сна не устанавливать бит в PORTB.0, а сбрасывать.
Кстати, система команд и синтаксис - это не только для Tiny, она подходит для всего семейства AVR.
|
|
|
|
27.02.2015, 11:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
При одинаковых частотах тактирования таймера режим Phase corrected PWM имеет длительность ШИМа в два раза больше чем Fast PWM. У меня второй режим и светодиод горит ровно.
|
В режимах не-FastPWM регистр OCR обновляется в момент TOP или BOTTOM, а в режме FastPWM - немедленно, что приводит к появлению одного импульса или паузы непредсказуемой длины. Поэтому и моргает. Удивительно, но заметно моргает галогеновая лампа 20W при частоте ШИМа несколько килогерц.
Сообщение от МВА
|
там внутри есть куча "граблей", я имею в виду сам алгоритм. Если начнете по нему писать сами увидите.
|
Каких граблей? Стандартно обрабатываем кнопку интегрированием, а не задержкой (перед этим смотрим осциллографом на дребезг кнопок, впечатляемся), стандартно считаем время (расширяем аппаратные счётчикм программными)
Писать я не начну. Не могу - уже не только начато, но и надоело давно
|
|
|
|
27.02.2015, 12:13
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от makakus
|
Каких граблей? Стандартно обрабатываем кнопку интегрированием, а не задержкой (перед этим смотрим осциллографом на дребезг кнопок, впечатляемся), стандартно считаем время (расширяем аппаратные счётчикм программными)
|
Я не имел ввиду обработку самой кнопки, а сам алгоритм формирования команды, а если вы заглядывали в последний проект, который я выкладывал, то может показаться, что борьба с дребезгом, методом задержки, только в прерывании INT0.
Я сделал это так, как примерно сделано в контроллерах от Siemens. Создал образ входов вначале цикла, и переписал его в конце. Так удобней выделять фронт. Даже если будет дребезг - это означает, что меняется состояние, и если не споймает нажатие в этом цикле, то в следующих, когда все установится, программа обязательно его найдет, и зафиксирует в образе, и потом, этот образ обработается, и не надо после каждого нажатия вводить задержку или обрабатывать нажатие интегрированием.
|
|
|
|
27.02.2015, 13:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
если не споймает нажатие в этом цикле, то в следующих, когда все установится, программа обязательно его найдет, и зафиксирует в образе, и потом, этот образ обработается, и не надо после каждого нажатия вводить задержку
|
Что такое "нажатие"? Какова длина цикла?
Проблема не в том, что программа пропустит нажатие. Проблема в том, что программа отработает несколько нажатий-отпусканий за одно физическое нажатие кнопки пальцем. Дребезг. Обработка дребезга задержкой не даёт результата - я видел пачку дребезга длиной в 150 мс! У тактовой не новой кнопки. Бывают ещё энкодеры с контактами, тоже подарок тот ещё, особенно со временем. Интегрирование такое издевательство терпит - плохая кнопка сработает позднее, но сработает однозначно.
В справочниках по эргономике написано, что реакция на нажатие кнопки должна быть в течение 80 мс, если дольше - напрягает "тупость" кнопок, если время реакции "плавает", то пользователь склонен избегать таких кнопок.
|
|
|
|
27.02.2015, 13:58
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,969
Сказал спасибо: 2,554
Сказали Спасибо 11,850 раз(а) в 5,938 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от makakus
|
Интегрирование такое издевательство терпит - плохая кнопка сработает позднее, но сработает однозначно.
|
Позднеее может и не сработать, если недоинтегрирует интегратор. Для безгеморройности пользования кнопкой лучше бороться с дребезгом программно.
Если в течение, скажем, десяти миллисекунд, было многократное изменение уровня, а потом кнопка отпущена (даже без фиксации факта отсутствия дребезга), т.е, дребезг был и пропал - кнопку топтали однозначно.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
27.02.2015, 14:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от akegor
|
Позднеее может и не сработать, если недоинтегрирует интегратор. Для безгеморройности пользования кнопкой лучше бороться с дребезгом программно.
|
Интегратор программный!
Нога контроллера (с внутренним пулл-апом) - кнопка - земля. Всё.
Интегратор - это байт в памяти, который через 6-15 мс инкрементируется или декрементируется, в зависимости от состояния входа кнопки.
Практически, при 10-мс интервале, считает от 0 до 16, в верхних битах - флаги "нажатие", "отпускание" (события, сбрасываются обработчиком) и "нажато" (состояние).
Без дребезга интервал проходим за 80 мс. С плохой кнопкой интегратор мечется в середине интервала и в конце концов доходит до сработки.
Последний раз редактировалось makakus; 27.02.2015 в 14:35.
|
|
|
|
27.02.2015, 14:57
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от makakus
|
Проблема не в том, что программа пропустит нажатие. Проблема в том, что программа отработает несколько нажатий-отпусканий за одно физическое нажатие кнопки пальцем.
|
В начале программы есть такая строчка
.equ min_lim =1 ;Минимальный лимит длительности нажатия (постараемся отрезки времени установить 0,1 сек.)
А в функции sign:
;функция установки признака ажатия------------------------------------------------
sign:
cpi len_coun, min_lim ;если меньше минимального
brcs sing0 ;если меньше значит дребезг. обнуляем и выходим
cpi len_coun, short_lim ;сравнили длину с порогом длины
Этого достаточно?. Если надо можно установить сравнение 1, 2, 3. это будет 0,1; 0,2; 0,3сек.
Здесь задержка до 100 мс.
Последний раз редактировалось МВА; 27.02.2015 в 15:00.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:23.
|
|