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

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

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

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

Сообщение unalex »

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

Сообщение 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;
	}
}
Ставим плюсы: )
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение А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; };
}
Из этого следует, что она не может сбрасываться :))
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

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

Сообщение ibiza11 »

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

PS/ Вопрос про точку с запятой в конце строки:
if(temp == 0){temp = 1; ru = UDR; } ;
Это допустимо? разве круглые скобки не завершают оператор if?
Ставим плюсы: )
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

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

Сообщение unalex »

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

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

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

Сообщение ibiza11 »

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

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

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

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

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

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

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

Сообщение ibiza11 »

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

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

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

Сообщение ibiza11 »

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

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

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

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

Сообщение ibiza11 »

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

Сообщение unalex »

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


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

Сообщение ELcat »

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

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

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

Сообщение unalex »

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

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