|
USART - Прерывание раньше времени? |
|
|
|
Aug 4 2008, 02:42
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825

|
Код bit sf=0; Код interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; sf=1; } Код void check(void) { if (sf!=0) { char c; c=getchar(); if (c!="") { PORTA=0x07; } else { PORTA=0x0B; } } } При запуске я получаю результат проверки условия в функции check, т. е. sf==1, и по идее было вызвано прерывание по приему символа, это как так, у меня нога RXD в воздухе весит...
Сообщение отредактировал Anub - Aug 4 2008, 02:42
|
|
|
|
|
Aug 4 2008, 03:20
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(Anub @ Aug 4 2008, 11:42)  При запуске я получаю результат проверки условия в функции check, т. е. sf==1, и по идее было вызвано прерывание по приему символа, это как так, у меня нога RXD в воздухе весит... Вот и зря она в воздухе висит. Наводки на нее могу действовать. Далее, в функции check неплохо бы обнулять флаг sf, если он был равен 1. Символы заключается не в двойные кавычки, а в апострофы. Примерно так должна выглядеть Ваша функция. Код void check(void) { if (sf) { sf = 0; char c; c=getchar(); if (c == '') { PORTA=0x0B; } else { PORTA=0x07; } } }
--------------------
Выбор.
|
|
|
|
|
Aug 4 2008, 10:37
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(haker_fox @ Aug 4 2008, 06:20)  if (c == '') такое не откомпилируется "" -> '\0' а '' - это что? Не проще написать: if (!c)
|
|
|
|
|
Aug 4 2008, 11:34
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(defunct @ Aug 4 2008, 14:37)  "" -> '\0' Это не ноль, а адрес строки, содержащей ноль. Цитата(defunct @ Aug 4 2008, 14:37)  а '' - это что? это ошибка Цитата(defunct @ Aug 4 2008, 14:37)  Не проще написать: if (!c) Проще. Но все-таки читабельнее if (c != '\0')
|
|
|
|
|
Aug 4 2008, 13:16
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(777777 @ Aug 4 2008, 14:34)  if (c == "") Это не ноль, а адрес строки, содержащей ноль. это понятно, 1. правильный компилятор это не откомпилирует, 2. менее правильный даст warning и сравнит с 0. Если у автора оно компилировалось стало быть имеет место 2). Цитата Проще. Но все-таки читабельнее if (c != '\0') Как по мне, еще более читабельно: if ( !getchar() )
|
|
|
|
|
Aug 4 2008, 13:16
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Anub @ Aug 4 2008, 01:42)  При запуске я получаю результат проверки условия в функции check, т. е. sf==1, и по идее было вызвано прерывание по приему символа, это как так, у меня нога RXD в воздухе висит... 1) Ну положим, нормальный символ вы могли и не принять, поскольку флаг sf=1 устанавливается в теле процедуры прерывания, но вне проверки принятого байта на ошибки. Если нога висит в воздухе, то прилетела помеха, прерывание сработало, флаг установился,...А если нога торчит в 0, то приём идёт непрерывно(:-). 2) Насколько я понимаю, функция getchar() является стандартной, как она связана с вашим приёмным буфером rx_buffer?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 4 2008, 15:14
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(SysRq @ Aug 4 2008, 13:37)  Остальной код генерит я так понимаю визард cvavr (в том числе и getchar() -- там она не библиотечная (читает как раз байт из буфера), автор ее просто не показал), и проверять его смысла нет, он рабочий Вы по-внимательней читайте. Я не говорил, что getchar() надо проверять, я спрашивал, как она связана с приёмным буфером rx_buffer. Вполне возможно, что getchar() НЕ библиотечная функция, но вот что обнаружил в stdio.lib кодвижна Код /* CodeVisionAVR C Compiler (C) 1998-2003 Pavel Haiduc, HP InfoTech S.R.L. Standard I/O functions */ #include <ctype.h> #include <stdarg.h> #include <string.h> char getchar(void) { #asm lds r30,ucsr0a sbrs r30,rxc rjmp _getchar lds r30,udr0 #endasm } Покажите нам, как getchar() связана с буфером rx_buffer? Какие функции, по-вашему, являются библиотечными?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 4 2008, 15:29
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
А std* это по-вашему что? Стандартная библиотека! Вот я и говорю, что функцию создает визард, она не стандартная, и как она там связана с приемным буфером проверять смысла нет, там все работает. Вот вам код искомый, как его генерит визард (но для второго USART'а ATMega128, потому и единичка везде): Цитата // Get a character from the USART1 Receiver buffer #pragma used+ char getchar1(void) { char data; while (rx_counter1==0); data=rx_buffer1[rx_rd_index1]; if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0; #asm("cli") --rx_counter1; #asm("sei") return data; } #pragma used- И вообще, вопрос у автора не про это. Опять оффтопика полкило ;(
|
|
|
|
|
Aug 4 2008, 16:03
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
То есть, по-вашему, если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда? С самим кодом вроде бы понятно (getchar() имею в виду), но зачем автор писал своё прерывание, когда можно было бы использовать getchar(), а визард сам бы подключил п/п обработки прерывания? И что такое визард cvavr, по-вашему? Цитата(SysRq @ Aug 4 2008, 14:29)  И вообще, вопрос у автора не про это. Опять оффтопика полкило Ну так, с вас и началось, к себе претензии и предъявляйте. А вопрос автора вроде бы разрешился...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 5 2008, 11:39
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(=GM= @ Aug 4 2008, 20:03)  То есть, по-вашему, если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?
С самим кодом вроде бы понятно (getchar() имею в виду), но зачем автор писал своё прерывание, когда можно было бы использовать getchar(), а визард сам бы подключил п/п обработки прерывания? И что такое визард cvavr, по-вашему? а getchar() в CV по поллингу работает,что из кода наблюдается-запрет прерываний при модификации индекса.И ихмо,собственный обработчик-верное решение,вопрос в реализации.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Aug 5 2008, 11:53
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(WHALE @ Aug 5 2008, 10:39)  а getchar() в CV по поллингу работает,что из кода наблюдается-запрет прерываний при модификации индекса. И имхо, собственный обработчик -верное решение, вопрос в реализации Никак не хотят отвечать на поставленные вопросы(:-). 1) Понятно, что по прерыванию кладётся в циклический буфер, понятно, что по поллингу берётся из него. Как разработчик узнает, что надо использовать имена переменных, которые вписаны в getchar()? Если бы компилятор всё (и getchar, и прерывание) писал, то понятно, а если только getchar, а разработчик программу прерываний, то как они договорились? 2) Если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 5 2008, 15:15
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(=GM= @ Aug 5 2008, 16:33)  Что, и оператор sf=1; он сам вписал? Нет, это правки автора. Цитата(=GM= @ Aug 5 2008, 16:33)  Вы на вопрос-то ответите? Нет, не отвечу, ибо я такого не писал, это ваши домыслы.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|