Escreva o código assembly para comutar os bits de PORTB e PORTD continuamente através da escrita alternada dos valores 0 x 55 e 0xAA nessas portas.
Passo 1
Beleza, vamos lá! O enunciado pede que a gente escreva um código em linguagem assembly que fique alternando, sem parar, os valores 0x55 (que em binário é
) e 0xAA (que em binário é
) nos registradores de saída PORTB e PORTD.
Conteúdo envolvido:
Conteúdo envolvido:
- Configuração de portas digitais como saída (Data Direction Registers).
- Instruções de load imediato (LDI) e de saída em porta (OUT).
- Loop infinito com desvio relativo (RJMP).
O que você precisa saber: como configurar a DDRx para saída, como carregar um valor imediato em um registrador do processador e como escrever esse valor numa porta, além de usar um loop para repetir isso pra sempre.
Passo 2
Primeiro, a gente configura as portas B e D como saída. Nos microcontroladores AVR, isso se faz escrevendo 1s nos registradores DDRB e DDRD.
Explicação rápida: DDRx é o “Data Direction Register” da porta x. Se você coloca 1 em cada bit de DDRx, significa que o respectivo pino vai ser saída digital.
Assembly típico (considerando um .include para definir DDRB, DDRD, PORTB, PORTD):
Explicação rápida: DDRx é o “Data Direction Register” da porta x. Se você coloca 1 em cada bit de DDRx, significa que o respectivo pino vai ser saída digital.
Assembly típico (considerando um .include para definir DDRB, DDRD, PORTB, PORTD):
LDI r16, 0xFF ; r16 ← 1111 1111b
OUT DDRB, r16 ; configura todos os pinos de PORTB como saída
OUT DDRD, r16 ; configura todos os pinos de PORTD como saída
Passo 3
Agora que as portas são saída, a gente precisa entrar num loop infinito em que:
- Carrega 0x55 em um registrador qualquer (por convenção, uso r17).
- Escreve esse valor em PORTB e em PORTD.
- Carrega 0xAA no mesmo registrador.
- Escreve esse valor em PORTB e em PORTD.
- Volta pro início do loop.
Explicando as instruções:
- LDI r17, 0x55 carrega o valor imediato 0x55 em r17.
- OUT PORTB, r17 escreve o conteúdo de r17 em PORTB.
- RJMP LOOP faz um salto relativo para o rótulo LOOP.
Passo 4
Vamos montar a seção de código completo em assembly seguindo a ordem: setup, loop e finalizando sempre no mesmo loop (não há “fim” de programa senão a repetição).
.include "m16def.inc" ; ajusta pro ATmega16, por exemplo
.org 0x0000
RESET:
; Passo 2: Configurar portas como saída
LDI r16, 0xFF
OUT DDRB, r16
OUT DDRD, r16
LOOP:
; Passo 3.1: escreve 0x55
LDI r17, 0x55 ; 0x55 = 0101 0101₂
OUT PORTB, r17
OUT PORTD, r17
; Passo 3.2: escreve 0xAA
LDI r17, 0xAA ; 0xAA = 1010 1010₂
OUT PORTB, r17
OUT PORTD, r17
RJMP LOOP ; volta pro início do loop
Resposta
O código acima em AVR Assembly configura as portas B e D como saídas e, num loop infinito, escreve alternadamente os valores 0x55 e 0xAA nessas portas, fazendo exatamente o que o exercício pede.