Светодиод горит. Не включается и не выключается

Итак, все, что я пытаюсь сделать, это сделать функцию включения и выключения светодиода, которая будет вызываться в главную. Светодиод включается, но не включается и не гаснет. Что не так с моим кодом?

Я использую плату ATmega328p и Atmel Studio 6.2

#define F_CPU 16000000UL // 16MHz clock from the debug processor
#include <avr/io.h>
#include <util/delay.h>

dot();

int main()
{
    DDRB |= (1<<DDB5);
    while(1)
    {
    dot();
    }
}

int dot()
{
    PORTB |= (1<<PORTB5); // Set port bit B5 to 1 to turn on the LED
    _delay_ms(200); // delay 200mS
    PORTB |= (0<<PORTB5); // Set port bit B5 to 0 to turn on the LED
    _delay_ms(200); // delay 200mS
}

person John S    schedule 21.09.2015    source источник


Ответы (2)


Прочтите о бит-операторах. a |= b устанавливает все биты в a, которые установлены в a или b. Итак, если b == 0, это не меняет a.

Вам понадобится битовый оператор и после первой задержки. Это устанавливает все биты, которые установлены в a и b:

PORTB &= ~(1U<<PORTB5);

Оператор инверсии ~ инвертирует маску, поэтому остается только соответствующий бит 0, все остальные биты равны 1. Таким образом, бит номер PORTB5 будет очищен, все остальные оставлены без изменений.

Обратите внимание на использование беззнаковой константы. Обычно это рекомендуется, поскольку битовые операторы и сдвиги являются реализацией, определенной для отрицательных значений или изменения знака - в лучшем случае и неопределенного поведения в худшем.

person too honest for this site    schedule 21.09.2015

Или |= не может сделать 1 на 0. используйте and&=.

// dummy line to enable highlight
PORTB &= ~(1<<PORTB5); // Set port bit B5 to 0 to turn on the LED
person MikeCAT    schedule 21.09.2015