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 e
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
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