DEV Community

Priscila Gutierres
Priscila Gutierres

Posted on

Manipulação de portas no Arduino usando registradores e operações lógicas

Cada porta no Atmega328p possui três registradores principais: DDRx (Data Direction Register), para setar o modo das portas;
PORTx, usado para escrever na saída digital da porta;
PINx, usado pelo buffer de entrada para que possamos ler o seu estado.

Irei usar o registrador DDRB para fins de ilustração, porém todos os outros casos são análogos.

O registrador DDRx (DDRB, por exemplo) assim como PORTx e PINx, possui 8 bits, e cada um dos bits controla uma das portas, como mostra o diagrama a seguir:

7 6 5 ...
DDx7 DDx6 DDx5 ...
#define DDB 7
#define DDB 6
#define DDB 5
.
.
.
Enter fullscreen mode Exit fullscreen mode

Assim, para configurar a porta 3 como saída, fazemos um shift à esquerda:

1 << DDB3
Enter fullscreen mode Exit fullscreen mode

de forma que agora DDRB tem o seguinte valor:

7 6 5 4 3 2 1 0
0 0 0 0 1 0 0 0

A operação OU (|) sempre resulta em 1 quando um dos operandos é 1, bit a bit, como descrito na tabela de operações lógicas de |:

11111111 | 10100000 = 11111111

10011110 | 00001001 = 1001111

Sempre que queremos modificar apenas um bit no registrador DDRB para ligado, ou seja uma das oito portas como entrada ou saída, podemos modificar apenas o bit da porta correspondente para ligado (1), com a seguinte operação:

DDRB = DDRB | (1 << DDB3)
Enter fullscreen mode Exit fullscreen mode

temos agora que o bit relativo a DDB3 está ligado (1).
A operação & sempre resulta em 0 quando um dos operandos é 1 ou 0, de forma que essa operação é muito conveniente quando queremos desligar um bit (ou seja, setar uma posição para 0):

11111111 & 10100000 = 10100000

11111111 & 00001000 = 00001000

11111111 & 00000000 = 00000000

Assim, para desligar o bit relativo a DDB3, podemos fazer:

DDRB = DDRB & (1 << DDB3)
Enter fullscreen mode Exit fullscreen mode

de forma que desligamos o bit relativo a porta 3 no registrador DDRB.

Top comments (0)