我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设置了中断向量,并启用了中断。
但是它做得很好,输出似乎是随机的。 这有什么不对吗?
答案 0 :(得分:1)
;PORTC 0 = INPUT
;POT. 1[C0 / ADC0]
cbi DDRC,0
cbi DDRC,1
;PULLUP
sbi DDRC,0
sbi DDRC,1
上拉不是通过DDR设置的,而是PORT。从输出读取时不确定输入。