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»