ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2008年12月15日月曜日

マイコンによる電子オルゴール


ATtiny2313 を使った電子オルゴールのアセンブラプログラムです
ATtiny26やAT1200などでもマイナーな修正で動くはずです.
ATtiny2313の設定はInt. Osc. 8MHzで,
PB0とGNDに圧電サウンダを接続するとできあがりです.
曲はきよしこの夜
タイマ/カウンタ0を使い周期的にon,offすることにより音程を作ります
C(ド) DM(レ♭) D(ミ) DP(ミ♯) E(ファ)などのラベルは音程を与えます.
A5の値が音の長さ(音符)を決めます.
周波数はF=8M/64/2/(256-A2)となります
.DEF A1 =R16
.DEF A2 =R17
.DEF A3 =R18
.DEF A4 =R19
.DEF A5 =R20
.DEF CNT1 =R21
.DEF CNT2 =R22
.DEF CNT3 =R23
.INCLUDE "tn2313def.inc"
RJMP RESET ;各種リセット
RETI ;EXT_INT0 ;外部割り込み要求0
RETI ;EXT_INT1 ;外部割り込み要求1
RETI ;TIM1_CAPT ;タイマ/カウンタ1 捕獲(キャプチャ)発生
RETI ;TIM1_COMPA ;タイマ/カウンタ1 比較A一致
RETI ;TIM1_OVF ;タイマ/カウンタ1 オーバーフロー
RJMP T_INT ;タイマ/カウンタ0 オーバーフロー
RETI ;USART_RXC ;USART 受信完了
RETI ;USART_UDRE ;USART 送信バッファ空き
RETI ;USART_TX ;USART 送信完了
RETI ;ANA_COMP ;アナログ比較器出力遷移
RETI ;PCINT ;ピン変化割り込み要求
RETI ;TIM1_COMPB ;タイマ/カウンタ1 比較B一致
RETI ;TIM0_COMPA ;タイマ/カウンタ0 比較A一致
RETI ;TIM0_COMPB ;タイマ/カウンタ0 比較B一致
RETI ;USI_STRT ;USI 開始条件検出
RETI ;USI_OVF ;USI カウンタ オーバーフロー
RETI ;EE_RDY ;EEPROM操作可
RETI ;WDT_OVF ;ウォッチドッグ計時完了
;
RESET: LDI R16,LOW(RAMEND) ;RAM最終アドレス下位を取得
OUT SPL,R16 ;スタック ポインタ(下位)を初期化

SBI DDRB,0 ;PB0 Output
LDI A1,0B00000011 ;CLK/64
OUT TCCR0B,A1
LDI A1,0B00000010 ;T0 Ovf Int Enable
OUT TIMSK,A1
SEI ;All Int Enable

KIYOSHI:
;0<=A5<256
;300 -240
;150 -120
LDI A5,120
RCALL G
LDI A5,40
RCALL A
LDI A5,80
RCALL G
LDI A5,240
RCALL E
LDI A5,120
RCALL G
LDI A5,40
RCALL A
LDI A5,80
RCALL G
LDI A5,240
RCALL E
LDI A5,160
RCALL DD
LDI A5,80
RCALL DD
LDI A5,240
RCALL H
LDI A5,160
RCALL CC
LDI A5,80
RCALL CC
LDI A5,240
RCALL G
;2
LDI A5,160
RCALL A
LDI A5,80
RCALL A
LDI A5,120
RCALL CC
LDI A5,40
RCALL H
LDI A5,80
RCALL A
LDI A5,120
RCALL G
LDI A5,40
RCALL A
LDI A5,80
RCALL G
LDI A5,240
RCALL E
LDI A5,160
RCALL A
LDI A5,80
RCALL A
LDI A5,120
RCALL CC
LDI A5,40
RCALL H
LDI A5,80
RCALL A
LDI A5,120
RCALL G
LDI A5,40
RCALL A
LDI A5,80
RCALL G
LDI A5,240
RCALL E
;3
LDI A5,160
RCALL DD
LDI A5,80
RCALL DD
LDI A5,120
RCALL FF
LDI A5,40
RCALL DD
LDI A5,80
RCALL H
LDI A5,240
RCALL CC
LDI A5,160
RCALL EE
LDI A5,80
RCALL NOS
LDI A5,80
RCALL CC
RCALL G
RCALL E
LDI A5,120
RCALL G
LDI A5,40
RCALL F
LDI A5,80
RCALL D
LDI A5,240
RCALL C
LDI A5,160
RCALL C
LDI A5,80
RCALL NOS
RJMP KIYOSHI

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 ;NO SOUND
RJMP L1
CM: LDI A2,129
OUT TCNT0,A2
RJMP L1
C: LDI A2,136
OUT TCNT0,A2
RJMP L1
DM: LDI A2,143 ;CP>>DM
OUT TCNT0,A2
RJMP L1
D: LDI A2,150
OUT TCNT0,A2
RJMP L1
DP: LDI A2,156
OUT TCNT0,A2
RJMP L1
E: LDI A2,161
OUT TCNT0,A2
RJMP L1
F: LDI A2,166
OUT TCNT0,A2
RJMP L1
FP: LDI A2,172
OUT TCNT0,A2
RJMP L1
G: LDI A2,176
OUT TCNT0,A2
RJMP L1
GP: LDI A2,181
OUT TCNT0,A2
RJMP L1
A: LDI A2,185
OUT TCNT0,A2
RJMP L1
AP: LDI A2,189
OUT TCNT0,A2
RJMP L1
H: LDI A2,193
OUT TCNT0,A2
RJMP L1
CC: LDI A2,196
OUT TCNT0,A2
RJMP L1
CCP: LDI A2,200
OUT TCNT0,A2
RJMP L1
DD: LDI A2,203
OUT TCNT0,A2
RJMP L1
DDP: LDI A2,206
OUT TCNT0,A2
RJMP L1
EE: LDI A2,209
OUT TCNT0,A2
RJMP L1
FF: LDI A2,211
OUT TCNT0,A2
RJMP L1
L1: MOV CNT1,A5
LOOP1: LDI CNT2,150
LOOP2: LDI CNT3,80 ;100*10/8
LOOP3: NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
CLI
MOV CNT1,A5
L2: LDI CNT2,80 ;100*10/8
L3: NOP
NOP
DEC CNT2
BRNE L3
DEC CNT1
BRNE L2
SEI
RET