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:
  • 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):
    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:
  1. Carrega 0x55 em um registrador qualquer (por convenção, uso r17).
  2. Escreve esse valor em PORTB e em PORTD.
  3. Carrega 0xAA no mesmo registrador.
  4. Escreve esse valor em PORTB e em PORTD.
  5. 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.

Exercícios relacionados