;; 時報をスピーカーから鳴らす ;;  1秒 440Hz(0.1秒間鳴らす) ;; 10秒 880Hz(0.3秒間鳴らす) ;; ;; 1秒間隔はTimer1の比較一致A 割り込みを使う ;; 時報音は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 ;T0タイマー割込み処理ルーチン内で使用する ;テンポラリレジスタ .def itemp =r22 ;T1 オーバーフロールーチン用 ;テンポラリレジスタ .def s_data =r23 ;音階データ .def sec10 =r24 ;10秒カウント用 .def sec1 =r25 ;T1 オーバーフローありフラッグ ; ; ; ; ;*************************************************************** ;*        音階データを定義      * ;*************************************************************** ; .equ sound1 =low($0100-(8000000/64/440/2)) ; 0-8MHz÷64÷440Hz÷2 1秒 .equ sound10 =low($0100-(8000000/64/880/2)) ; 0-8MHz÷64÷880Hz÷2 10秒 .equ T1AL = low(8000000/1024) ;1s .equ T1AH = high(8000000/1024) ; ; ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** ; .cseg ; プログラムエリア開始 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 rjmp T1CMPA ; 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 ; ;*************************************************************** ;* Timer1 比較A一致 ルーチン           * ;*************************************************************** T1CMPA: in itemp, SREG ; SREGの退避 push itemp clr itemp sts TCNT1H,itemp sts TCNT1L,itemp T1_end: ldi sec1, 1 ; T1 オーバーフロー割り込みあり ; フラッグセット pop itemp ; SREGを割り込み前に戻す out SREG,itemp reti ; ; ;*************************************************************** ;* 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 ldi temp,low(RAMEND) out SPL,temp ; set stuck pointer ldi temp,$FF out DDRC,temp ; set portC to output ldi temp,0 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 temp,0 ; sts TCCR1A,temp ; ldi temp,0b00000101 ; TIMER1 ck 1/1024 sts TCCR1B,temp ldi temp,0b00000010 ; T1 比較A一致割り込み可 sts TIMSK1,temp ldi temp, T1AH ; T1 OCR1A初期値セット 上位8bitが先 sts OCR1AH,temp ldi temp, T1AL ; T1 OCR1A初期値セッ 下位8bit sts OCR1AL,temp ldi s_data,sound1 ; 初め440Hz out TCNT0,s_data ; でT0初期値セット ldi sec1, 1 ; T1オーバーフロー割り込みフラッグ セット ; まず、1秒目の音を鳴らす ldi sec10,10 ; 秒カウンター リセット sei ; 割り込み許可 ; ; ; ;*************************************************************** ;* メインプログラム * ;* * ;*        スピーカーから時報音       * ;* * ;*************************************************************** ; main: and sec1, sec1 ; T1オーバーフロー割り込みがあったか breq main dec sec10 ; 秒カウンター -1 breq sec_10 ; 0 なら 10秒目 sec_1: ; 1秒の音を0.1s鳴らす ldi s_data,sound1 out TCNT0, s_data ldi temp, 0b10000001 ; T0オーバーフロー割り込み許可 sts TIMSK0,temp ldi cnt0,1 ; 0.1s の設定 rcall delay ldi temp,0b10000000 ;T0オーバーフロー割り込み不許可 cbi PORTC,5 ; スピーカーoff sts TIMSK0,temp ldi sec1, 0 ; T1オーバーフロー割り込みフラッグリセット rjmp main sec_10: ; 10秒の音を0.3s鳴らす ldi s_data,sound10 out TCNT0, s_data ldi temp, 0b10000001 ; T0オーバーフロー割り込み許可 sts TIMSK0,temp ldi cnt0,3 ; 0.3s の設定 rcall delay ldi temp,0b10000000 ;T0オーバーフロー割り込み不許可 sts TIMSK0,temp cbi PORTC,5 ; スピーカーoff ldi sec10,10 ; 秒カウンター リセット ldi sec1, 0 ; T1オーバーフロー割り込みフラッグリセット 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)