For å få en AVR mikrokontrollen (uansett type) til å gjøre noe hvert 10sec er det 2 måter å gjøre dette på.
1. Du lager en tidsløkke vha nop's og regner ut hvor mange nop's du trenger for at løkken skal ta 10 sec. Dette er den mest tungvindte metoden og ikke noe sørlig å bruke da den okkuperer unødig prosesseringskraft.
2. Du benytter deg av timer-interrupts. En AVR mikrokontroller har fra 2 til 4 timer-interupts du kan benytte deg av. I manualen til din type kontroller finner du ut hvilken program.minne adresse som aksesseres når du får en timer interrupt, og på denne adressen setter du bare en rjmp til en metode du vil at skal utføres. NB: Husk stakken og returner med reti-kommandoen.
For å enable timer-interrupten på din kontroller, så ser du på interrupt seksjonen i manualen.
Et eksempel på bruk av timer interrupts på en AVR mega128 mikrokontroller:
Kode
.include "m128def.inc"
.def temp = r16
; ====== variable i SRAM ==============
.dseg
.org 0x100
teller: .byte 1
; ====== Interrupt vektorer ===========
.cseg
.org 0
rjmp init
.org 0x20
rjmp timer_0_overflow
; ====== Initialisering ==============
.org 0x46
init:
; initialiser stakkpeker
ldi temp, low(ramend) ;ramend definert i inc fil
out SPL, temp
ldi temp, high(ramend)
out SPH, temp
; initialiser porter
call init_io
; initialiser timer 0
; sett prescaler til 1/1024 og start timeren
ldi r16, 0x07
out TCCR0, r16
; enable interrupt
ldi r16, (1<<TOIE0)
out TIMSK, r16
sei
; initialiser teller
clr temp
sts teller, temp
; ======== Hovedprogram =============
loop:
; Skriv teller på lamper
lds r0, teller
call skriv_lamper
rjmp loop
; ======== Interrupt rutine =============
timer_0_overflow:
push r16
in r16, sreg
push r16
; oppdater teller
lds r16, teller
inc r16
sts teller, r16
pop r16
out sreg, r16
pop r16
reti