Определение макроса, чтобы увидеть направления выводов - PullRequest
0 голосов
/ 18 апреля 2020

В avr или arduino мне нужно передать имя порта функции, которая должна использовать такой макрос, как:

#define setDDR(a) (DDR ## a)

, чтобы увидеть направления выводов. Я пытаюсь сделать следующее:

void setup() {
    Serial.begin(9600);

    pinMode(13,OUTPUT);

    printToScreen(B);
}

void loop() {

}

#define setDDR(a) (DDR ## a)

void printToScreen(uint8_t i)
{
    Serial.println(setDDR(i),BIN);
}

Но этот код выдает мне ошибку типа "B" не был объявлен в этой области ".

Ответы [ 3 ]

1 голос
/ 20 апреля 2020
void setup() {
    Serial.begin(9600);

    pinMode(13,OUTPUT);

    printToScreen(setDDR(B));
}

Вы не можете ввести B в printToScreen , поскольку это не макрос.

0 голосов
/ 19 апреля 2020

Как было сказано в комментариях, вы не можете использовать макросы во время выполнения.

Но вы можете использовать другие подходы. Например, вы можете передать указатель на IO-порт. Например,

void printToScreen(volatile uint8_t * p)
{
    Serial.println(*p, BIN);
}

...

printToScreen(&PORTB);

0 голосов
/ 18 апреля 2020

Это потому, что вы передаете его в функцию, а не в макрос, это означает, что предполагается, что B является переменной, просто переписайте "printToScreen" в макрос:

#define printToScreen(port) Serial.println(DDR # port, BIN)
...