;; 0.5秒間隔でスピーカー(PB7)からドレミの音階を間欠的に発生させる。 ;; ;; 音階はTIMER0のオーバーフロー割り込みを使う ;; ;*************************************************************** ;*  デバイスの定義ファイルのインクルード * ;*************************************************************** ; .include "m88def.inc" ; ;*************************************************************** ;*    レジスターにシンボル名を定義    * ;*************************************************************** ; .def d_data =r0 .def temp =r16 .def cnt1 =r17 .def cnt2 =r18 .def cnt3 =r19 .def t_temp =r20 .def itemp =r21 .def sound =r22 ; ; ド: 264Hz (-235) ; レ: 297Hz (-210) ; ミ: 330Hz (-189) ; ファ:352Hz (-178) ; ソ: 396Hz (-158) ; ラ: 440Hz (-143) ; シ: 495Hz (-127) ; ド: 528Hz (-119) ; レ: 594Hz (-106) ; ミ: 660Hz (- 95) ; ファ:704Hz (- 89) ; ソ: 792Hz (- 79) ; ラ: 880Hz (- 71) ; シ: 990Hz (- 63) ; ド: 1056Hz (- 59) ; ; .equ S_C =low($FFFF-(8000000/64/262/2)) ; 0-4MHz÷64÷262Hz÷2 ド .equ S_D =low($FFFF-(8000000/64/294/2)) ; 0-4MHz÷64÷294Hz÷2 レ .equ S_E =low($FFFF-(8000000/64/330/2)) ; 0-4MHz÷64÷330Hz÷2 ミ .equ S_F =low($FFFF-(8000000/64/349/2)) ; 0-4MHz÷64÷349Hz÷2 ファ .equ S_G =low($FFFF-(8000000/64/392/2)) ; 0-4MHz÷64÷392Hz÷2 ソ .equ S_A =low($FFFF-(8000000/64/440/2)) ; 0-4MHz÷64÷440Hz÷2 ラ .equ S_Bf =low($FFFF-(8000000/64/466/2)) ; 0-4MHz÷64÷466Hz÷2 シ .equ S_B =low($FFFF-(8000000/64/494/2)) ; 0-4MHz÷64÷494Hz÷2 シ .equ S_C1 =low($FFFF-(8000000/64/523/2)) ; 0-4MHz÷64÷523Hz÷2 ド .equ S_D1 =low($FFFF-(8000000/64/587/2)) ; 0-4MHz÷64÷587Hz÷2 レ .equ S_E1 =low($FFFF-(8000000/64/659/2)) ; 0-4MHz÷64÷659Hz÷2 ミ .equ S_F1 =low($FFFF-(8000000/64/698/2)) ; 0-4MHz÷64÷698Hz÷2 ファ .equ S_G1 =low($FFFF-(8000000/64/784/2)) ; 0-4MHz÷64÷784Hz÷2 ソ .equ S_A1 =low($FFFF-(8000000/64/880/2)) ; 0-4MHz÷64÷880Hz÷2 ラ .equ S_B1 =low($FFFF-(8000000/64/988/2)) ; 0-4MHz÷64÷988Hz÷2 シ .equ S_C2 =low($FFFF-(8000000/64/1057/2)) ; 0-4MHz÷64÷1057Hz÷2 ド .equ n_data =15 ;sound data No. ; ; ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** 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 timer0 ; 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オーバーフロー処理ルーチン         * ;*************************************************************** ; timer0: ; Timer0 interrupt in itemp,SREG ;SREGの退避 push itemp ; out TCNT0,d_data inc sound out PORTB,sound pop itemp out SREG,itemp reti ; ; ;*************************************************************** ;* リセットルーチン             * ;*************************************************************** ; 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 DDRB,temp ; set portD to output ldi temp,$FF out PORTB,temp ldi temp,$01 sts TIMSK0,temp ;TIMER0 request enable ldi temp,$03 ;$05:1024, $04:1/256, $03:1/64 out TCCR0B,temp ldi ZH,high(s_data*2) ;High ldi ZL,low(s_data*2) ;Low lpm ; Zレジスターの示すFlashメモリー上のデータをロード ldi sound,0 out TCNT0,d_data sei ; ; ;*************************************************************** ;* メインプログラム * ;* * ;*        スピーカーからドレミ音      * ;* * ;*************************************************************** ; main: ldi ZH,high(s_data*2) ;High ldi ZL,low(s_data*2) ;Low loop_1: lpm ; Zレジスターの示すFlashメモリー上のデータをロード out TCNT0,d_data rcall delay adiw ZL,1 cpi ZL,low(s_data*2)+n_data brne loop_1 rjmp main ; ; ;*************************************************************** ;* 0.5 sec. ディレイ ルーチン * ;* * ;* dl3: 5 clock * 200回 - 1 = 999 clock * ;* dl2: (dl3 + 4 clock) * 200回 - 1 = 200,599 clock * ;* dl3: (dl2 + 4 clock) * 40回 -1 + 5 + 3 = 8,024,127clock * ;* * ;*************************************************************** ; ; delay: ;about 0.502 * cnt0 sec delay ldi cnt1,40 ;10->0.502sec dl1: ldi cnt2,200 ;200->50.2msec, dl2: ldi cnt3,200 ;200->250usec dl3: ;5clock/1loop 1.25 usec nop ;1 clock nop ;1 clock dec cnt3 ;1 clock brne dl3 ; if z=0 jump to dl3 2clock dec cnt2 brne dl2 ; if z=0 jump to dl2 dec cnt1 brne dl1 ; if z=0 jump to dl1 ret ; ; ;*************************************************************** ;* サウンドデータを書き込む * ;* データはワード単位(偶数個)が良い  * ;*************************************************************** ; s_data: .db S_C,S_D,S_E,S_F,S_G,S_A,S_B,S_C1,S_D1,S_E1,S_F1,S_G1,S_A1,S_B1 .db S_C2,S_C2