;; PWMによりドレミの正弦波の音を出す ;; ;; PWMのステップは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 s_data =r22 ; ; ド: 262Hz ; レ: 294Hz ; ミ: 330Hz ; ファ:349Hz ; ソ: 392Hz ; ラ: 440Hz ; シ: 494Hz ; ド: 523Hz ; レ: 587Hz ; ミ: 659Hz ; ファ:698Hz ; ソ: 784Hz ; ラ: 880Hz ; シ: 988Hz ; ド: 1047Hz ; ; 正弦波データ(1周期128分割)の読み込み時間間隔 -> 音階 ; .equ n_data =64 ;sound data No. ; .equ S_C =0-(8000000/8/n_data/1/262) .equ S_D =0-(8000000/8/n_data/1/294) .equ S_E =0-(8000000/8/n_data/1/330) .equ S_F =0-(8000000/8/n_data/1/349) .equ S_G =0-(8000000/8/n_data/1/392) .equ S_A =0-(8000000/8/n_data/1/440) .equ S_B =0-(8000000/8/n_data/1/494) .equ S_C1 =0-(8000000/8/n_data/1/523) .equ S_D1 =0-(8000000/8/n_data/1/587) .equ S_E1 =0-(8000000/8/n_data/1/659) .equ S_F1 =0-(8000000/8/n_data/1/698) .equ S_G1 =0-(8000000/8/n_data/1/784) .equ S_A1 =0-(8000000/8/n_data/1/880) .equ S_B1 =0-(8000000/8/n_data/1/988) .equ S_C2 =0-(8000000/8/n_data/1/1047) ; ;*************************************************************** ;* ベクトルエリア * ;*************************************************************** ; .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 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 t_temp,SREG ;SREGの退避 push t_temp ; out TCNT0,s_data lpm d_data, Z+ sts OCR1AL,d_data sts OCR1BL,d_data 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: 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,176 ; .db 218,246 ; .db 255,246 ; .db 218,177 ; .db 128, 79 ; .db 37, 9 ; .db 0 , 9 ; .db 37, 78 ; .db 128,140,152,165,176,188,199,209 .db 218,226,234,240,246,250,253,255 .db 255,255,253,250,246,240,234,227 .db 218,209,199,188,177,165,153,140 .db 128,115,103, 91, 79, 67, 57, 46 .db 37, 29, 21, 15, 9, 5, 2, 0 .db 0 , 0, 2, 5, 9, 14, 21, 28 .db 37, 46, 56, 67, 78,90,102,115 ; ; .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