Здравствуйте, столкнулся с такой проблемой:
При использовании внешнего прерывания от кнопки INT0 выбирается один из режимов работы контроллера. Каждый режим состоит из длительного цикла (самый короткий 8 мин.). При обработке прерывания изменяется значение глобальной переменной. Состояние переменной проверяется лишь после окончания одного из циклов, что вызывает большую задержку времени до конца исполнения текущего цикла. Проверку переменной в цикл вставить не возможно из-за его и без того высокой нагрузки на систему. Как выход вижу переход при выполнении прерывания к началу программы. Подскажите как можно реализовать такой периход, либо иначе решить задачу.
Код в упрощенном виде прилагаю.
Раздел: AVR
При использовании внешнего прерывания от кнопки INT0 выбирается один из режимов работы контроллера. Каждый режим состоит из длительного цикла (самый короткий 8 мин.). При обработке прерывания изменяется значение глобальной переменной. Состояние переменной проверяется лишь после окончания одного из циклов, что вызывает большую задержку времени до конца исполнения текущего цикла. Проверку переменной в цикл вставить не возможно из-за его и без того высокой нагрузки на систему. Как выход вижу переход при выполнении прерывания к началу программы. Подскажите как можно реализовать такой периход, либо иначе решить задачу.
Код в упрощенном виде прилагаю.
volatile int reg=0x00;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
reg=reg+1;
delay_ms(50);
if (reg>0x11)
{
reg=0x00;
}
}
void regim0 (unsigned int x, y, z)
{
for (a=0; a<d; a++)
{
//……………
}
}
void regim2 (unsigned int x, y, z)
{ for (a=0; a<d; a++)
{ //………….. }
}
//…………..
void regim11 (unsigned int x, y, z)
{ for (a=0; a<d; a++)
{ //………….. }
}
void main(void)
{
while (1)
{
switch (reg)
case 0: regim0(x,y,z); break;
case 1: regim1(x,y,z); break;
//…………..
case 11: regim11(x,y,z); break;
}
}
Раздел: AVR