LINUX.ORG.RU

gcc-avr bug?


0

1

Споткнулся на ровном месте:

Есть attiny2313 На ноги PB0 и PB1 повешены кнопки. На ноги PB2 и PB3 светодиоды.

Хочу, чтобы кнопка с PB0 включала светодиод PB2, а кнопка PB1 - светодиод PB3

Пишу такой код:

...
while(1)
{
  if(PINB & 0x01 != 0) PORTB |= 0x04; else PORTB &= ~0x04;
  if(PINB & 0x02 != 0) PORTB |= 0x08; else PORTB &= ~0x08;
}

В итоге первая кнопка мигает обоими светодиодами, а вторая никак себя не проявляет...

Когда идеи кончились, странслировал код в ассемблер (ключик -S) и получил, в частности, следующий кусок:

.L5:
    sbis 54-32,0
    rjmp .L2
    sbi 56-32,2
    sbi 56-32,3
    rjmp .L5
.L2:
    cbi 56-32,2
    cbi 56-32,3
    rjmp .L5

В общем, как видно - генерится код, который тупо смотрит на нулевой бит

 
   sbis 54-32,0 

и рулит обоими светодиодами синхронно:

   sbi 56-32,2
   sbi 56-32,3

либо

   cbi 56-32,2
   cbi 56-32,3

Вопрос: Какого #$&^?!!!!



Последнее исправление: Flogger_d (всего исправлений: 2)

> PINB & 0x01 != 0

учи матчасть, у «!=» приоритет больше, чем у «&». т.е. у тебя написано:

  if(PINB & (0x01 != 0)) PORTB |= 0x04; else PORTB &= ~0x04;
  if(PINB & (0x02 != 0)) PORTB |= 0x08; else PORTB &= ~0x08;

==

  if(PINB & 1) PORTB |= 0x04; else PORTB &= ~0x04;
  if(PINB & 1) PORTB |= 0x08; else PORTB &= ~0x08;

==

  if(PINB & 1) { PORTB |= 0x04; PORTB |= 0x08; } else { PORTB &= ~0x04; PORTB &= ~0x08; }
arsi ★★★★★
()
Ответ на: комментарий от arsi

[Посыпает голову пеплом]

О господи! И правда!

Спасибо!

Flogger_d
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.