Нужна помощь по прерываниям USART

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Нужна помощь по прерываниям USART

Сообщение Yucca » 30 апр 2014, 06:45

Смысл такой: в программе вызываются прерывания по приходу байта на USART, дальше в зависимости от значения этого байта выполняются определенные функции, а именно:
    по приходу номера груза (пока для простоты написала просто 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) //вечный цикл
{ }
}

Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22

Re: Нужна помощь по прерываниям USART

Сообщение legion » 30 апр 2014, 07:26

Не двигайте робота в прерывании. Сохраните принятые данные, установите необходимые флаги и выходите из прерывания.
Все остальное выполняйте в основном теле программы.

Выйти принудительно из предыдущего прерывания можно, но это будут костыли с изменением указателя стека. Не стоит так делать без сильной необходимости.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Нужна помощь по прерываниям USART

Сообщение Myp » 30 апр 2014, 09:36

нельзя в прерываниях ничего делать :)
зашли, поставили флаг, вышли, минимум времени в прерывании надо сидеть.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Нужна помощь по прерываниям USART

Сообщение Yucca » 01 май 2014, 14:00

Спасибо, программу переделала, но вопрос остается в силе, теперь по прерыванию у меня только записывается новая информацию в переменную data и выводятся оповещения, но основная программа движения всё равно будет выполняться до конца, и только со следующей итерации она заметит что data изменилась... Если например вставить в прерывание команду break, она ведь не будет воспринята циклом основной программы, не могу сообразить как это переделать..

Код: Выделить всё
//Подпрограмма-обработчик прерывания по приходу байта на модуль  USART
ISR( USART0_RX_vect )
{
int data;
data = UDR0; //Присваиваем переменной b содержимое регистра UDR, в котором хранится принятый байт

if (data=='1')||(status==1)
{
USART_Transmit("Forklift is busy. Press 2 to cancel current task!\r\n"); //Сообщение о занятости погрузчика, чтобы остановить задание нажмите 2
data=0;
}
else if (data=='2')
{
Forklift_Stop();
status=0; //Разрешаем начинать другие задания
USART_Transmit("Stopped\r\n"); //Сообщение об остановке
data=0;
}
}

int main(void) //Главная  программа
{
USART_Init ();
Timer_Init();
Ports_Init();

status=0;
USART_Transmit("Ok!\r\n");//Передаем при включении
sei(); //разрешаем глобально прерывания

while(1) //вечный цикл
{
// Выполняем обработку принятого байта
if (data=='1')||(status==0)
{
status=1; //Запрещаем начинать другие задания
int finalplace;
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"); //Сообщение об успешной доставке груза
data=0; //Сбрасываем переменную, чтобы погрузчик не поехал по второму разу
}
}
Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22

Re: Нужна помощь по прерываниям USART

Сообщение avr123.nm.ru » 01 май 2014, 16:38

ИМХО великолепный код UART на прерываниях с буферами приема и передачи делает мастер кода CVAVR :ROFL:
www.proavr.narod.ru/z5.htm
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Нужна помощь по прерываниям USART

Сообщение Yucca » 01 май 2014, 19:29

avr123.nm.ru писал(а):ИМХО великолепный код UART на прерываниях с буферами приема и передачи делает мастер кода CVAVR :ROFL:
http://www.proavr.narod.ru/z5.htm


Да мне не это надо, прерывание по USART я уже сделала, проблема в другом - допустим пришел по USART-прерыванию код груза (1), мы его сохранили в переменную data и в главной программе робот начал движение к этому грузу, а теперь если во время выполнения этого движения опять по USART-прерыванию придет код остановки (2), то после того как этот код мы сохраним в обработчике прерывания, главная программа продолжится с того места, где возникло прерывание, т.е. робот всё равно поедет дальше куда ехал, пока не доедет до конца и уж только потом в следующей итерации посмотрит что код, сохраненный в переменной data изменился..
Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22

Re: Нужна помощь по прерываниям USART

Сообщение dccharacter » 01 май 2014, 20:10

Так ты сделай в функции движения периодическую проверку флага останова
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Нужна помощь по прерываниям USART

Сообщение Yucca » 03 май 2014, 05:15

dccharacter писал(а):Так ты сделай в функции движения периодическую проверку флага останова


Можно пример? Я вот с этим и ломаю голову, не после каждого шага движения же вставлять проверку условия, там функция движения итак пока немаленькая, плюс я хочу заменить ее slam-алгоритмом..
У меня такая идея появилась, что если при прерывании по сигналу остановки, написать команду goto и поставить метку в начало цикла? Так будет работать?
Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22

Re: Нужна помощь по прерываниям USART

Сообщение dccharacter » 03 май 2014, 06:56

Ну кинь функцию движения, посмотрим
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9