Нашел что-то непонятное при создании кода codevisionavr
Я получил пример кода, который говорит так:
DDRA = (1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) |
(1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
Что означает этот код? Какова функция DDA
? И является ли "<<" побитовым?
1 ответ
Константы DDA0
и т. д. см. битовые позиции в регистре DDRA. Этот регистр определяет, какие из восьми выводов на порте A являются входными, а какие - выходными. 1
в положении бита означает выходной контакт, и 0
(по умолчанию) означает, что это входной контакт.
(1 << DDA0)
с DDA0
определяется как ноль означает "поставить 1 в этот регистр после побитового сдвига его нулевых позиций влево". Так что да, побитовые операторы. Другими словами, сделайте младший значащий бит равным 1. Остальные сдвигаются на одну позицию влево, делая их 2,4,8 и т. Д.
Конечным результатом этого оператора является то, что все битовые позиции объединяются в OR, что приводит к значению 11111111 или 0xFF, что означает, что весь порт PORTA установлен для вывода.
Стоит отметить, что все это утверждение можно упростить, просто используя:
DDRA = 0xFF;
Несмотря на то, что это короче, размер кода не снижается, потому что компилятор в любом случае сворачивает длинное выражение справа от 0xFF. Вы увидите оба стиля портов программирования по мере изучения.
Из документации ATmega:
Конфигурирование вывода Каждый вывод порта состоит из трех битов регистра: DDxn, PORTxn и PINxn. Как показано в описании регистра, биты DDxn доступны по адресу ввода-вывода DDRx, биты PORTxn - по адресу ввода-вывода PORTx, а биты PINxn - по адресу ввода-вывода PINx.
Бит DDxn в регистре DDRx выбирает направление этого вывода. Если DDxn записывается в "1", Pxn конфигурируется как выходной контакт. Если DDxn записывается в "0", Pxn конфигурируется как входной контакт.
Если PORTxn записывается в "1", когда контакт сконфигурирован как входной, активируется нагрузочный резистор. Чтобы выключить подтягивающий резистор, PORTxn должен быть записан в "0" или вывод должен быть сконфигурирован как выходной вывод. Пины порта устанавливаются трижды, когда условие сброса становится активным, даже если часы не работают.
Если PORTxn записывается в "1", когда вывод сконфигурирован как выходной вывод, вывод порта повышается. Если в PORTxn записан логический ноль, когда вывод сконфигурирован как выходной вывод, вывод порта устанавливается на низкий уровень.
Переключение булавки Запись "1" в PINxn переключает значение PORTxn, независимо от значения DDRxn. Инструкция SBI может использоваться для переключения одного бита в порту.