4

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 の割り込みベクトルを設定し、一般的に割り込みを有効にしました。

しかし、うまくいきません。出力はランダムに見えます。どうしたの ?

4

1 に答える 1

1
            ;PORTC  0 = INPUT
            ;POT. 1[C0 / ADC0]
            cbi     DDRC,0
            cbi     DDRC,1
            ;PULLUP
            sbi     DDRC,0
            sbi     DDRC,1

プルアップは DDR 経由ではなく PORT 経由で設定されます。出力から読み取る場合、入力は決定されません。

于 2013-06-18T15:07:00.557 に答える