Сдвиг битов из регистра с >> 1 - PullRequest
1 голос
/ 07 марта 2019

Я использую Atmega 16 на плате программатора STK500. Я пытаюсь включить светодиоды на DDRA, начиная с Led0 с 0b00000001 до Led7 с 0b1000000. Кажется, что я выталкиваю бит из регистра со сдвигом >>. Разве это не должно просто переместиться на 1 вправо? У меня есть этот фрагмент

# define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>

int main(void)
{
    DDRA=0xFF;
    char leds=0x01;
    while(1)
    {
        if (leds==0x01)
        {
            for (int i=0;i<8;i++)
            {
                PORTA=~leds;
                leds=leds<<1;
                _delay_ms(300);
            }
        }
        else
        for (int x=0;x<8;x++)
        {
            leds=leds>>1;
            PORTA=~leds;
            _delay_ms(300);
        }

    }
}

похоже, что эта часть

for (int x=0;x<8;x++)
            {
                leds=leds>>1;
                PORTA=~leds;
                _delay_ms(300);
            }

выталкивает бит из регистра, но не должно. я делаю ошибку?

1 Ответ

2 голосов
/ 07 марта 2019

Вы сдвигаете 1 в первом цикле.И вы не видите, потому что вы обновляете отображение перед сдвигом.

В конце итерации с i = 0 светодиоды будут равны 0x02.Итак, следующую логику вы получите:

i, leds (end of the loop)
0, 0x02
1, 0x04
2, 0x08
3, 0x10
4, 0x20
5, 0x40
6, 0x80
7, 0x00
...