[an error occurred while processing this directive]
|
Работаю с AT90S8535. Хочется сделать в CVAVR функцию, в которой:
- Запускается таймер (конкретно - Timer2), таймер должен досчитать до некоторого значения (функция получает его в качестве параметра) и останавливается до следующего запуска;
- Работает цикл, в котором
-- Периодически проверяется значение некоторой переменной и состояние таймера;
-- Если переменная получила определенное значение - функция возвращает значение;
-- Если таймер (досчитал и остановился), а определенного значения у переменной нет - функция возвращает таймаут.
(Знаю, как это можно сделать через преывание по таймеру, но через прерывание по таймеру работать не хочу.)
Поизучав мануалы, у меня сложилось впечатление, что для того, чтобы оно так работало достаточно проинициализировать:
ASSR=0x00;
TCNT2=0x00;
TCCR2=0x0F; // Clock value: 9,000 kHz, Mode: CTC top=OCR2
OCR2=0x80; // Считаем TCNT2 от 0 до 0x80
Если я в подпрограмме загляну в TCNT2 и найду там 0x00 - значит, таймер истек.
А для перезапуска в подпрограмме достаточно:
TCNT2=0x00;
TCCR2=0x0F; // Clock value: 9,000 kHz, Mode: CTC top=OCR2
Но происходит что-то, причин чего я не понимаю: таймер не останавливается. Продолжает считать. Почему? Что я делаю не правильно? Или я чего-то не понимаю?