Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART - Прерывание раньше времени?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Anub
Код
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 в воздухе весит...
haker_fox
Цитата(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;
               }
         }
}
defunct
Цитата(haker_fox @ Aug 4 2008, 06:20) *
if (c == '')

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

Не проще написать:
if (!c)
777777
Цитата(defunct @ Aug 4 2008, 14:37) *
"" -> '\0'

Это не ноль, а адрес строки, содержащей ноль.
Цитата(defunct @ Aug 4 2008, 14:37) *
а '' - это что?

это ошибка
Цитата(defunct @ Aug 4 2008, 14:37) *
Не проще написать:
if (!c)

Проще. Но все-таки читабельнее
if (c != '\0')
defunct
Цитата(777777 @ Aug 4 2008, 14:34) *
if (c == "")
Это не ноль, а адрес строки, содержащей ноль.

это понятно,
1. правильный компилятор это не откомпилирует,
2. менее правильный даст warning и сравнит с 0.
Если у автора оно компилировалось стало быть имеет место 2).
Цитата
Проще. Но все-таки читабельнее
if (c != '\0')

Как по мне, еще более читабельно:

if ( !getchar() )
=GM=
Цитата(Anub @ Aug 4 2008, 01:42) *
При запуске я получаю результат проверки условия в функции check, т. е. sf==1, и по идее было вызвано прерывание по приему символа, это как так, у меня нога RXD в воздухе висит...

1) Ну положим, нормальный символ вы могли и не принять, поскольку флаг sf=1 устанавливается в теле процедуры прерывания, но вне проверки принятого байта на ошибки. Если нога висит в воздухе, то прилетела помеха, прерывание сработало, флаг установился,...А если нога торчит в 0, то приём идёт непрерывно(:-).

2) Насколько я понимаю, функция getchar() является стандартной, как она связана с вашим приёмным буфером rx_buffer?
SysRq
Обьявить sf как volatile, RXD завести куда следует, учесть замечания указанные выше...

Остальной код генерит я так понимаю визард cvavr (в том числе и getchar() -- там она не библиотечная (чиатет как раз байт из буфера), автор ее просто не показал), и проверять его смысла нет, он рабочий.
=GM=
Цитата(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? Какие функции, по-вашему, являются библиотечными?
SysRq
А 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-


И вообще, вопрос у автора не про это. Опять оффтопика полкило ;(
=GM=
То есть, по-вашему, если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?

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

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

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

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

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

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

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

2) Если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?
SysRq
Цитата(=GM= @ Aug 5 2008, 15:53) *
Если бы компилятор всё (и getchar, и прерывание) писал...

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

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

Вы на вопрос-то ответите? Вы считаете, что если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?
SysRq
Цитата(=GM= @ Aug 5 2008, 16:33) *
Что, и оператор sf=1; он сам вписал?

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

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

Нет, не отвечу, ибо я такого не писал, это ваши домыслы.
=GM=
Цитата(SysRq @ Aug 5 2008, 14:15) *
Нет, это правки автора

A вот тут вы говорили, что всё компилятор делает (ваш пост #13). У нас все ходы записаны (:-).
Цитата(SysRq @ Aug 5 2008, 11:27) *
А он так и делает

И на вопрос "2) Если функция находится в стандартной библиотеке, то это не стандартная и не библиотечная функция? А какая тогда?" Вы не хотите отвечать
Цитата(SysRq @ Aug 5 2008, 14:15) *
Нет, не отвечу, ибо я такого не писал, это ваши домыслы

Ну как же мои домыслы, вот тут вы говорите, что она НЕ библиотечная (ваш пост #7)
Цитата(SysRq @ Aug 4 2008, 13:37) *
Остальной код генерит я так понимаю визард cvavr (в том числе и getchar() -- там она не библиотечная (чиатет как раз байт из буфера), автор ее просто не показал), и проверять его смысла нет, он рабочий
SysRq
Цитата(=GM= @ Aug 5 2008, 20:02) *
Ну как же мои домыслы, вот тут вы говорите, что она НЕ библиотечная (ваш пост #7)

Ну и? Она и правда в том куске кода что в первом посте не библиотечная...
У нас какое-то глобальное недопонимание (:-)
=GM=
Ну и кто тут флеймит?

Модераторы, нельзя ли убрать все посты с #8 по #18?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.