- по приходу номера груза (пока для простоты написала просто 1) робот запускает программу передвижения к нему, устанавливается status=1 для запрета нового задания и разрешаются вложенные прерывания чтобы была возможность остановить робота и сбросить status,
по приходу 2 - остановка робота и сброс status=0 чтобы разрешить новые задания,
если во время выполнения передвижения снова поступает номер груза, то выдается сообщение об ошибке, т.к. status в данный момент =1, и предлагается остановить робота и только потом запустить новое задание.
Вобщем вопрос - если во время выполнения роботом задания поступит сигнал остановки (т.е. вложенное прерывание), то я так понимаю после этой остановки робот опять вернется к обработке предыдущего прерывания, т.е. всё равно продолжит дальше двигаться к расположению груза (смотря в каком месте программы поступил сигнал остановки), как этого избежать? Как принудительно выйти из предыдущего прерывания?
Кусок кода с подпрограммой обработки прерывания:
- Код: Выделить всё
//Подпрограмма-обработчик прерывания по приходу байта на модуль USART
ISR( USART0_RX_vect )
{
int data;
data = UDR0; //Присваиваем переменной b содержимое регистра UDR, в котором хранится принятый байт
sei(); // Разрешаем вложенные прерывания для возможности отправки сигнала остановки погрузчика..
// Выполняем обработку принятого байта
if (data=='1')||(status==0)
{
status=1; //Запрещаем начинать другие задания
USART_Transmit("Ready to go\r\n"); //Сообщение о готовности к выполнению задания
Forklift_Go(data); //Передвижение к месту расположения конкретного груза
Forklift_Get(data); //Взятие груза
USART_Transmit("Got it!\r\n"); //Сообщение об успешной идентификации груза
Forklift_Go(finalplace); //Передвижение к месту выдачи груза
Forklift_Release(); //Отпускаем груз
USART_Transmit("Done!\r\n"); //Сообщение об успешной доставке груза
}
else if (data=='2')
{
Forklift_Stop();
status=0; //Разрешаем начинать другие задания
USART_Transmit("Stopped\r\n"); //Сообщение об остановке
}
else if (data=='1')||(status==1)
{
USART_Transmit("Forklift is busy. Press 2 to cancel current task!\r\n"); //Сообщение о занятости погрузчика, чтобы остановить задание нажмите 2
}
}
int main(void) //Главная программа
{
USART_Init ();
Timer_Init();
Ports_Init();
status=0;
USART_Transmit("Ok!\r\n");//Передаем при включении
sei(); //Разрешаем глобально прерывания
while(1) //вечный цикл
{ }
}