Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.03.2015, 15:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
После инкремента, если условие не выполняется, тогда выполняется else и переменная снова сбрасывается. Поэтому она не должна никогда достигнуть своего значения.
|
Всё правильно, пока идёт дребезг кнопки, счётчик времени нажатия и должен сбрасываться, это уже когда всё устаканится он начнёт считать. То же самое и с таймаутом, только наоборот, пока кнопка нажата, он сбрасывается, отпустили - пошел обратный отсчёт.
Сообщение от МВА
|
И если отпускаем кнопку, то сразу выполняется команда, без предварительной подготовки #asm("sleep")
|
А что не так?
При пробуждении установлен режим сна Idle, отслеживается только длинное нажатие.
Делать ему больше нечего и он с чистой совестью отправляется спать.
Сообщение от МВА
|
Только что прогнал пошагово в AVR Studio, правда для этого пришлось переделать кучу инициализаций
|
Как бы нам Андрея согнать с этого глюкавого CVAVR...
Последний раз редактировалось omercury; 08.03.2015 в 15:57.
|
|
|
|
08.03.2015, 16:22
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
А что не так?
При пробуждении установлен режим сна Idle, отслеживается только длинное нажатие.
Делать ему больше нечего и он с чистой совестью отправляется спать
|
А когда же она достигнет нужного значения, если при нажатой кнопке, после инкремента сразу идет декремент? Ведь так условие никогда не выполнится. И в симуляторе отсутствует дребезг.
Наверное потому у Prosto Andriy компилятор и ругался, что функция BACKLIGHT_on_off(); не выполнится.
PS. Кстати, перед переходом в режим Idle неплохо бы было запретить прерывания по переполнению, потому что достаточно того, что работает ШИМ и ни к чему в каждом цикле таймера проходить программу до следующего погружения в сон. Ведь как мы знаем для кроны и пол миллиампера хлеб.
Последний раз редактировалось МВА; 08.03.2015 в 16:43.
|
|
|
|
08.03.2015, 17:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
А когда же она достигнет нужного значения, если при нажатой кнопке, после инкремента сразу идет декремент? Ведь так условие никогда не выполнится.
|
Декремент (а после него сразу идёт инкремент) начнётся, когда счетчик уже достигнет нужного значения. Ну посмотрите ж Вы наконец условие. К тому же эта часть работает.
Сообщение от МВА
|
PS. Кстати, перед переходом в режим Idle неплохо бы было запретить прерывания по переполнению
|
Можно, но только при условии, что кнопка не нажата.
|
|
|
|
08.03.2015, 17:32
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Декремент (а после него сразу идёт инкремент) начнётся, когда счетчик уже достигнет нужного значения. Ну посмотрите ж Вы наконец условие. К тому же эта часть работает.
Можно, но только при условии, что кнопка не нажата.
|
Перед функцией if(count›longKey) идет инкремент. Если условие выполнится, тогда идет функция включения подсветки и декремент. Если не выполнилась - счетчик сбросится в 0. Не пойму, как он достигнет условия?
Выкладываю переделанный под AVR Studio проект попробуйте сами погонять.
PS. Насчет прерываний я был неправ. Их запрещать нельзя потому, что не будет работать тайм аут подсветки.
Последний раз редактировалось МВА; 08.03.2015 в 19:24.
|
|
|
|
08.03.2015, 21:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Халтура, конечно, но так хотя бы работает...
|
|
|
Сказали "Спасибо" omercury
|
|
|
08.03.2015, 21:42
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Халтура, конечно, но так хотя бы работает...
|
В данном случае ШИМ можно было вообще не активировать.
И от начального ТЗ довольно далеко. Кажется Андрей снизил требования к устройству.
Кстати, я никогда не пользовался инструкцией (_BV). Это что-то вроде маски? Я не видел ее в списках инструкций AVR.
|
|
|
|
08.03.2015, 21:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
Кстати, я никогда не пользовался инструкцией (_BV). Это что-то вроде маски? Я не видел ее в списках инструкций AVR.
|
Стандартная винавээровская.
Сообщение от МВА
|
В данном случае ШИМ можно было вообще не активировать.
|
При таком раскладе достаточно нулевого режима, но я верю в Андрея.
Боюсь, правда, что такими темпами не доживу...
|
|
|
|
08.03.2015, 22:21
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Стандартная винавээровская.
|
Я уже посмотрел апноуты с WinAVR похоже, что это макроопределение.
_BV(n) тоже самое, что 1‹‹n
Я ведь только поставил WinAVR на AVR Studio чтобы можно было программы на С++ просматривать. А до этого я больше по ассемблеру юзал.
Последний раз редактировалось МВА; 08.03.2015 в 22:25.
|
|
|
|
08.03.2015, 23:56
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
При таком раскладе достаточно нулевого режима, но я верю в Андрея.
Боюсь, правда, что такими темпами не доживу...
|
Я уже почти разобрался с предыдущим кодом - наконец-то понял, зачем нужен флаг опроса кнопки, который устанавливается в прерывании - упрощая код, я случайно удалил
omercury, большое спасибо Вам за код, но мне непонятен вот этот кусочек
PHP код:
|
struct{ u8 KeyEXE:1; //флаг опроса кнопок u8 BACKLIGHT_on:1; //Флаг признака включения подстветки u8 bit2:1; u8 bit3:1; u8 bit4:1; u8 bit5:1; u8 bit6:1; u8 bit7:1; } M;
|
Похоже на какой-то массив из 8-ми бит ??? Или нет?
Подскажите пожалуйста, по какому запросу это погуглить? Что там в конце за буква M со значком ";"?
И ещё почему-то нету спящего режима - сама подсветка не выключается! Может дело в том, что я просто неправильно открыл проект в AVR Studio? Открыл файл "Press_but.aps"! Посмотрел, что там ещё есть заголовочный файл "Function.h" (добавил его в проект вручную).
Пробовал и с подключенным заголовочным файлом и без него - все равно автоотключение не работает!!!
Последний раз редактировалось prosto_andriy; 09.03.2015 в 03:25.
|
|
|
|
09.03.2015, 11:15
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
omercury, большое спасибо Вам за код, но мне непонятен вот этот кусочек
|
Доброго времени суток всем.
Совершенно верно, Андрей. Такой массив, еще, называют битовым полем. Для того, чтобы не задействовать целый байт для битовых переменных. Этот массив писал я потому, что AVR Studio не работает с такими переменными, как bit, А omercury исправлял программу. А буква М в конце структуры - это название структуры, в моем случае от слова Merker. Там может стоять хоть целое слово или какой нибудь индекс.... в общем это такая метка. А вызов бита Вы наверное уже догадались идет (имя структуры)(точка)(имя бита).
Кстати, последняя цифра в структуре, после двоеточия - это количество бит в переменной. Я часто использовал в меню трех битные переменные, когда меню не очень большое, а остальные биты как меркеры. Тот файл, Function.h, к проекту не относится. Это я смотрел, при дизассемблировании, во что выливается после компиляции простая функция задержки.
И еще, только что закончилась симуляция проекта. МК заснул через 13,5 секунд. Правда частота 8Мгц. так, как в симуляторе 9, 6 Мгц нет.
PS. Только что заметил, что по истечении тайм аута, отсутствуют строчки сброса меркера включения/выключения и строчка выключения светодиода. Поэтому МК засыпает с включенным светодиодом, а когда просыпается - выключает его. Наверное, omercury не досимулировал программу.
Последний раз редактировалось МВА; 09.03.2015 в 11:39.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:25.
|
|