【问题标题】:Issues with Timers in Assembly [ATmega8]组装中的计时器问题 [ATmega8]
【发布时间】:2013-06-10 14:47:00
【问题描述】:

我有 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 的中断向量并启用了一般中断。

但它确实有效,输出似乎是随机的。 有什么问题吗?

【问题讨论】:

  • “但输出不如预期”——那么预期输出是什么,实际输出是什么?
  • 您是否设置了 T2OVF、T0OVF 的中断向量并启用了一般中断 (sei)?
  • 我已经重写了文本以便更容易理解

标签: assembly timer atmel atmega


【解决方案1】:
            ;PORTC  0 = INPUT
            ;POT. 1[C0 / ADC0]
            cbi     DDRC,0
            cbi     DDRC,1
            ;PULLUP
            sbi     DDRC,0
            sbi     DDRC,1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多