CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Потому, что после выполнения каждого условия, программа попадает на следующее, и оно выполняется.
Используйте switch-case или else if.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

мне кажется изза того, что при приеме нового бита переменная temp сбрасывается, попробуйте объявить ее как static
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

+1 Alex и +1 unalex :) оба правы.

Код: Выделить всё

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
   static unsigned char temp;
   switch(temp)
   {
      case 0:
         ru = UDR;
         temp = 1;
         break;
      case 1:
         gu = UDR;
         temp = 2;
         break;
      case 2:
         bu = UDR;
         temp = 0;
         break;
      default:
         break;
   }
}
Ставим плюсы: )
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

temp у него явно не локальная, т.к. в области видимости ф-ии, моим зрением, не обнаруживается :))
Valek3306 писал(а):

Код: Выделить всё

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
if(temp == 0){temp = 1; ru = UDR; };
if(temp == 1){temp = 2; gu = UDR; };
if(temp == 2){temp = 0; bu = UDR; };
}
Из этого следует, что она не может сбрасываться :))
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

мыслю абстрактно - не вседа в форум пастят весь кусок функции

Valek3306 писал(а):каждая посылка заносятся в переменную ru


а вот одну мою опечаточку - бит != байт заметил только что 8)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

В общем, думаю автор уже разобрался. :)

PS/ Вопрос про точку с запятой в конце строки:
if(temp == 0){temp = 1; ru = UDR; } ;

Это допустимо? разве круглые скобки не завершают оператор if?
Ставим плюсы: )
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: CodeVision AVR в вопросах и ответах

Сообщение Совесть »

Этот вопрос вы могли бы проверить сами, в течении пары минут. В данном случае все корректно.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

если компилятор не ругается - это не значит корректно
точка с запятой там не нужна
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: CodeVision AVR в вопросах и ответах

Сообщение Совесть »

"если компилятор не ругается - это не значит корректно" - а что не так в этой записи? чему она противоречит? вашему стилю написания программы?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Совесть писал(а):Этот вопрос вы могли бы проверить сами, в течении пары минут.
Мог бы - не спрашивал бы. Не было компилятора под рукой. Сейчас проверил - ни ошибок ни предупреждений.
Но смысл так писать? Новый стандарт Си?)))
Ставим плюсы: )
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: CodeVision AVR в вопросах и ответах

Сообщение Совесть »

В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Точка с запятой является разделителем. Если разделять нечего, то этот символ является пустым оператором. Его можно ставить в любом "пустом" месте, между конструкциями.
Так-же, прокатит такая конструкция:

Код: Выделить всё

if(....)
   ....
else
   ;
Это если не хочется ставить НОП, и не хочется else сносить. Компилятором он (else) будет отброшен.
Так что стандарт не запрещает его ставить ни после скобок, ни до, ни стопицот раз подряд.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Совесть писал(а):В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?
Вы случайно по национальности не еврей? Я вопросы задал, Вы, не ответив на мои, мне свои задаете.
Ставим плюсы: )
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: CodeVision AVR в вопросах и ответах

Сообщение Совесть »

Ок. Отвечу.
"Но смысл так писать?" - это всего лишь стиль записи, кому как удобнее. Каждый выбирает для себя свой, либо подстраивается под требуемый.
"Новый стандарт Си?)))" - чтобы ответить на этот вопрос, надо узнать ваши познания в стандартах Си, т.е. относительно чего он может быть новым. Ради чего и были заданы два наводящих вопроса.
Теперь вы на мои ответите?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Спасибо.
На Ваши тоже отвечу.
В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?

От используемого мной стандарта отличий нет.
Согласно используемому мной стандарту ошибок при добавлении точки с запятой после закрывающихся фигурных скобок не будет (этого я не знал до сегодняшнего дня).
В каком конкретно стандарте Си данная запись будет ошибочна я не знаю, поскольку знаком только со стандартом С89 и стараюсь писать код не выходящий за рамки вышеуказанного стандарта. Но поскольку остальные стандарты поддерживают C89, а в С89 эта запись не является ошибочной, то думаю и в других не вызовет ошибок.

Вообще говоря стандарт не запрещает использовать в этом месте разделительную точку с запятой, но и нет ни одного указания к применению подобной конструкции, кроме раздела 3.6.3 Expression and null statements стандарта, в котором точка с запятой рассматривается как пустой оператор. Смысла ставить пустой оператор в том месте спорного кода я не вижу. (Может быть Вы видите?) Из этого можно сделать вывод, что автор тех спорных строк кода Valek3306 либо прочитал стандарт C89 и нашел в нем недосказанный момент и использует его повсеместно, поскольку ему так удобнее или привычнее, либо плодит эту конструкцию по незнанию, думая, что именно так и нужно и по-другому работать не будет. Не знаю как Вам, но мне кажется более достоверным второй вариант. Поэтому и был задан соответствующий вопрос, дабы обратить внимание в первую очередь автора на возможные пробелы в знаниях синтаксиса языка.
Ставим плюсы: )
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: CodeVision AVR в вопросах и ответах

Сообщение Совесть »

О целесообразности речи не велось. Говорилось только о допустимости. Да и современные компиляторы, на мой взгляд, на много умнее тех кто ими пользуется и вполне вероятно спокойно проигнорируют данную запись. По крайней мере используемый мной так и делает.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Согласен. Речь велась о допустимости. Выяснили, что допустимо. Осталось выяснить, если возможно, почему именно так пишет автор.
Ставим плюсы: )
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

Совесть писал(а):"если компилятор не ругается - это не значит корректно" - а что не так в этой записи? чему она противоречит? вашему стилю написания программы?

ну конечно, проще напихать точек с запятой, а компилятор их сам уберет в процессе оптимизации


если вы считаете это правильным подходом, то флаг вам в руки
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение ELcat »

Главное не писать так:

Код: Выделить всё

if (a==0); b=1;

Вот в этом случае компилятор тоже не ругнётся, но действие будет выполняться не зависимо от условия.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

Спойлеркоммент удален, чтобы дискуссия не переросла во флуд
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Ответить

Вернуться в «AVR»