-
- У АВР есть особенность - для анализа ошибок UCSRA надо читать раньше, чем UDR. - argus98(27.09.2017 15:31)
- Лучше прочитать UCSRA и UDR во временные регистры, а потом уже неторопясь ковыряться в них, сколько потребуется. Я делаю нечто подобное: vpv.vpv(505 знак., 28.09.2017 06:58)
- Ценное замечание. - Ксения(27.09.2017 15:35)
- Не надо сравнивать с единицей - пишите без сравнения if(UCSRA&(1<<FE)) или if(UCSRB&(1<<RXB8)) или if(UCSRA&(1<<PE)). Так можно, если тестируют число на присутствие отдельных битов. - Ксения(27.09.2017 11:37)
- Посмотрел свой остальной код в проекте - так и написано. symbions(21 знак., 27.09.2017 13:30)
- Вообще-то лучше, когда в качестве условия для IF ставятся логические величины (здесь же - число). Причина, видимо, в "логическом" (побитовом) характере анализа условия. Но ведь число 0 может и не содержать все нули! Клевещут, что и стандарт С++ Petrovich(190 знак., 27.09.2017 13:20, )
- Дело не в в бинарном представлении числ int или float, а в неявном преобразовании типов в тип bool, которое выполняет компилятор в языках С/С++. А правило такого преобразования гласит, что ненулевое значение выражения преобразуется в true, Ксения(136 знак., 27.09.2017 14:34)
- Всё бы ничего, только неявного приведения к типу _Bool в языке Си не бывает. - SciFi(27.09.2017 14:39)
- Даже когда тип bool в языке отсутствует (хотя современные Си-компиляторы этот тип обычно поддерживают), преобразование идет к типу boolean (хотя для переменных такой тип может быть не определен) ровно по тому же правилу. Т.е. уже то, что в языке Ксения(183 знак., 27.09.2017 15:32)
- Обожаю, когда свойства языка Си постигаются пытливым экспериментатором эмпирически. Это всегда доставляет. Мануалы (а тем паче стандарты) написаны для трУсов! :-) - SciFi(27.09.2017 15:36)
- Так оно и быть должно. Работают обычно с конкретным компилятором, рассчитывая именно на его возможности, а не на стандарты. Стандарты пусть учат разработчики компиляторов - это им по штату положено, а нам этого не надо. :) - Ксения(27.09.2017 15:39)
- Кроме того, так гораздо веселее! Столько новых приключений на
свою провном месте! :-) - SciFi(27.09.2017 15:45)
- Кроме того, так гораздо веселее! Столько новых приключений на
- Так оно и быть должно. Работают обычно с конкретным компилятором, рассчитывая именно на его возможности, а не на стандарты. Стандарты пусть учат разработчики компиляторов - это им по штату положено, а нам этого не надо. :) - Ксения(27.09.2017 15:39)
- Обожаю, когда свойства языка Си постигаются пытливым экспериментатором эмпирически. Это всегда доставляет. Мануалы (а тем паче стандарты) написаны для трУсов! :-) - SciFi(27.09.2017 15:36)
- Даже когда тип bool в языке отсутствует (хотя современные Си-компиляторы этот тип обычно поддерживают), преобразование идет к типу boolean (хотя для переменных такой тип может быть не определен) ровно по тому же правилу. Т.е. уже то, что в языке Ксения(183 знак., 27.09.2017 15:32)
- Всё бы ничего, только неявного приведения к типу _Bool в языке Си не бывает. - SciFi(27.09.2017 14:39)
- Дело не в в бинарном представлении числ int или float, а в неявном преобразовании типов в тип bool, которое выполняет компилятор в языках С/С++. А правило такого преобразования гласит, что ненулевое значение выражения преобразуется в true, Ксения(136 знак., 27.09.2017 14:34)
- было if ((UCSRA&(1<<FE))==1) надо if ((UCSRA&(1<<FE))==(1<<FE) ) - О чудо(27.09.2017 11:08, )
- UCSRB&(1<<RXB8) может принимать значение 0 и 2, UCSRA&(1<<PE) может принимать значение 0 и 4. - misyachniy(27.09.2017 10:48)
- Для начала правило N1: & сравнивай только с нулем! Твои if if ((UCSRA&(1<<FE))==1) и if ((UCSRA&(1<<PE))==1) в принципе не могут работать корректно! - Petrovich(27.09.2017 10:34, )
- На жаль тут работают - а то бы было о бы решение моего вопроса symbions(252 знак., 27.09.2017 10:42 - 11:05)
- А зачем на единицу-то проверять? Результат IFa булевый же. Вот как-то... Звероящер(765 знак., 28.09.2017 09:22)
- Непонятно только зачем считывался SREG :) - Petrovich(28.09.2017 10:13, )
- Как зачем? Прерывание же... Обязан сохранить. Код довольно древний, тогда компиляторы сами SREG не сохраняли :) - Звероящер(28.09.2017 11:12)
- Зачем их просто сохранять? Чтоб подержать и вернуть? Их сохраняют чтобы временно ЗАПРЕТИТЬ, а потом вернуть, правда? - Petrovich(28.09.2017 11:17, )
- Пешы есчо, аффтар - MBedder(28.09.2017 11:28)
- Зачем их просто сохранять? Чтоб подержать и вернуть? Их сохраняют чтобы временно ЗАПРЕТИТЬ, а потом вернуть, правда? - Petrovich(28.09.2017 11:17, )
- Как зачем? Прерывание же... Обязан сохранить. Код довольно древний, тогда компиляторы сами SREG не сохраняли :) - Звероящер(28.09.2017 11:12)
- Непонятно только зачем считывался SREG :) - Petrovich(28.09.2017 10:13, )
- рукалицо SciFi(8 знак., 27.09.2017 11:10, картинка)
- Ну сделай UCSRA=FF с битом PE(не помню какой он по счету в регистре, неважно): (0xff & (1 << 4)) - будет 16, а не 1. А сделай с битом PE: (0xff & (1 << 5)) - будет 32, а не 1. - Petrovich(27.09.2017 10:46, )
- UCSRA=0xFF symbions(167 знак., 27.09.2017 11:15)
- Просто везде замени ==1 на !=0 - Petrovich(27.09.2017 10:55, )
- Интересная постановка вопроса. Но можно зайти и с другой стороны: "почему это может работать корректно?" SciFi(53 знак., 27.09.2017 10:45)
- Почитав все ответы вижу, что я не так что-то представляю symbions(29 знак., 27.09.2017 11:11)
- А зачем на единицу-то проверять? Результат IFa булевый же. Вот как-то... Звероящер(765 знак., 28.09.2017 09:22)
- Для тех, кто любит сравнивает с единицей, есть вот такая штука: !!(a & b) == 1. - SciFi(27.09.2017 10:39)
- Угу, но лучше наверное с нолём или как О_Чудо написало - symbions(27.09.2017 11:17)
- На жаль тут работают - а то бы было о бы решение моего вопроса symbions(252 знак., 27.09.2017 10:42 - 11:05)
- У АВР есть особенность - для анализа ошибок UCSRA надо читать раньше, чем UDR. - argus98(27.09.2017 15:31)