Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Инверсия в C - Код для AVR

#c #avr_gcc #avr


Наверное очень глупый вопрос, но разбирая код простой программы на Си для AVR, я
столкнулся  с такой проблемой:

int main(void)
{
DDRA = 0xFF; // Выставляем порт А как выход

for(;;){
PORTA = ~0x21; // Включаем LED на PA0 и PA5
_delay_ms(10000);
// и.т.д.
}


В коментариях к программе указано что PORTA = ~0x21; должен включить PA0 и PA5.
Насколько я понимаю, 0х21 = 00100001, ~0x21 = 11011110. А это значить выходы PA0
и PA5 как раз не должны иметь напряжения. 

Помогите пожалуйста разобраться! Спасибо!


    


Ответы

Ответ 1



В данном случае используется инверсное включение светодиода. Соответственно для протекания тока через него вывод переводится в "0". (Внутри МК открывается полевой транзистор, соединяющий вывод с "землёй"). Сделано это, видимо, из соображений безопасности. Если бы светодиоды были подключены обратно, при включении всех их вместе возможна перегрузка порта(A ,С) МК по току. Такие ограничения следует учитывать, подключая нагрузки напрямую к портам без ключевого транзистора/буферной iC.

Комментариев нет:

Отправить комментарий