電子オルゴール(旧バージョン)
回路:内部発振のAT90S1200AのPB0とGNDに圧電ブザーを接続するだけです.
PB0のon,offに合わせて圧電ブザーが振動することにより音が出ます.このバージョンは,内部発振でタイミングを取っているので電圧でトーンが変わります.プログラムではタイマ/カウンタ割り込みを使ってPB0のon,offを行います.タイマ/カウンタ0(TCNT0)がオーバフローすると割り込みが発生するので,TCNT0の初期値を変えれば音の高さが変わります.音の長さは,ループ(LOOP1,2,3)で決めています.
サンプル1(きらきら星)
.DEF A1 =R16
.DEF A2 =R17
.DEF A3 =R18
.DEF A4 =R19
.DEF CNT1 =R20
.DEF CNT2 =R21
.DEF CNT3 =R22
.EQU SREG =0X3F
.EQU TCNT0 =0X32
.EQU TCCR0 =0X33
.EQU DDRB =0X17
.EQU PORTB =0X18
.EQU TIMSK =0X39
.EQU C =17
.EQU D =43
.EQU E =67
.EQU F =77
.EQU G =97
.EQU A =114
.EQU H =129
.EQU CC =136
RJMP RESET ;Important!
RETI
RJMP T_INT
RETI
RESET: SBI DDRB,0 ;PORTB OUTPUT
LDI A1,0X02 ;1/8(010)
OUT TCCR0,A1
LDI A1,0X02 ;
OUT TIMSK,A1
SEI
LDI A2,C
RCALL TIME
LDI A2,C
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
CLI
RCALL TIME
LDI A2,F
RCALL TIME
LDI A2,F
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,C
RCALL TIME
CLI
ENDL: RJMP ENDL
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
TIME: LDI CNT1,15
LOOP1: LDI CNT2,100
LOOP2: LDI CNT3,100
LOOP3: NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
CLI
LDI CNT1,100
L1: LDI CNT2,100
L2: NOP
NOP
DEC CNT2
BRNE L2
DEC CNT1
BRNE L1
SEI
RET
サンプル2(春の小川)
.DEF A1 =R16
.DEF A2 =R17
.DEF A3 =R18
.DEF A4 =R19
.DEF CNT1 =R20
.DEF CNT2 =R21
.DEF CNT3 =R22
.EQU SREG =0x3F
.EQU TCNT0 =0x32
.EQU TCCR0 =0x33
.EQU DDRB =0x17
.EQU PORTB =0x18
.EQU TIMSK =0x39
.EQU C =17
.EQU D =43
.EQU E =67
.EQU F =77
.EQU G =97
.EQU A =114
.EQU H =129
.EQU CC =136
RJMP RESET ;Important!
RETI
RJMP T_INT
RETI
RESET: SBI DDRB,0 ;PORTB Output
LDI A1,0x02 ;1/8(010)
OUT TCCR0,A1
LDI A1,0x02 ;
OUT TIMSK,A1
SEI
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,C
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,E
RCALL TIME
CLI
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,C
RCALL TIME
CLI
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,H
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
CLI
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,CC
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,A
RCALL TIME
LDI A2,G
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,D
RCALL TIME
LDI A2,E
RCALL TIME
LDI A2,C
RCALL TIME
CLI
RCALL TIME
CLI
ENDL: RJMP ENDL
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
TIME: LDI CNT1,15
LOOP1: LDI CNT2,100
LOOP2: LDI CNT3,100
LOOP3: NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
CLI
LDI CNT1,100
L1: LDI CNT2,100
L2: NOP
NOP
DEC CNT2
BRNE L2
DEC CNT1
BRNE L1
SEI
RET