2015-09-21 6 views
1

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

Я использую ATmega328P доску и Atmel Студию 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 
} 

ответ

4

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

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

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

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

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

+0

Огромное спасибо. Я расскажу больше о бит-операторе. –

2

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

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