電子オルゴール(旧バージョン)

回路:内部発振の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