реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите любым примером работы по прерываниям с UART ADuC845 или подобного МК
Mik174
сообщение Mar 11 2008, 13:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139



Помогите любым примером работы по прерываниям с 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;

т.е. не передаю символ обратно сразу после приема, все перестает работать, ничего назад не передается...
Go to the top of the page
 
+Quote Post
Linker
сообщение Mar 11 2008, 16:33
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105



Цитата(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 ++;
}

Сообщение отредактировал Linker - Mar 11 2008, 16:55


--------------------
Я здесь и сейчас...
Go to the top of the page
 
+Quote Post
Mik174
сообщение Mar 11 2008, 18:52
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139



Передача должна быть включена, т.к. мне нужно будет принять блок данных - команду и ее параметры, после чего программа должна отослать ответ - подтверждение что команда принята успешно, и возможно, результаты ее выполнения.
Go to the top of the page
 
+Quote Post
SALOME
сообщение Mar 12 2008, 04:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



В вашем примере обработки прерывания наклевывается вложенные прерывания. Не боитесь запутаться в них? Может Вам обойтись без прерываний, используя конструкции
while (! RI){}
RI = 0;
*uart_data = SBUF;
uart_data ++;
.
.
.
Потом когда надо, передадите требуемые данные
SBUF =message ;
while(! TI){}
TI=0;


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd July 2025 - 00:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01367 секунд с 7
ELECTRONIX ©2004-2016