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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> USART - Прерывание раньше времени?
Anub
сообщение Aug 4 2008, 02:42
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 4 2008, 03:20
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 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;
               }
         }
}


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 4 2008, 10:37
Сообщение #3


кекс
******

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



Цитата(haker_fox @ Aug 4 2008, 06:20) *
if (c == '')

такое не откомпилируется
"" -> '\0'
а '' - это что?

Не проще написать:
if (!c)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 4 2008, 11:34
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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')
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 4 2008, 13:16
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 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() )
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 4 2008, 13:16
Сообщение #6


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?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 4 2008, 14:37
Сообщение #7


Чайник, 1 литр
****

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



Обьявить sf как volatile, RXD завести куда следует, учесть замечания указанные выше...

Остальной код генерит я так понимаю визард cvavr (в том числе и getchar() -- там она не библиотечная (чиатет как раз байт из буфера), автор ее просто не показал), и проверять его смысла нет, он рабочий.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 4 2008, 15:14
Сообщение #8


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? Какие функции, по-вашему, являются библиотечными?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 4 2008, 15:29
Сообщение #9


Чайник, 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-


И вообще, вопрос у автора не про это. Опять оффтопика полкило ;(
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 4 2008, 16:03
Сообщение #10


Ambidexter
*****

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



То есть, по-вашему, если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?

С самим кодом вроде бы понятно (getchar() имею в виду), но зачем автор писал своё прерывание, когда можно было бы использовать getchar(), а визард сам бы подключил п/п обработки прерывания? И что такое визард cvavr, по-вашему?

Цитата(SysRq @ Aug 4 2008, 14:29) *
И вообще, вопрос у автора не про это. Опять оффтопика полкило

Ну так, с вас и началось, к себе претензии и предъявляйте. А вопрос автора вроде бы разрешился...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 5 2008, 11:39
Сообщение #11


Знающий
****

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



Цитата(=GM= @ Aug 4 2008, 20:03) *
То есть, по-вашему, если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?

С самим кодом вроде бы понятно (getchar() имею в виду), но зачем автор писал своё прерывание, когда можно было бы использовать getchar(), а визард сам бы подключил п/п обработки прерывания? И что такое визард cvavr, по-вашему?

а getchar() в CV по поллингу работает,что из кода наблюдается-запрет прерываний при модификации индекса.И ихмо,собственный обработчик-верное решение,вопрос в реализации.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 5 2008, 11:53
Сообщение #12


Ambidexter
*****

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



Цитата(WHALE @ Aug 5 2008, 10:39) *
а getchar() в CV по поллингу работает,что из кода наблюдается-запрет прерываний при модификации индекса. И имхо, собственный обработчик -верное решение, вопрос в реализации

Никак не хотят отвечать на поставленные вопросы(:-).

1) Понятно, что по прерыванию кладётся в циклический буфер, понятно, что по поллингу берётся из него. Как разработчик узнает, что надо использовать имена переменных, которые вписаны в getchar()? Если бы компилятор всё (и getchar, и прерывание) писал, то понятно, а если только getchar, а разработчик программу прерываний, то как они договорились?

2) Если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 5 2008, 12:27
Сообщение #13


Чайник, 1 литр
****

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



Цитата(=GM= @ Aug 5 2008, 15:53) *
Если бы компилятор всё (и getchar, и прерывание) писал...

А он так и делает biggrin.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 5 2008, 12:33
Сообщение #14


Ambidexter
*****

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



Цитата(SysRq @ Aug 5 2008, 11:27) *
А он так и делает

Что, и оператор sf=1; он сам вписал?

Вы на вопрос-то ответите? Вы считаете, что если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 5 2008, 15:15
Сообщение #15


Чайник, 1 литр
****

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



Цитата(=GM= @ Aug 5 2008, 16:33) *
Что, и оператор sf=1; он сам вписал?

Нет, это правки автора.

Цитата(=GM= @ Aug 5 2008, 16:33) *
Вы на вопрос-то ответите?

Нет, не отвечу, ибо я такого не писал, это ваши домыслы.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:58
Рейтинг@Mail.ru


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