電子オルゴール(新バージョン)
回路:AT90S1200に10MHz発振子をつけ,PB0とGNDに圧電ブザーを接続する.
旧バージョンを修正し,10MHzの外部発振を使い,音符も変えられるようにしました.
プログラムではタイマ/カウンタ割り込みを使ってPB0のon,offを行います.タイマ/カウンタ0(TCNT0)がオーバフローすると割り込みが発生するので,TCNT0の初期値を変えれば音の高さが変わります.割り込みが発生するとPB0のビットが反転します.音の高さはRCALLのラベルで指定し,音の長さはA5(R20)で設定するようにしたので,旧バージョンに比べプログラムがシンプルになりました.
音の高さを決めた計算式は以下のとおりです.
f=523.25*2^(n/12)
TCNT0=256-10^7/128/f
(タイマ/カウンタはTCCR0の設定により,1/64の分周になっています.128で割る意味は,1/64の分周とon,offの2回の割り込みで1周期ということです.)
サンプル1(アルプス一万尺)
;music for 10MHz .DEF A1 =R16 .DEF A2 =R17 .DEF A3 =R18 .DEF A4 =R19 .DEF A5 =R20 .DEF CNT1 =R21 .DEF CNT2 =R22 .DEF CNT3 =R23 .EQU SREG =0x3F .EQU TCNT0 =0x32 .EQU TCCR0 =0x33 .EQU DDRB =0x17 .EQU PORTB =0x18 .EQU TIMSK =0x39 RJMP RESET RETI RJMP T_INT RETI RESET: SBI DDRB,0 ;PORTB Output LDI A1,0x03 ;1/64(100) OUT TCCR0,A1 LDI A1,0x02 ; OUT TIMSK,A1 SEI BEGIN: LDI A5,50 RCALL G RCALL G RCALL A RCALL H RCALL G RCALL H RCALL A RCALL D RCALL G RCALL G RCALL A RCALL H LDI A5,100 RCALL G LDI A5,50 RCALL FP RCALL D ;2 RCALL G RCALL G RCALL A RCALL H RCALL CC RCALL H RCALL A RCALL G RCALL FP RCALL D RCALL E RCALL FP LDI A5,100 RCALL G LDI A5,50 RCALL G RCALL NOS ;3 LDI A5,75 RCALL E LDI A5,25 RCALL FP LDI A5,50 RCALL E RCALL D RCALL E RCALL FP LDI A5,100 RCALL G LDI A5,75 RCALL D LDI A5,25 RCALL E LDI A5,50 RCALL D RCALL C RCALL CM RCALL C RCALL D RCALL NOS LDI A5,75 RCALL E LDI A5,25 RCALL FP LDI A5,50 RCALL E RCALL D RCALL E RCALL FP RCALL G RCALL E RCALL D RCALL G RCALL FP RCALL A LDI A5,150 RCALL G LDI A5,50 RCALL NOS RJMP BEGIN T_INT: IN A3,SREG SBRS A4,0 RJMP ON OFF: CLR A4 CBI PORTB,0 RJMP P1 ON: SER A4 SBI PORTB,0 P1: OUT TCNT0,A2 OUT SREG,A3 RETI NOS: CLI RJMP L1 CM: LDI A2,98 OUT TCNT0,A2 RJMP L1 C: LDI A2,107 OUT TCNT0,A2 RJMP L1 CP: LDI A2,115 OUT TCNT0,A2 RJMP L1 D: LDI A2,123 OUT TCNT0,A2 RJMP L1 DP: LDI A2,130 OUT TCNT0,A2 RJMP L1 E: LDI A2,137 OUT TCNT0,A2 RJMP L1 F: LDI A2,144 OUT TCNT0,A2 RJMP L1 FP: LDI A2,150 OUT TCNT0,A2 RJMP L1 G: LDI A2,156 OUT TCNT0,A2 RJMP L1 GP: LDI A2,162 OUT TCNT0,A2 RJMP L1 A: LDI A2,167 OUT TCNT0,A2 RJMP L1 AP: LDI A2,172 OUT TCNT0,A2 RJMP L1 H: LDI A2,177 OUT TCNT0,A2 RJMP L1 CC: LDI A2,181 OUT TCNT0,A2 RJMP L1 L1: MOV CNT1,A5 LOOP1: LDI CNT2,150 LOOP2: LDI CNT3,100 LOOP3: NOP NOP DEC CNT3 BRNE LOOP3 DEC CNT2 BRNE LOOP2 DEC CNT1 BRNE LOOP1 CLI MOV CNT1,A5 L2: LDI CNT2,100 L3: NOP NOP DEC CNT2 BRNE L3 DEC CNT1 BRNE L2 SEI RET
サンプル2(四季の歌)
;music for 10MHz .DEF A1 =R16 .DEF A2 =R17 .DEF A3 =R18 .DEF A4 =R19 .DEF A5 =R20 .DEF CNT1 =R21 .DEF CNT2 =R22 .DEF CNT3 =R23 .EQU SREG =0x3F .EQU TCNT0 =0x32 .EQU TCCR0 =0x33 .EQU DDRB =0x17 .EQU PORTB =0x18 .EQU TIMSK =0x39 RJMP RESET RETI RJMP T_INT RETI RESET: SBI DDRB,0 ;PORTB Output LDI A1,0x03 ;1/64(100) OUT TCCR0,A1 LDI A1,0x02 ; OUT TIMSK,A1 SEI BEGIN: LDI A5,100 RCALL H LDI A5,50 RCALL H RCALL A RCALL G RCALL A RCALL G RCALL FP LDI A5,100 RCALL E RCALL E LDI A5,200 RCALL E LDI A5,100 RCALL CC LDI A5,50 RCALL CC RCALL H RCALL A RCALL G RCALL A RCALL CC LDI A5,250 RCALL H LDI A5,150 RCALL NOS ;2 LDI A5,100 RCALL CC LDI A5,50 RCALL CC RCALL H LDI A5,100 RCALL A LDI A5,50 RCALL A RCALL CC LDI A5,100 RCALL H LDI A5,50 RCALL H RCALL G LDI A5,200 RCALL E LDI A5,100 RCALL FP RCALL H LDI A5,50 RCALL A RCALL G RCALL FP RCALL G LDI A5,250 RCALL E LDI A5,150 RCALL NOS RJMP BEGIN T_INT: IN A3,SREG SBRS A4,0 RJMP ON OFF: CLR A4 CBI PORTB,0 RJMP P1 ON: SER A4 SBI PORTB,0 P1: OUT TCNT0,A2 OUT SREG,A3 RETI NOS: CLI RJMP L1 CM: LDI A2,98 OUT TCNT0,A2 RJMP L1 C: LDI A2,107 OUT TCNT0,A2 RJMP L1 CP: LDI A2,115 OUT TCNT0,A2 RJMP L1 D: LDI A2,123 OUT TCNT0,A2 RJMP L1 DP: LDI A2,130 OUT TCNT0,A2 RJMP L1 E: LDI A2,137 OUT TCNT0,A2 RJMP L1 F: LDI A2,144 OUT TCNT0,A2 RJMP L1 FP: LDI A2,150 OUT TCNT0,A2 RJMP L1 G: LDI A2,156 OUT TCNT0,A2 RJMP L1 GP: LDI A2,162 OUT TCNT0,A2 RJMP L1 A: LDI A2,167 OUT TCNT0,A2 RJMP L1 AP: LDI A2,172 OUT TCNT0,A2 RJMP L1 H: LDI A2,177 OUT TCNT0,A2 RJMP L1 CC: LDI A2,181 OUT TCNT0,A2 RJMP L1 L1: MOV CNT1,A5 LOOP1: LDI CNT2,150 LOOP2: LDI CNT3,100 LOOP3: NOP NOP DEC CNT3 BRNE LOOP3 DEC CNT2 BRNE LOOP2 DEC CNT1 BRNE LOOP1 CLI MOV CNT1,A5 L2: LDI CNT2,100 L3: NOP NOP DEC CNT2 BRNE L3 DEC CNT1 BRNE L2 SEI RET