Escreva um programa em assembly para alternar PD3, PD7 e PC5 sem afetar os outros bits.
Passo 1
Beleza, o enunciado tá pedindo um programinha em Assembly (vamos supor um AVR tipo ATmega328P) que alterne (toggle) só os bits PD3, PD7 e PC5, sem mexer nos outros. A matéria envolvida é manipulação de registradores de I/O e instrução de bit-set (SBI). Vamos precisar entender como configurar a porta como saída (DDR) e como alternar apenas um bit (usando o registro PINx).
Passo 2
Teoria rápida: no AVR, se você escrever “1” num bit do registro PINx, esse bit correspondente em PORTx é invertido (toggle). Isso é padrão de hardware. A instrução SBI (Set Bit in I/O Register) coloca “1” naquele bit específico sem afetar os outros bits do mesmo registrador.
Passo 3
Antes de alternar, a gente tem que garantir que PD3, PD7 e PC5 estão configurados como saída. Se não fizer isso, mesmo que o PORTx mude, não vai aparecer nada nos pinos físicos. Então usamos SBI em DDRD e DDRC:
- SBI DDRD,3 ; PD3 como saída
- SBI DDRD,7 ; PD7 como saída
- SBI DDRC,5 ; PC5 como saída
Passo 4
Depois de configurar os DDRs, é só inverter os bits com SBI em PINx:
- SBI PIND,3 ; alterna PD3
- SBI PIND,7 ; alterna PD7
- SBI PINC,5 ; alterna PC5
Podemos fazer isso dentro de um loop infinito pra ficar piscando.
Resposta
; Exemplo para ATmega328P, Assembly AVR
.include "m328pdef.inc" ; definicoes do chip
.cseg
.org 0x0000
rjmp Start
Start:
; 1) Configura os três pinos como saída
sbi DDRD, 3 ; PD3 como saída
sbi DDRD, 7 ; PD7 como saída
sbi DDRC, 5 ; PC5 como saída
Loop:
; 2) Alterna cada bit sem mexer nos outros
sbi PIND, 3 ; toggle PD3
sbi PIND, 7 ; toggle PD7
sbi PINC, 5 ; toggle PC5
rjmp Loop ; repete infinitamente