Базовый ввод / вывод в микроконтроллере AVR с использованием WinAVR

Я хочу управлять двигателем BLDC, я использую ATMEGA32 в качестве процессора контроллера, у меня проблема с датчиком эффекта холла от двигателя BLDC

это мой код:

DDRB=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5);
DDRD=(0<<0)|(0<<1)|(0<<2)|(0<<3);
PORTD=(1<<0)|(1<<1)|(1<<2)|(1<<3);

PORTB как OUTPUT и PORTD как INPUT это основная программа:

       if (~(PORTD &(1<<0)) && PORTD &(1<<1) && ~(PORTD &(1<<2))) /// 0   1   0
        {
            PORTB=(1<<0)|(0<<1)|(0<<2)|(1<<3)|(0<<4)|(0<<5);
        }
        else if (~(PORTD &(1<<0)) && PORTD &(1<<1) && PORTD &(1<<2)) /// 0   1   1
        {
            PORTB=(0<<0)|(0<<1)|(0<<2)|(1<<3)|(0<<4)|(1<<5);
        }
        ...........

Мой ответ: эта программа не может считывать логический ноль (0) с датчика эффекта Холла, поэтому BLDC не может работать нормально, как прочитать несколько входов в AVR ATMEGA32? я использую кодблок и winavr....

большое спасибо

1 ответ

Я не совсем понимаю, что вы хотите сделать, но если вы хотите читать с порта D в Atmega 32, вы не имеете дело с регистром 'PORTD', есть еще один регистр с именем 'PIND', это тот, который Вы читаете цифровые сигналы от. Также нет ничего как ">DDRD=(0<<0)|(0<<1)|(0<<2)|(0<<3);" Если вы хотите очистить бит (установить бит на логический ноль), вы просто используете побитовый, а не сдвинутый (например, DDRD = ~(1<<bitnumber)

Другие вопросы по тегам