Как сослаться на определенный вывод GPIO в Arduino Uno, используя код C? - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь создать 4-битный сумматор. Я установил порты ввода и вывода, но не уверен, куда идти.

Мой входной порт «B» - это порт D, мой входной порт «A», а также мой «Cin» - это порт B, а мой выходной порт «S» и мой «Cout» - это порт C. Я возникают проблемы с выяснением того, как изолировать отдельные порты (например, пульсация переноса), и у меня почти нет идей, кроме вложенных операторов if.

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

#include <avr/io.h>//library used to access the pin addresses

int main () {
    DDRD &= ~(0b00111100);//B inputs
    DDRB &= ~(0b00011111);//Carry-in + A inputs
    DDRC |= 0b00011111;//Carry-out + S outputs
    while (1) {
        //PORTC |= PIND + PINB;
        //PORTC &= ~(PIND + PINB);
        if ((PIND & 0b00000000)&&(PINB & 0b00000000)) {
            PORTC |= 0b00000000;
            PORTC &= ~(0b00000000);
        }
        else if ((((PIND & 0b00000100)||(PIND & 0b00001000)||(PIND & 0b00010000)||(PIND & 0b00100000))&&(PINB & 0b00000000))||(((PINB & 0b00000100)||(PINB & 0b00001000)||(PINB & 0b00010000)||(PINB & 0b00100000))&&(PIND & 0b00000000)))
            PORTC |= 0b00000001;
            PORTC &= ~(0b11111110);
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 19 января 2019

Если вы хотите обратиться к конкретному выводу / выводам, то это относительно просто (при условии, что регистры установлены как выходы):

Например, чтобы изолировать контакт 4 на PORTD, вы делаете:

PORTD |= (1 << PIND4);

Это установит вывод 4 в PORTD на ВЫСОКИЙ.

PORTD |= (1 << PIND4) | (1 << PIND5);

Это установит контакты 4 и 5 в PORTD на HIGH.

PORTD &= ~(1 << PIND4);

Это установит контакт 4 в PORTD на НИЗКИЙ.

PORTD &= ~(1 << PIND4) & ~(1 << (PIND5);

Это установит контакты 4 и 5 в PORTD на LOW.

Вы также можете определить макрос для логики (1 << n): </p>

#define _BV(n) (1 << (n))

В этом уроке все объяснено довольно хорошо: http://maxembedded.com/2011/06/port-operations-in-avr/ и https://efundies.com/avr-bitwise-operations-in-c/.

Если вы пошагово пройдете побитовую логику на листе бумаги, она станет понятнее!

...