大会中定时器的问题[ATmega8]

时间:2013-06-10 14:47:00

标签: assembly timer atmel atmega

written a programm输出2种不同的声音,取自2个电位计。

问题在于,通过延迟开启和关闭蜂鸣器产生声音,这基本上是电位计的值。

但是频率越高,播放声音的时间越短,我希望播放声音的时间与其频率无关。

所以我决定使用计时器。

计划是以下结构:

while(timer0counter > 0)
    while(timer2counter > 0)
        output on
    while(timer2counter > 0)
        output off

如您所见,这应该在指定时间内给出频率。到目前为止的实现如下(PORTB是蜂鸣器)(这仅适用于一个声音):

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设置了中断向量,并启用了中断。

但是它做得很好,输出似乎是随机的。 这有什么不对吗?

1 个答案:

答案 0 :(得分:1)

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

上拉不是通过DDR设置的,而是PORT。从输出读取时不确定输入。