C - ошибка XMPLAB DDRD / DDRB не присваивается - PullRequest
1 голос
/ 05 февраля 2020

Я работаю над проектом по переводу некоторого кода Arduino RFM Hopper Transmissor на C, но есть несколько концепций, которые я не до конца понимаю, как DDRB и DDRD.

Например, Я называю эти два метода:

InputSDIO();
OutputSDIO();

, которые объявлены в другом файле со следующими строками:

#define InputSDIO() (DDRB &= (~_SDIO))
#define OutputSDIO() (DDRB |= (_SDIO))

, и это дает мне следующую ошибку

ошибка: выражение не может быть назначено

Кроме того, я также получаю ту же ошибку из этого вызова,

RX_ANTOut();

, которая определена в другом файле со следующей строкой:

#define RX_ANTOut() (DDRD |= (RX_ANT))

Как я уже сказал, код взят из проекта Arduino для передатчика. Если вам нужна дополнительная информация или мой вопрос может быть более подробным, не стесняйтесь спрашивать.

1 Ответ

1 голос
/ 05 февраля 2020

In DDRB и DDRD DDR имеет значение d ata d irection r egister и определяет, есть ли штифт является входом или выходом (u C - это Atmel AVR), DDRB - это DDR порта B, DDRD - порта D. SDIO - это конфигурация порта, которая обычно реализуется как битовая . Операторы &= и |= имеют то же значение, что и +=, -=, ..., то есть a &= b означает a = a & b, и поэтому DDRB &= (~SDIO) эквивалентно DDRB = DDRB & (~SDIO), что является обычным способом из битовая маскировка ~ - логическое отрицание & - логическое И, | - логическое ИЛИ.

SDIO - 8-битное (? ?) двоичное число, например, 0b01110010, которое маскирует контакты порта, то есть порт D

https://blog.podkalicki.com/bit-level-operations-bit-flags-and-bit-masks/, Что такое битовая маскировка?

В техническом описании ATmega128RFA1 (https://cdn.sparkfun.com/datasheets/Dev/AVR/ATmega128RFA1_Datasheeta.pdf) функция DDR приведена на стр. 191 в главе 14.2.2 Конфигурирование контакта

...