Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вопрос чайника про управление прерываниями в AVR

Отправлено EagleB3 10 мая 2007 г. 15:25


Я делаю таймер на AVR ATMEGA8535 или ATMEGA168.
Источник старт/стоп сигналов - оптопары.
Старт по прерыванию от входа INT0 (спад уровня) - запускается счетчик Timer1.
Стоп по прерыванию от входа ICP (спад уровня) - останов Timer1.

Питание батарейное. Хочется не жечь батареи попусту, и через некоторое время переводить оптопары в состояние "выключено". Включать повторно - по кнопке клавиатуры. Клавиатура опрашивается в цикле, без использования прерываний.

Пока пытаюсь делать так:

При возникновении прерывания INT0:
--Запрещаю прерывания (cli);
--Запускаю Timer1 (он готов к счету, так что тут только "TCCR1B=0x01;");
--устанавливаю работу только с прерыванием от ICP и Timer1Overflow;
--разрешаю прерывания (sei);

При возникновении прерывания от ICP:
--Запрещаю прерывания (cli);
--Сохраняю результат Timer1;
--Переустанавливаю Timer1 (теперь он готов к счету, остается только запустить);
--Запускаю обратный счетчик "до отключения оптопар";
--устанавливаю работу только с прерыванием INT0 (готов к следующему замеру);
--разрешаю прерывания (sei);

MAIN:
- разрешаю прерывания (sei);
- Работаю в цикле:
---сканирую кнопки (постоянно);
---декрементирую обратный счетчик "до отключения оптопар" (если он включен);

При нажатии кнопки "проснуться":
- включаю оптопары;
- устанавливаю работу только с прерыванием INT0;
- разрешаю прерывания (sei);

При истечении счетчика "до отключения оптопар"
- выключаю оптопары;
- запрещаю прерывания (cli);

Идеологически все вроде бы красиво, но на практике не работает. При выполнении разрешения прерывания (sei) разрешенная функция обработки прерывания выполняется сразу же. Подозреваю, что собака зарыта в моем способе управления работой "только с прерыванием ХХХ".

Включение только INT0 я делаю так:
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
// Timer(s)/Counter(s) Interrupt(s) initialization
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;
TIMSK=0x00;

Включение только ICP и Timer1Overflov я делаю так:
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// Timer(s)/Counter(s) Interrupt(s) initialization
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x24;

Почему при выполнении разрешения прерывания (sei) разрешенная функция обработки прерывания выполняется сразу же? Что я делаю неправильно?

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 47:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru