Questo codice usa gli indirizzi numerici diretti per i registri, ma attenzione: i registri di I/O tradizionali
(accessibili con in/out) sono solo i primi 32, da 0x00 a 0x1F.
Registri come DDRB (indirizzo 0x24) e PORTB (0x25) sono in memoria mappata e richiedono istruzioni diverse.
Per quelli si usa lds (load direct from SRAM) e sts (store direct to SRAM) invece di in/out.
; -------------------------------------------
; esempio1.asm - accendere LED su PORTB0
; -------------------------------------------
; Definizione registri come indirizzi numerici
.equ DDRB = 0x24 ; DDRB è a indirizzo 0x24 nella SRAM mappata
.equ PORTB = 0x25 ; PORTB è a indirizzo 0x25 nella SRAM mappata
.org 0x0000 ; reset vector
rjmp start ; salto all’inizio del programma
start:
ldi r16, 0b00000001 ; configura bit0 come output
sts DDRB, r16 ; scrivi valore in DDRB (non si può usare out 0x24,r16)
ldi r16, 0b00000001 ; accendi LED sul bit0
sts PORTB, r16 ; scrivi valore in PORTB
loop:
rjmp loop ; ciclo infinito, mantieni LED acceso
Come provarlo con costycnc.it/avr1
Copia e incolla il codice nell'editor assembly di costycnc.it/avr1.
Compila ed esegui nel simulatore o caricalo sul tuo ATmega328.
Collega un LED con resistenza al pin PORTB0 (pin 14) e GND.