2 つのポテンショメータから取得した 2 つの異なるサウンドを出力するプログラムを作成しました。
それに関する問題は、基本的にポテンショメータの値である遅延でブザーをオン/オフすることによって音が生成されることです。
しかし、周波数が高いほど、サウンドが再生される時間は短くなり、サウンドが再生される時間はその周波数に関連付けられていないことが必要です。
そこでタイマーを使うことにしました。
以下の構成を予定しています。
while(timer0counter > 0)
while(timer2counter > 0)
output on
while(timer2counter > 0)
output off
ご覧のとおり、これにより、指定された時間の頻度が得られるはずです。これまでの実装は次のようになります (PORTB はブザーです) (これは 1 つのサウンドのみです):
mainloop:
ldi r27,250;The value of one Potientiometer, here a static value
ldi r22,255
mov r23,r27
loop:
ldi r16,4
out PORTB,r16
tst r23
brne loop
mov r23,r27
inner:
ldi r16,0
out PORTB,r16
tst r23
brne inner
tst r22
brne loop
rjmp mainloop
タイマーオーバーフロー関数は次のとおりです。
tmr0overflow:
tst r22
breq skip0
sub r22,1
skip0:
reti
tmr2overflow:
tst r23
breq skip2
sub r23,1
skip2:
reti
タイマーの初期化:
ldi r16,5
out TCCR0,r16
ldi r16,2
out TCCR2,r16
ldi r16,(1<<TOIE0) | (1<<TOIE2)
out TIMSK,r16
また、T2OVF、T0OVF の割り込みベクトルを設定し、一般的に割り込みを有効にしました。
しかし、うまくいきません。出力はランダムに見えます。どうしたの ?