Страница 1 из 1
вопрос по таймерам!
Добавлено: Вт ноя 12, 2013 16:01:22
nephist
Добрый день!
Подскажите пожалуйста, люди знающие. как сделать, чтобы с таймера выпал только один импульс с заданной заранее длительностью?
Вопрос дурацкий, согласен, но не получается у меня, как ни старался. Доходило до того, что я писал:
TCCR0B = (1<<CS00);
OCR0B = a;
TCCR0B = (0<<CS00);
Но это ведёт к какой-то дикости)))
Вообщем, если направите в верном направлении, буду премного благодарен.
Заранее спасибо!
Re: вопрос по таймерам!
Добавлено: Вт ноя 12, 2013 16:17:46
Engineer_Keen
nephist писал(а):
Подскажите пожалуйста, люди знающие. как сделать, чтобы с таймера выпал только один импульс с заданной заранее длительностью?
Задать длительность, включить таймер, выключить таймер
после того, как он досчитает до нужной длительности.
nephist писал(а):Вопрос дурацкий, согласен, но не получается у меня, как ни старался. Доходило до того, что я писал:
TCCR0B = (1<<CS00);
OCR0B = a;
TCCR0B = (0<<CS00);
Но это ведёт к какой-то дикости)))
Вы включаете таймер, задаете длительность и тут же выключаете его...
Варианта 2:
1) тупо в цикле ждем выставления флага OCIE0 (или как он там называется в конкретном контроллере) и после этого выключаем таймер
2) разрешаем прерывание по совпадению OCR0B, в прерывании выключаем таймер.
Re: вопрос по таймерам!
Добавлено: Ср ноя 13, 2013 07:41:37
nephist
Благодарю, будем пробовать)
Re: вопрос по таймерам!
Добавлено: Ср ноя 13, 2013 19:26:58
nirq
В реальной (а не учебной, сферически-теоретической) ситуации более целесообразной может оказаться стратегия:
1. выделяем один таймер не "для дрыгания восемнадцатой ногой", а как "просто общий клок"
2. по прерыванию от этого общего таймера...
... инкрементим таймаут_для_дрыгания_восемнадцатой_ногой;
... инкрементим таймаут_для_дрыгания_девятнадцатой_ногой;
... инкрементим таймаут_для_моргания_дисплеем;
... нутыпонел
3. отдельно с каждым таймаутом (можно назвать его "счётчик" или как больше подойдёт по смыслу) разбираемся...
... если достигнуто заданное значение (таймаут_для_дрыгания_восемнадцатой_ногой_максимальное_значение) - дрыгаем ногой, сбрасываем счётчик и заново с нуля начинаем прибавлять, пока опять не достигнет;
... если максимальное значение не достигнуто - ничего не делаем, просто инкрементим.
Таймер один, а задач на нём висит сразу двадцать.
И каждая задача работает с своим периодом. Но (очевидно) кратным периоду общего таймера.
А завтра ещё три задачи добавим. На тот же самый таймер.