moin moin,
nachdem ich hier zu meinen letzten projekten so gute hilfe bekommen
habe, versuch ich es gleich nocheinmal.
leider konnte ich bisher nichts passendes im forum finden.
mein aufbau:
mega8 an 5V, kleiner lautsprecher an D0 und masse.
idee:
ton ausgeben (rechteck-signal mit timer)
frequenz während der ton ausgegeben wird erhöhen. anfangsfrequenz:
500Hz, endfrequenz: 1650Hz
zeit, in der der ton erhöht werden soll: 1s
mein ansatz:
timer1 schaltet den pin high/low
timer0 erhöht das timer-register, damit die frequenz höher wird.
einzelne töne kann ich ausgeben, kein ding. also nichts mit
"wackelkontakt und co"
die timer funktionieren auch beide. hab mit beiden töne produziert. nur
das zusammenspiel... s.u.
problem (vermutung):
leider kommt kein ton, wenn ich die interrupt-zeit von timer1
verkleiner.
ich glaube, es liegt daran, dass timer0 das timer1 register um 700
schritte erhöhen muss, um von ton 500Hz zu ton 1650Hz zu kommen. naja,
700 pro sekunde ist ja im bereich des interrupts von timer1. daher
scheinen sich beide zu überschneiden. am lautsprecher kommt ein ganz
leises, tiefes summen.
meine fragestellung:
wie kann ich den ton von 500Hz innerhalb von 1s auf 1650Hz erhöhen?
(anwendungsbereich soll eine sirene sein)
ich denke mal, dass ich das umgekehrt (1650 -> 500Hz) hinbekomme, wenn
mir hiermit weitergeholfen wird.
prescale:
timer1: 1
timer0: 8
hier etwas code:
main:
[...] config kram
ldi freq_l, LOW(64535) ;500Hz-ton
ldi freq_h, HIGH(64535)
loop:
rjmp loop
TIM1_OVF: ; timer1 overflow interrupt
swap port_reg ;signal-bits: ein/ausschalten
out PORTB, port_reg ;ausgabe am PORTB
; Timer1 wieder aufladen
out TCNT1h,tmrH
out TCNT1l,tmrL
reti
TIM0_OVF:
dec temp ;erst nach 15 mal interrupts weiter, dann ton ändern (damit
700 änderungen pro sekunde)
tst temp
breq weiter1
reti ;gleich raus
weiter1:
mov temp, tmr ;tmr ist 15 (multiplikator für die interrupt-runden^^
rjmp wail_load ;timer1 aktualisieren
wail_load:
adiw freq_l, 1 ;frequenz_timer (low) um 1 erhoehen
mov tmrH, freq_h
mov tmrL, freq_l
reti
wäre schön, wenn ihr mir auf die sprünge helfen könntet.
schönes martin-horn kann "sie" schon - jetzt soll sie amerikanisch
lernen ;)
oh, sry. das passiert ganz am anfang. [...] ;-)
ist also schon mit 15 "geladen"
so würde/sollte es auch nur einmal durchlaufen und den ton endlos
erhöhen, weil kein ende abgefragt wird.
das ist später natürlich nicht so.
aber es fängt ja nichtmal an, töne zu machen
> da stimmen die Adressen nicht, weil ein "reti"> kürzer ist als ein "rjmp xxxx".....
Nö, sind beides 1-Wort-Befehle. Das stimmt schon, vorausgesetzt, die
Vektortabelle an sich ist i.O.. Was Du meinst ist ein "jmp xxxx", den es
aber nur bei AVRs mit mehr als 8 KB Flash gibt.