Escreva um programa em assembly para monitorar o bit PB5. Quando o bit estiver com valor alto, gerar um pulso LOW-to-HIGH-to-LOW em PB3.

Passo 1

Beleza, o exercício pede pra gente mandar um programa em Assembly (supondo AVR) que fique “de olho” no bit PB5 e, sempre que ele ficar em nível alto (1), faça um pulso LOW–to–HIGH–to–LOW em PB3.
Conteúdo envolvido:
• Registradores de Porta B (DDRB, PINB, PORTB)
• Instruções de bit–manipulation (sbi, cbi, in, andi, breq, rjmp)
• Máscaras de bit como (1 ll 5) e (1 ll 3)

Passo 2

Configurar PB3 como saída e PB5 como entrada. No AVR, toda porta começa como entrada, então só precisamos indicar que PB3 vai ser output:
    sbi DDRB, DDB3    ; DDRB |= (1<<DDB3)
Aqui a instrução sbi DDRB, DDB3 seta o bit 3 de DDRB, colocando PB3 em saída.

Passo 3

Fazer um loop infinito que leia o registrador PINB, isole o bit 5 e só saia do loop interno quando o PB5 for 1. Aí geramos o pulso em PB3 e voltamos a ficar de olho em PB5:
loop:
    in    r16, PINB              ; carrega o estado de PORTB em r16
    andi  r16, (1<<5)            ; isola o bit 5: r16 &= 0b0010_0000
    breq  loop                   ; se zero (PB5=0), fica aqui
    ; agora PB5=1 → gerar pulso em PB3
    cbi   PORTB, PB3             ; força PB3=0 (LOW)
    sbi   PORTB, PB3             ; força PB3=1 (HIGH)
    cbi   PORTB, PB3             ; retorna PB3=0 (LOW)
    rjmp  loop                   ; volta a monitorar PB5

Passo 4

Explicando teoricamente cada instrução de bit:
in r16, PINB lê o estado atual dos pinos da porta B e coloca em r16.
andi r16, (1<<5) faz uma “máscara” que zera todos os bits, exceto o bit 5.
breq loop significa “Branch if EQual zero”: se o resultado do AND foi zero (bit5 baixo), salta pro label loop de novo.
cbi PORTB, PB3 e sbi PORTB, PB3 limpam ou setam diretamente o bit 3 do registrador PORTB, gerando o pulso desejado.

Resposta

Segue o programa completo em Assembly AVR:
    .include "m328pdef.inc"    ; ajuste pro seu dispositivo
    .cseg
    rjmp start

start:
    ; Configuração inicial
    sbi   DDRB, DDB3       ; PB3 saída (pulso)
    
loop:
    in    r16, PINB        ; lê porta B
    andi  r16, (1<<5)      ; isola PB5
    breq  loop             ; se PB5=0, repete
    ; PB5=1 → gera pulso em PB3
    cbi   PORTB, PB3       ; PB3 = 0 (LOW)
    sbi   PORTB, PB3       ; PB3 = 1 (HIGH)
    cbi   PORTB, PB3       ; PB3 = 0 (LOW)
    rjmp  loop             ; volta a vigiar PB5

Exercícios relacionados