Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: использование Timer A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
CSB
Требуется измерять интервалы времени от десятков мс до нескольких секунд и выдерживать одинаковые временные интервалы в том же диапазоне. Измеряемые интервалы могут сильно отличаться от генерируемых интервалов. Вопрос: можно ли эту задачу реализовать на одном таймере А? По всему выходит, что нет, но вдруг есть какая-то фича, которую пропустил.
chopik
Не совсем внятно обяснена проблема.Может опишете поподробнее.Для чего выдерживать одинаковые временные интервалы в том же диапазоне?Какая погрешность допустима при измерениях?Сколько источников измеряемых интервалов(хотя это наверное не так уж принципиально)?В общем неплохо было бы развернуть проблему, ибо пока трудностей в описанной задаче не видно.
CSB
Выдержка интервалов нужна для алгоритма, не для ШИМа. Источник сигнала - один.

Трудность заключается в том, что для есть только один таймер, который нужно использовать для измерения и выдержки, т.е. если нормально использовать схему захвата - учитывать количество переполнений и текущее значение счетного регистра, после использования TAR его следует обнулить. Как при таком режиме выдерживать временые интервалы? Ведь может потребоваться несколько переполнений счетчика, а TAR обнулен.
С другой стороны можно использовать непрерывный режим работы таймера и с выдержкой интервалов будет все отлично, но как тогда лучше оргнизовать захват? Ведь обнуления TAR не будет и точка отсчета сместится.
shasik
Цитата(CSB @ Nov 1 2006, 12:34) *
Выдержка интервалов нужна для алгоритма, не для ШИМа. Источник сигнала - один.

Трудность заключается в том, что для есть только один таймер, который нужно использовать для измерения и выдержки, т.е. если нормально использовать схему захвата - учитывать количество переполнений и текущее значение счетного регистра, после использования TAR его следует обнулить. Как при таком режиме выдерживать временые интервалы? Ведь может потребоваться несколько переполнений счетчика, а TAR обнулен.
С другой стороны можно использовать непрерывный режим работы таймера и с выдержкой интервалов будет все отлично, но как тогда лучше оргнизовать захват? Ведь обнуления TAR не будет и точка отсчета сместится.

Как то все смутно и непонятно...

Если мы говорим об одном и том же, то можно сделать так. Таймер работает в непрерывном режиме. Для каждой сехмы захвата/сравнения вводим дополнительную переменную счетчик срабатываний выбранной схемы.
a) Допустим нужно выждать дико большое время T1, а период тамера T2.
Устанавливаем схему сравнения на значение TAR + T1 - [T1/T2]*T2, где [x] - целая часть. Значение счетчика N=T1/T2+1. Включаем соответсвующее прерывание и делаем каждый раз N--. Когда N==0 - прошло нужное время и можно отключить прерывание.
Пример: T1 = 95 попугаев, T2=15 попугаев ==> N=7. В первый раз прерывание щелкает через 95-[95/15]*15=5 попугаев. Затем оно будет срабатываит еще 7-1=6 раз через каждые 15 секунд. В итоге 5 + 6*15 = 95. Вопрос: а что будет если T1<T2, тогда N=1 и прерывание будет вызвано один раз через T1 попугай, после чего N-- дает 0 и все - время вышло. Надеюсь понятно.
б) Нужно посчитать время от текущего момента до некоторого события. Запоминаем текущее значение TAR, т.е TAR_0 = TAR. Сбрасываем соответствующий счетчик M в ноль. При каждом переполнении таймера (TAIF) делаем M++ и ждем событие. И тут оно случилось. Время которое прошло - M*0xFFFF + TAR-TAR_0 (или 0xFFFF-TAR_0 + (M-1)*0xFFFF + TAR - если не понятно). Только нужно пересчитать все эти 0xFFFF в попугаев (т.е. определиться с частотой тактирования и единицами измерения)

Для большей наглядности нарисуй несколько периодов пилы и потренируйся.

Количество устройств задержки на время T1 определяется количеством схем сравнения/захвата ( TimerA/TimerB). А количество измерений времени от ... до .... - количеством ОЗУ и точностью измерения. Когда много счетчиков - долго обрабатывать ==> задержки (можно их учесть).

Возможные проблемы - при вычислении [T1/T2]*T2 и M*0xFFFF возможно переполнение если использовать простой int, а не длинный int.

Если все написанное выше неправильно, то или я или ты не поняли, что нужно сделать
CSB
Фухххх, наконец-то добрался до машины smile.gif

Списибо за ответ!

Вчера сам тоже самое считал и ничего не получалось sad.gif

Сейчас пересмотрел свои записи и не смог найти на чем вчера спотыкался! Точно помню что мне чего-то не нравилось когда считал время между импульсами (у тебя это пункт (б)).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.