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
.
.
.
Assim, para configurar a porta 3 como saída, fazemos um shift à esquerda:
1 << DDB3
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)
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)
de forma que desligamos o bit relativo a porta 3 no registrador DDRB.
Top comments (0)