Neste exemplo mostramos os seguintes conceitos:
; ************************************************************* ; * 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