Esempio Assembly: Accendere un LED su ATmega328

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

  1. Copia e incolla il codice nell'editor assembly di costycnc.it/avr1.
  2. Compila ed esegui nel simulatore o caricalo sul tuo ATmega328.
  3. Collega un LED con resistenza al pin PORTB0 (pin 14) e GND.
  4. Il LED dovrebbe accendersi subito.