電子オルゴール(旧バージョン)
回路:内部発振の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