;; 時報をスピーカー(PC5)から鳴らす ;;  1秒 440Hz(0.1秒間鳴らす) ;; 10秒 880Hz(0.3秒間鳴らす) ;; 時報音はTIMER0のオーバーフロー割り込みを使う ;; ;*************************************************************** ;*  デバイスの定義ファイルのインクルード * ;*************************************************************** ; .include "m88def.inc" ; ;*************************************************************** ;*    レジスターにシンボル名を定義    * ;*************************************************************** ; .def temp =r16 ;テンポラリレジスタ .def cnt1 =r17 ;ディレイルーチンで使用する変数1 .def cnt2 =r18 ;ディレイルーチンで使用する変数2 .def cnt3 =r19 ;ディレイルーチンで使用する変数3 .def cnt0 =r20 ;ディレイルーチンで使用する変数0 .def ttemp =r21 ;タイマー割込み処理ルーチン内で使用する ;テンポラリレジスタ .def s_data =r22 ;音階データ .def sec9 =r23 ;9秒カウント用 ; ; ; ; ;*************************************************************** ;*        音階データを定義      * ;*************************************************************** ; .equ sound1 =low($100-(8000000/64/440/2)) ; 0-4MHz÷64÷440Hz÷2 1秒 .equ sound10 =low($100-(8000000/64/880/2)) ; 0-4MHz÷64÷880Hz÷2 10秒 ; ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** rjmp reset ; reset vector reti ; INT0 vector reti ; INT1 vector reti ; PCINT0 reti ; PCINT1 reti ; PCINT2 reti ; WDT reti ; Timer2 COMPA reti ; Timer2 COMPB reti ; Timer2 overflow reti ; Timer1 capture reti ; Timer1 COMPA reti ; Timer1 COMPB reti ; Timer1 overflow reti ; Timer0 COMPA reti ; Timer0 COMPB rjmp T0OVF ; Timer0 overflow reti ; SPI STC reti ; USART/Rx complete reti ; USART/ Data register empty reti ; USART/Tx complete reti ; ADC reti ; EEPROM EE_RDY reti ; Analog comparator reti ; TWI reti ; SPM_RDY ; ; ;*************************************************************** ;* Timer0オーバーフロー処理ルーチン         * ;*************************************************************** ; T0OVF: ; Timer0 interrupt (5)+(13)=(18) in ttemp,SREG ; SREGの退避 (1) push ttemp ; (2) out TCNT0,s_data ; (1) sbic PINC,5 rjmp T0OVFC T0OVFS: sbi PORTC,5 rjmp T0OVFend T0OVFC: cbi PORTC,5 T0OVFend: pop ttemp ; (2) out SREG,ttemp ; (1) reti ; (4) ; ; ;*************************************************************** ;* リセットルーチン             * ;*************************************************************** ; reset: ldi temp,high(RAMEND) out SPH,temp ; set stuck pointer ldi temp,low(RAMEND) out SPL,temp ; set stuck pointer ldi temp,$FF out DDRC,temp ; set portC to output ldi temp,0b11011111 out PORTC,temp ; ldi temp,0b00000001 ; $02 sts TIMSK0,temp ; TIMER0 request enable ldi temp,0b00000011 ; $05:1024, $04:1/256, $03:1/64 out TCCR0B,temp ldi s_data,sound1 ; 初め440Hz out TCNT0,s_data ; ; ;*************************************************************** ;* メインプログラム * ;* * ;*        スピーカーから時報音       * ;* * ;*************************************************************** ; main: ldi s_data,sound1 ; 1〜9秒のサウンド(440Hz) ldi sec9,9 ; 秒カウンターに9をセット sec_1: sei ;割り込み許可 ldi cnt0,1 ; 0.1秒音を出す rcall delay ; 0.1sec delay * cnt0 cli ;割り込み不許可 ldi cnt0,9 ; 0.9秒音を消す rcall delay dec sec9 ; 秒カウンター -1 brne sec_1 ; 9秒まではsec_1へ sec_10: ldi s_data,sound10 ; 10秒目のサウンド(880Hz) sei ;割り込み許可 ldi cnt0,3 ; 0.3秒音を出す rcall delay cli ;割り込み不許可 ldi cnt0,7 ; 0.7秒音を消す rcall delay rjmp main ; ; ;*************************************************************** ;* 0.1 * cn0 sec. ディレイ ルーチン * ;* * ;* dl3: 5 clock * 200回 - 1 = 999 clock * ;* dl2: (dl3 + 4 clock) * 200回 - 1 = 200,599 clock * ;* dl1: (dl2 + 4 clock) * 4 回 -1 = 802,411 clock * ;* delay: (dl1 + 4 clock) * cn0 回 -1 + 5 + 3 clock * ;* * ;*************************************************************** ; ; delay: ;about 0.10 * cnt0 sec delay ldi cnt1,4 ;2->0.10sec dl1: ;(dl2+4)*cnt1-1 ->0.1 sec, ldi cnt2,200 ; dl2: ;(dl3+4)*cnt2-1 ->50.2msec, ldi cnt3,200 ; dl3: ;(5*cnt3-1) ;[dl3]loop 250 usec nop ; (1) nop ; (1) dec cnt3 ; (1) brne dl3 ; (2/1) dec cnt2 ; (1) brne dl2 ; (2/1) dec cnt1 ; (1) brne dl1 ; (2/1) dec cnt0 ; (1) brne delay ; (2/1) ret ; (4)