sopoumov
|
|
1 | |
Управление таймером (или что-то другое)30.08.2010, 20:14. Показов 4520. Ответов 6
Метки нет (Все метки)
Добрый день !
Рассмотрите , пожалуйста, вопрос от абсолютного новичка. Попытаюсь максимально кратко и понятно описать задачу. С МК только начинаю разбираться, пишу на СИ. Итак. Есть AtMiko16 , один светодиод и одна кнопка (если совсем упрощенно). Светодиодом надо мигать с частотой, задаваемой кнопкой. Т.е. нажимаем кнопку несколько раз (стараемся нажимать с максимально ровным интервалом, к примеру, 1 сек.), МК ловит нажатия кнопки, считает среднее время задержки между нажатиями и мигает светодиодом с заданным интервалом. Подскажите правильное направление движения мысли для решения этой задачи ? P.S. C таймерами худо-бедно работать умею :) |
30.08.2010, 20:14 | |
Ответы с готовыми решениями:
6
Сохранение настроек приложения (В реестр или xml или что то другое?) Защитник Windows или Avast AntiVirus Free или что то другое Не могу понять поломалась ли видеокарта или БП, или что-то другое. Дадите совет? Что использовать двумерный массив, Arraylist или что то другое? |
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,181
|
|
30.08.2010, 20:27 | 2 |
Сообщение от sopoumov
В процедуре обработки прерывания обнуляем счетчик и гоним цикл пока кнопка не будет отпущена прибавляя по единичке к счетчику. В самой программе ставим цикл FOR на размер счетчика, сам цикл набиваем nopами чтобы подогнать продолжительность одного исполнения под продолжительность попугая, на выходе из цикла меняем состояние ноги светодиода и идем в начало.
0
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
30.08.2010, 21:28 | 3 |
я бы предложил так:
засекать период нажатия кнопки (измеряемый в попугаях), и затем использовать экспоненциальный фильтр для усреднения. можно еще медианный, но тогда кол-во требующихся нажатий будет постоянное. в первом случае будет одна переменная - темп, в фильтре используется она же и новое время. во втором - буфер с последними N временами и функция расчета среднего. сами фильтры описаны в википедии (наверняка). главное - не забыть учесть, что при нажатиях может быть (и будет!) дребезг. кнопку опрашивать хотя бы раз в 20-40мс.
0
|
sopoumov
|
|
30.08.2010, 23:20 | 4 |
Сообщение от Bottyk
Хотел бы уточнить (прошу прощения, что сразу этого не сделал). Нужно замерять не продолжительность нажатия кнопки , а именно интервал между нажатиями. |
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
30.08.2010, 23:32 | 5 |
а я бы предложил такой алгоритм.
1. настроить таймер на 1мс. в программе таймера сделать мигание светодиодом (переменные: счетчик тика для светодиода и макс. значение тика для светодиода (период)) и просто счетчик тиков, общий. 2. в главном цикле опрашивать кнопку. как кнопка нажата, сбросить общий счетчик тиков, выждать минимальную паузу для антидребезга и вообще, ждать отпускания кнопки. как отпустили - берем общее кол-во тиков (которое насчиталось) и либо так используем, либо с прим. фильтра. усё. не забыть про атомарность и volatile. 10 минут работы. да поможет вам протеус!
0
|
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
|
|
30.08.2010, 23:38 | 6 |
0
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
30.08.2010, 23:55 | 7 |
да, скосячил. ну тогда чуток переделать, совсем чуток. надеюсь, сам догадается как:)
0
|
30.08.2010, 23:55 | |
30.08.2010, 23:55 | |
Помогаю со студенческими работами здесь
7
Что это SMS HTTP API или что-то другое? Что значит r31 или r25? И почему нельзя написать r01 или r(любое другое число)? Или использовать интерфейс или что то другое Visual C++ или Builder или что-то другое? Ребят, посмотрите , что фигня, как думаете это видеочип накрылся или что-то другое? Никак не могу определится какую видяху брать, palit GTX 770 jetstream или что-то другое, что вы посоветуете? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |