電子オルゴール(新バージョン)
回路: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