Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите любым примером работы по прерываниям с UART ADuC845 или подобного МК
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Mik174
Помогите любым примером работы по прерываниям с UART ADuC845 или подобного МК.

Вот в таком виде обработчик прерывания работает, при передаче через терминалку символа f назад возвращается строка "fmessage".
При передаче других символов, назад возвращаются эти же символы. Т.е. все вроде работает правильно.

void iUART () interrupt 4
{
if (RI == 1)
{
RI = 0;
uart_data = SBUF;
SBUF=uart_data;
if (uart_data=='f') printf("message");
}
else
TI=0;
}

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

SBUF=uart_data;

т.е. не передаю символ обратно сразу после приема, все перестает работать, ничего назад не передается...
Linker
Цитата(Mik174 @ Mar 11 2008, 19:31) *
Помогите любым примером работы по прерываниям с UART ADuC845 или подобного МК.

Вот в таком виде обработчик прерывания работает, при передаче через терминалку символа f назад возвращается строка "fmessage".
При передаче других символов, назад возвращаются эти же символы. Т.е. все вроде работает правильно.

void iUART () interrupt 4
{
if (RI == 1)
{
RI = 0;
uart_data = SBUF;
SBUF=uart_data;
if (uart_data=='f') printf("message");
}
else
TI=0;
}

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

SBUF=uart_data;

т.е. не передаю символ обратно сразу после приема, все перестает работать, ничего назад не передается...

В обработчике прерываний UART вначале обычно проверяется, что вызвало прерывание: прием или передача байта. Если Вы не используете передачу по UART, то Ваша програма упрощается:
void iUART () interrupt 4
{
RI=0
*uart_data = SBUF; //сохранить принятый байт
uart_data ++;
}
Mik174
Передача должна быть включена, т.к. мне нужно будет принять блок данных - команду и ее параметры, после чего программа должна отослать ответ - подтверждение что команда принята успешно, и возможно, результаты ее выполнения.
SALOME
В вашем примере обработки прерывания наклевывается вложенные прерывания. Не боитесь запутаться в них? Может Вам обойтись без прерываний, используя конструкции
while (! RI){}
RI = 0;
*uart_data = SBUF;
uart_data ++;
.
.
.
Потом когда надо, передадите требуемые данные
SBUF =message ;
while(! TI){}
TI=0;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.