;**************************************************** ;timer0.asm ; timer0 overflow interrupt example ; execute via "Auto Step"(Alt-F5) ; Celio G. MC404 Sept 2012 ; Atuakizado em ;**************************************************** .nolist .include "m88def.inc" .list .set MAXINT = 16 ; maximo numero de interruppcoes .def temp =r16 start: rjmp RESET ;reset handle .org 0x10 rjmp timer0 ; go to timer0 overflow counter interrupt routine RESET: clr xl ; will use X as an interrupt counter clr xh ldi temp,1 ; no Atmega88 este registrador está fora do espaço de E/S! sts TIMSK0,temp ; enable timer0 overflow interrupt (p.102 datasheet) ldi temp,1 ; set prescalong: 1= no prescaling 5= CK/1024 pre-scaling (p 102-103 datasheet) out TCCR0B,temp ; also starts timer0 counting ;out SMCR,temp SMCR=1 selects idle mode sleep and enables sleep (p 37-38 datasheet) sei ; Global Interrupt enable l0: ;sleep enter idle mode sleep: wait for interrupt cpi xl, MAXINT ; vamos contar somente MAXINT interruppcoes brne l0 ; done: ; yes stop timer0 clr r17 out TCCR0B,r17 ; stop timer0 counter: no more interrupts rjmp PC ;************************************************************** ; timer0 overflow interrupt routine timer0: push temp ; save into stack in temp,SREG ; get SREG push temp ; and save it in stack adiw x,1 pop temp ; get SREG from stack out SREG, temp ; restore it pop temp ; now restore r reti ;**************************************************************