Exemplo: Configuração do Timer 0 para gerar interrupções no transbordamento do contador.

Neste exemplo mostramos os seguintes conceitos:

Piscando LEDs com interrupções do Timer0:

; *************************************************************
; * Autor: Edson Borin
; * Descrição do projeto: configura o timer 0 para interromper 
;       o processador de tempos em tempos e ligar/desligar o 
;       sinal do pino 0 da porta de saída PortB (associada a um LED).
; *************************************************************

.nolist
.include "m88def.inc"
.list

; =============================================================
;      D E F I N I Ç Õ E S  D E  C O N S T A N T E S  N A
;            M E M O R I A  D O  P R O G R A M A
; =============================================================

; Timer prescaler; 0x1 : 001 = clkI/O / 1
; Timer prescaler; 0x2 : 010 = clkI/O / 8
; Timer prescaler; 0x3 : 011 = clkI/O / 64
; Timer prescaler; 0x4 : 100 = clkI/O / 256
; Timer prescaler; 0x5 : 101 = clkI/O / 1024
.equ my_prescaler = 0x4

; =============================================================
;         V E T O R   D E   I N T E R R U P Ç Õ E S
; =============================================================
.CSEG
; Vetor número 1  = RESET
.ORG 0x0000
rjmp reset

; Vetor número 17 = TIMER0 OVF Timer/Counter0 Overflow
.ORG 0x0010 
rjmp Timer0_ovf
 
; =============================================================
;   I N I C I A L I Z A Ç Ã O  D O  P R O C E S S A D O R 
;                       A P Ó S   R E S E T 
; =============================================================
reset:
; Inicializar a pilha
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
 
; Configurar o timer0

; TOIE0: Timer/Counter0 Overflow Interrupt Enable
ldi r16, 0x01
sts TIMSK0, r16

; TCNT0 = 0
ldi r16, 0x00
out TCNT0, r16

; Ajustar o prescaler
ldi r16, my_prescaler
out TCCR0B, r16
 
; Configura o pinos 0 da porta B como saída (LEDs)
sbi DDRB,  0x0
; Inicia o pino 0 da porta B com 0 
cbi PortB, 0x0

; Habilita interrupções
sei

; =============================================================
;  Laço do programa
; =============================================================
loop:
; ... Laço infinito que não faz nada
rjmp loop


; =============================================================
;  Rotina para tratar interrupção do timer
; =============================================================
Timer0_ovf:

; Salvar contexto
push r16       ; Salva r16
push r17       ; Salva r17
in r16, SREG   ; Salva SREGs
push r16

in r16, PortB  ; Lê estado dos leds
ldi r17, 0x01  ; Inverte estado do 
eor r16, r17   ; primeiro bit
out PortB, r16 ; Escreve estado dos leds
 
; Restaurar contexto
pop r16        ; Restaura SREGs
out SREG, r16
pop r17        ; Restaura r17
pop r16        ; Restaura r16
reti           ; Retorna e habilita interrupções