This demonstrates the use of timer-0 in CTC mode that polls a flag when timer reaches a pre-determined amount over-and-over to produce different sounds.
;-----------------------------------------------------;
; WAIT_TIMER2.ASM for AVR BUTTERFLY ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 21-OCT-09 UPDATED: 21-OCT-09 ;
; ;
; PROGRAM DEMONSTRATES USE OF 8-BIT WAIT-FOR TIMER ;
; USING CTC AND FLAG MODE. USES SOUND ;
;-----------------------------------------------------;
.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)
;----------------------------------------;
; FIRST I'LL DEFINE SOME REGISTER TO USE ;
;----------------------------------------;
.DEF A = R16 ;GENERAL PURPOSE ACCUMULATOR
.DEF I = R21 ;INDEXES FOR LOOP CONTROL
.DEF J = R22
.ORG 0000
RJMP ON_RESET ;START-UP VECTOR TO OUR PROGRAM
;-----------------------------------------;
; WE START HERE ON ALL RESEST AND REBOOTS ;
; FIRST WE SETUP A STACK AREA AT HIGH RAM ;
;-----------------------------------------;
START:
ON_RESET:
LDI A,LOW(RAMEND) ;SETUP STACK POINTER
OUT SPL,A ;SO CALLS TO SUBROUTINES
LDI A,HIGH(RAMEND) ;WORK CORRECTLY
OUT SPH,A ;
;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5 ;SET FOR SPEAKER OUTPUT ON PORT B
LDI A,0b0000_1011 ;SET PRESCALE TO 64,
OUT TCCR0A,A
LDI A,50;<======= CHANGE THIS TO CHANGE TONES
OUT OCR0A,A
MAINL:SBI PORTB,5 ;TURN SPEAKER ON
RCALL WAITER ;WAIT
CBI PORTB,5 ;TURN SPEAKER OFF
RCALL WAITER ;WAIT
RJMP MAINL ;GO ROUND
;-----------------------------;
; WAITS FOR CLOCK TO HIT ZERO ;
;-----------------------------;
WAITER:
WLOOP: IN A,TIFR0
SBRS A,OCF0A ;TOV0=0,OCF0A=1
RJMP WLOOP
LDI A,3 ;RESET FLAGS
OUT TIFR0,A
RET