Você está na página 1de 3

Entrada e Saída – Manipulando

Registradores
DE RODOLFO PICORETI ·
Para determinar os estados de suas entradas e saídas o microcontrolador possui registradores na
qual esses dados são armazenados. Ao chamar as funções de entrada e saída fornecidas pela
biblioteca padrão do Arduino o que fazemos é nada mais que modificar tais registradores.
Então porque acessar estes registradores diretamente?

A manipulação direta de registradores permite que:


 A leitura e escrita em pinos seja feita muito mais rápida.
 Ler e escrever em mais de um pino de uma mesma porta por vez.
 O código produzido é menor, em alguns casos esse fator pode fazer a diferença entre seu
código caber na memória flash ou não.
Essa técnica também possuí desvantagens:
 O código produzido é menos portável, difícil de debbugar e de ser mantido.

Na abordagem dos conceitos a seguir o microcontrolador atmega328 presente na placa Arduino


Uno será utilizado. Para acompanhar esse tutorial é necessário algum conhecimento de
lógica digital.
Todos os registradores desse microcontrolador possuem 8 bits. Os pinos de entrada e saída são
divididos em PORTs. O atmega328 possui 3 PORTs, como podemos observar no diagrama a
seguir:

PORTB (Pinos Digitais de 8 a 13)


PORTC (Pinos Analógicos)
PORTD (Pinos Digitais de 0 a 7)
Cada PORT possui 3 registradores com diferentes funções:

DDR
Os registradores do tipo DDR (Data Direction Register) são responsáveis por determinar se os
pinos de um determinado PORT se comportarão como entrada ou saída. Cada bit do
registrador DDR controla o estado do respectivo pino. Por exemplo: O bit 1 do registrador
DDRB (DDB1) controlará o estado do pino PB1 e consequentemente o pino D9 do Arduino
Uno como mostrado no mapa.

Para definir um pino como saída devemos setar seu respectivo bit do registrador DDR
como 1 e para defini-lo como entrada seta-lo para 0.

1 /* Equivalente:
2 pinMode(9,OUTPUT);
3 pinMode(9,INPUT);
4 */
5
6 DDRB |= (1 << DDB1);
DDRB &= ~(1 << DDB1);
7

PORT
Os registradores do tipo PORT são responsáveis por determinar se um pino está definido como
alto (HIGH) ou baixo (LOW).

Para definir um pino como alto devemos setar seu respectivo bit do registrador PORT
como 1 e para defini-lo como baixo seta-lo para 0.

1 /* Equivalente:
2 pinMode(9,OUTPUT);
3 digitalWrite(9,LOW);
4 */
5
6 DDRB |= (1 << DDB1);
PORTB &= ~(1 << PORTB1);
7
/* Equivalente:
01 digitalWrite(8,HIGH);
02 digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
03 digitalWrite(11,HIGH);
04 digitalWrite(12,HIGH);
05 digitalWrite(13,HIGH);
06 */
07
PORTB = 0xFF;
08
09
10

PIN
Os registradores do tipo PIN são responsáveis por guardar o estado lógico de um pino.

?
1
/* Equivalente:
2 pinMode(9,INPUT);
3 digitalWrite(9,HIGH); //Nesse contexto, ativa o pull-up interno.
4 bool x = digitalRead(9);
5 */
6
7 DDRB &= ~(1 << DDB1);
PORTB |= (1 << PORTB1);
8 bool x = (PINB & (1 << PINB1));
9
Todo o conteúdo apresentado pode ser encontrado no datasheet do microcontrolador.

Você também pode gostar