вопрос по таймерам!

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 08, 2013 13:09:12

Сообщение nephist »

Добрый день!
Подскажите пожалуйста, люди знающие. как сделать, чтобы с таймера выпал только один импульс с заданной заранее длительностью?
Вопрос дурацкий, согласен, но не получается у меня, как ни старался. Доходило до того, что я писал:

TCCR0B = (1<<CS00);
OCR0B = a;
TCCR0B = (0<<CS00);

Но это ведёт к какой-то дикости)))

Вообщем, если направите в верном направлении, буду премного благодарен.
Заранее спасибо!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

nephist писал(а): Подскажите пожалуйста, люди знающие. как сделать, чтобы с таймера выпал только один импульс с заданной заранее длительностью?
Задать длительность, включить таймер, выключить таймер после того, как он досчитает до нужной длительности.
nephist писал(а):Вопрос дурацкий, согласен, но не получается у меня, как ни старался. Доходило до того, что я писал:
TCCR0B = (1<<CS00);
OCR0B = a;
TCCR0B = (0<<CS00);
Но это ведёт к какой-то дикости)))
Вы включаете таймер, задаете длительность и тут же выключаете его...
Варианта 2:
1) тупо в цикле ждем выставления флага OCIE0 (или как он там называется в конкретном контроллере) и после этого выключаем таймер
2) разрешаем прерывание по совпадению OCR0B, в прерывании выключаем таймер.
Реклама
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 08, 2013 13:09:12

Сообщение nephist »

Благодарю, будем пробовать)
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

В реальной (а не учебной, сферически-теоретической) ситуации более целесообразной может оказаться стратегия:



1. выделяем один таймер не "для дрыгания восемнадцатой ногой", а как "просто общий клок"

2. по прерыванию от этого общего таймера...

... инкрементим таймаут_для_дрыгания_восемнадцатой_ногой;
... инкрементим таймаут_для_дрыгания_девятнадцатой_ногой;
... инкрементим таймаут_для_моргания_дисплеем;
... нутыпонел

3. отдельно с каждым таймаутом (можно назвать его "счётчик" или как больше подойдёт по смыслу) разбираемся...

... если достигнуто заданное значение (таймаут_для_дрыгания_восемнадцатой_ногой_максимальное_значение) - дрыгаем ногой, сбрасываем счётчик и заново с нуля начинаем прибавлять, пока опять не достигнет;
... если максимальное значение не достигнуто - ничего не делаем, просто инкрементим.



Таймер один, а задач на нём висит сразу двадцать.
И каждая задача работает с своим периодом. Но (очевидно) кратным периоду общего таймера.
А завтра ещё три задачи добавим. На тот же самый таймер.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»