Hello, All!
Процессор ATmega8 компилятор WinAVR
При возникновении прерывания, программа начинает работать с самого начала, как будто бы был сброс. Думал что включение реле подсаживает питание, отменил управление, то же самое. При чем что интересно, если ставлю прерывание по нулю, зависает до убирания сигнала прерывания. если по спадающему фронту или по вверх фронту, сразу начинает работать с начала. В остальном программа работает как я и хочу.
Что я не так делаю? В чем моя ошибка?
Это мое первое устройство на процессоре, предназначено для управления медицинским стерилизатором,представляет собой таймер с заданными задержками, реакцией на нажатую кнопку управление светодиодами и срабатывание реле защиты в случае аварийной ситуации.
Возникли проблеммы с прерыванием. Я на INT0 подаю прерывание, в случае если от контактного манометра давление вне нормы более полутора минут, времязадающая цепочка открывает транзистор и на входе прерывания 0.
вот мой обработчик прерывания:
int SIGNAL(SIG_INTERRUPT0) { PORTB |= _BV(PB6); //на управляющий вывод пишем 1, сработала "блокировка"
PORTB |= _BV(PB1); // контрольный светодиод = 1 PORTD |= _BV(PD6); // "Стерил" горит = 1 PORTB |= _BV(PB7); // зажигаем светодиод "Финиш"
while (1) ; // вечный цикл }
вобще то я думал более сложную пpогpамму в пpеpывание ставить, но видя что не pаботает упpостил.
думал что из за присутствия цикла внутри прерывания пробовал for(;;) тот же эффект когда я убираю _while (1)_ выдает ошибку: flash_1Hz_step6_korrekt.c:203: warning: control reaches end of non-void function это что, некорректный выход из прерывания? какой аналог RETI для WinAVR?
прерывания настраиваються при начальной инициализации:
sei(); // Разрешить прерывания
MCUCR &= ~_BV(ISC01); // =0 0 0 1 1 MCUCR &= ~_BV(ISC00); // =0 0 1 0 1 // по0 x-~x 1-0 0-1
Goodbye, All! AKA Taraserker.