【发布时间】: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