;; D/A変換によりドレミの正弦波の音を出す ;; ;; D/AのステップはTIMER0のオーバーフロー割り込みを使う ;; 音長はTimer1のコンペア割り込みを使う(約1秒) ;; ;*************************************************************** ;*  デバイスの定義ファイルのインクルード * ;*************************************************************** ; .include "m88def.inc" ; ;*************************************************************** ;*    レジスターにシンボル名を定義    * ;*************************************************************** ; .def d_data =r0 .def temp =r16 .def cnt1 =r17 .def cnt2 =r18 .def cnt3 =r19 .def t_temp =r20 .def s_data =r22 ; ; ド: 262Hz ; レ: 294Hz ; ミ: 330Hz ; ファ:349Hz ; ソ: 392Hz ; ラ: 440Hz ; シ: 494Hz ; ド: 523Hz ; レ: 587Hz ; ミ: 659Hz ; ファ:698Hz ; ソ: 784Hz ; ラ: 880Hz ; シ: 988Hz ; ド: 1047Hz ; ; 正弦波データ(1周期128分割)の読み込み時間間隔 -> 音階 ; .equ S_C =low($FFFF-233);(8000000/128/262)) ;239 .equ S_D =low($FFFF-207);(8000000/128/294)) ;215 .equ S_E =low($FFFF-182);(8000000/128/330)) ;189 .equ S_F =low($FFFF-172);(8000000/128/349)) ;179 .equ S_G =low($FFFF-152);(8000000/128/392)) ;159 .equ S_A =low($FFFF-134);(8000000/128/440)) ;142 .equ S_B =low($FFFF-118);(8000000/128/494)) ;126 .equ S_C1 =low($FFFF-111);(8000000/128/523)) ;119 .equ S_D1 =low($FFFF-98);(8000000/128/588)) ;106 .equ S_E1 =low($FFFF-85);(8000000/128/660)) ;94 .equ S_F1 =low($FFFF-80);(8000000/128/698)) ;89 .equ S_G1 =low($FFFF-70);(8000000/128/784)) ;79 .equ S_A1 =low($FFFF-62);(8000000/128/880)) ;71 .equ S_B1 =low($FFFF-53);(8000000/128/988)) ;63 .equ S_C2 =low($FFFF-50);(8000000/128/1047)) ;59 .equ n_data =128 ;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 rjmp t1compA ; 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 t_temp,SREG ;SREGの退避 push t_temp ; out TCNT0,s_data adiw ZL,1 cpi ZH,high(sinwave * 2 + n_data) brne t0_end cpi ZL,low(sinwave * 2 + n_data) brne t0_end ldi ZH,high(sinwave*2) ;High ldi ZL,low(sinwave*2) ;Low t0_end: lpm out PORTB,d_data pop t_temp out SREG,t_temp reti ; ; ;*************************************************************** ;* Timer1コンペア割り込み処理ルーチン        * ;*************************************************************** ; t1compA: ; Timer1 compare in t_temp,SREG ;SREGの退避 push t_temp ; ldi t_temp,0 sts TCNT1H,t_temp ; Timer1の初期化 sts TCNT1L,t_temp inc XL cpi XL,16 brne t1c_end ldi XL,1 t1c_end: ld s_data,X ; 次のデータを読み込む pop t_temp out SREG,t_temp 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 portB to output ldi temp,$00 out PORTB,temp ;Timer1&0 Int. set ldi temp,(1<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 ; ; ;*************************************************************** ;* 正弦波データ * ;* * ;* 128*sinθ+128 * ;* * ;* θは2π/128rad.ステップ * ;* * ;*************************************************************** ; sinwave: .db 128,134,140,146,152,159,165,171,176,182,188,193,199,204,209,213 .db 218,222,226,230,234,237,240,243,246,248,250,252,253,254,255,255 .db 255,255,255,254,253,252,250,248,246,243,240,237,234,230,227,222 .db 218,214,209,204,199,193,188,182,177,171,165,159,153,146,140,134 .db 128,121,115,109,103, 97, 91, 85, 79, 73, 67, 62, 57, 51, 46, 42 .db 37, 33, 29, 25, 21, 18, 15, 12, 9, 7, 5, 3, 2, 1, 0, 0 .db 0 , 0, 0, 1, 2, 3, 5, 7, 9, 12, 14, 18, 21, 24, 28, 32 .db 37, 41, 46, 51, 56, 61, 67, 72, 78, 84, 90, 96,102,108,115,121