1. Curso Profissional de Técnico de Eletrónica, Automação e
Computadores
Disciplina: Sistemas Digitais
UFCD 6072 – Microcontroladores-N3
Registos
2. Registos – gerais e especiais
A linguagem Wiring, utilizada para
programação na IDE Arduino, traz diversos
comandos que facilitam a configuração e uso
de pinos.
Iremos mais a fundo com uso de registos,
que trazem algumas otimizações para os
códigos e execução de comandos.
UFCD 6072 –
Microcontroladores-N3
2
3. Registos – gerais e especiais
Assiste ao vídeo para conheceres melhor o
objetivo e funcionalidade dos registos.
https://www.youtube.com/watch?v=Zc_4NgoJ
thU
UFCD 6072 –
Microcontroladores-N3
3
5. Registos – gerais e especiais
O cérebro do Arduino é o seu
microcontrolador, no caso do Arduino Uno, é
o ATMega328p. É ele que armazena os
programas, contém a memória e possui os
pinos de entrada/saída que utilizamos na
placa.
Estes pinos de entrada/saída também são
conhecidos como GPIO (sigla para General
Purpose Input Output ou entrada/saída de
uso geral). Cada microcontrolador contém um
número de GPIOs que podem ser utilizadas
UFCD 6072 –
Microcontroladores-N3
5
6. Registos – gerais e especiais
A placa Arduino Uno possui os pinos digitais
identificados de 0 a 13 e analógicos de A0 a
A5.
Mas a arquitetura do microcontrolador pode
dar outra nomenclatura aos pinos que
conhecemos.
Confire na placa Arduino Uno os detalhes
conforme as próximas figuras.
UFCD 6072 –
Microcontroladores-N3
6
7. Repara na figura
que os pinos que
conhecemos como
digitais estão como
Dx (digitais) ou
Ax (analógicos),
sendo x um número.
Porém, ao lado de cada
pino há uma outra
nomenclatura para
aceder os mesmos
pinos.
UFCD 6072 –
Microcontroladores-N3
7
9. Registos – gerais e especiais
Os microcontroladores podem ter seus
GPIOs divididos em “Portas”, um conjunto de
pinos que podem ser configurados ou
acedidos de uma só vez.
O ATMega328p possui três conjuntos:.
•PORTB: PB0 a PB5 (8 a 13)
•PORTC: PC0 a PC5 (A0 a A5)
•PORTD: PD0 a PD7 (0 a 7)
UFCD 6072 –
Microcontroladores-N3
9
10. Registos – gerais e especiais
Então, para aceder/configurar o pino 9 digital do
ATMega328p, utilizamos a nomenclatura PB1. Este acesso
ou configuração é feito a partir dos registos respetivos.
OBS: Cada microcontrolador possui diferentes conjuntos de
portas e quantidade de GPIOs. Portanto, outras versões de
Arduino como Mega 2560, Leonardo e outras placas não
coincidem com as nomenclaturas dos pinos do Arduino Uno.
É importante consultar o datasheet de cada
microcontrolador:
Datasheet ATmega328p
https://content.arduino.cc/assets/Atmel-7810-Automotive-
Microcontrollers-ATmega328P_Datasheet.pdf
UFCD 6072 –
Microcontroladores-N3
10
11. Registos – Configuração
Os comandos para registos são baseados na linguagem C.
Fazem um outro caminho para configurar pinos, diferente
dos comandos já utilizados em Wiring. Eles realizam esta
configuração de forma mais segura e rápida. Utilizaremos
três tipos específicos de registos:
•PORTx: registo de dados, usado para escrever no port ou pino em
específico. x representa os ports disponíveis no microcontrolador, que no
caso do ATMega328p, são os ports B, C e D;
•DDRx: registo de direção, usado para ler a entrada de um port ou pino em
específico. No caso do ATMega328p, x representa os ports B, C e D;
•PINx: endereço de entrada do pino, usado para configurar um port inteiro
ou pino será entrada ou saída.
UFCD 6072 –
Microcontroladores-N3
11
12. Registos – substituir código por
registos
UFCD 6072 –
Microcontroladores-N3
12
Onde:
x: letra referente à porta;
n: número do pino do porta (conjunto);
Y = variável qualquer para armazenar dado.
13. Registos – Lembrar que…
Os comandos na versão registos possuem a característica
de trabalhar por operadores de bits, ou seja, manipulam 0 e
1. As operações realizadas nos comandos são:
•| (barra horizontal): operador OU, no caso dos registos ativa o bit em nível 1
(HIGH);
•& (E comercial): operador E, no caso dos registos desativa o bit em nível 0 (LOW);
•~ (til): operador NÃO, realiza o complemento de bits. O que era 1 vira 0 e vice-
versa;
•^ (circunflexo): operador OU EXCLUSIVO, no caso dos registos serve para
inversão de alguns bits;
•>> (dois sinais de maior): deslocamento de bits para a direita, insere zeros à
esquerda;
•<< (dois sinais de menor): deslocamento de bits para a esquerda, insere zeros à
UFCD 6072 –
Microcontroladores-N3
13
14. Registos – Exemplo 1
Para configurar o pino 7 do Arduino Uno como saída,
precisamos encontrar a nomenclatura usada pelo
microcontrolador. :
O nome do pino 7 do Arduino é PD7. Então, o comando
usando registrador é:
DDRD = DDRD |(1 << DDD7);
No comando acima foi usado o registrador de direção DDR no
port D em PD7. É equivalente ao comando pinMode(7,
OUTPUT);
UFCD 6072 –
Microcontroladores-N3
14
15. Registos – Exemplo 2
Para escrever LOW pino 12 do Arduino Uno, mais uma vez
vamos encontrar a nomenclatura equivalente do
microcontrolador:
O nome do pino 12 do Arduino é PB4. Então, o comando
usando registrador é:
PORTB = PORTB &~ (1<< PB4);
No comando acima foi usado o registrador de dados PORT no
port B em PB4. É equivalente ao comando digitalWrite(12,
LOW);
UFCD 6072 –
Microcontroladores-N3
15
16. Registos – Exemplo 3
Faremos de forma visual a comparação entre os comandos
usados em Wiring e os registos em C usando um
osciloscópio. No sketch de exemplo, faremos uso do pino A3
como digital 17.
O pino digital 17 vai oscilar entre LOW e HIGH duas vezes
usando os registos e também com o comando digitalWrite,
sem uso de delay, para vermos o tempo de execução de cada
um.
Usa o código abaixo:
UFCD 6072 –
Microcontroladores-N3
16
17. Registos – Exemplo tinkercad
// Comandos Wiring para pino A3 (D17)
digitalWrite(17, HIGH); // Nível HIGH
digitalWrite(17, LOW); // Nível LOW
digitalWrite(17, HIGH);
digitalWrite(17, LOW);
delay(5000);
} // Fim do sketch
UFCD 6072 –
Microcontroladores-N3
17
// Comparação entre Wiring e registos em C
void setup() {
// Habilita porta PC3 como saída
DDRC = DDRC |(1 << DDC3);
// Habilita porta PC3 em nível HIGH
PORTC = PORTC | (1<< PC3);
}
void loop() {
// Comandos para pino A3 (ou D17) com
registos
PORTC = PORTC | (1<< PC3); // Nível HIGH
PORTC = PORTC &~ (1<< PC3); // Nível
LOW
PORTC = PORTC | (1<< PC3);
PORTC = PORTC &~ (1<< PC3);
19. Registos – Exemplo tinkercad
Qual a conclusão podemos retirar ao observar os
resultados no osciloscópio?
UFCD 6072 –
Microcontroladores-N3
19
20. Exercício – Tarefa 8
Implementa o circuito seguinte no tinkercad
UFCD 6072 –
Microcontroladores-N3
20
21. Exercício – Tarefa 8
Implementa código que permita que o LED
Vermelho e Verde liguem durante 1segundo e
voltem a desligar durante 1segundo usando
apenas registos internos do arduino.
Basicamente é “transformar” o código seguinte:
UFCD 6072 –
Microcontroladores-N3
21
const int LEDVERMELHO = 2;
const int LEDVERDE = 7;
void setup() {
Serial.begin(9600);
pinMode(LEDVERMELHO, OUTPUT);
pinMode(LEDVERDE, OUTPUT);
}
void loop() {
digitalWrite(LEDVERMELHO, HIGH);
digitalWrite(LEDVERDE, HIGH);
delay(1000);
digitalWrite(LEDVERMELHO, LOW);
digitalWrite(LEDVERDE, LOW);
delay(1000);
}
22. Exemplo – Porta 13
Ligar e Desligar de 1 em 1segundo o Led de
testes(porta 13) através de registos internos do
Arduino
UFCD 6072 –
Microcontroladores-N3
22
23. Exemplo – Porta 13
UFCD 6072 –
Microcontroladores-N3
23
void setup()
{
// Habilita porta 13 como saída
DDRB = DDRB |(1 << DDB5);
}
void loop()
{
PORTB = PORTB | (1<< PB5); // Nível HIGH na
porta 13
delay(1000); // espera 1 segunda
PORTB = PORTB &~ (1<< PB5);// Nível LOW na
porta 13
delay(1000); // Wait for 1000 millisecond(s)
}
Ligar e Desligar de 1 em 1segundo o Led de
testes(porta 13) através de registos internos do
Arduino