Wenn Du den Timer-Preset bei jedem Toggeln des Lautsprecher-Ausganges um 1 inkrementierst, muss der Ton kontinuierlich höher werden.
Zwei definierte Töne im Wechsel kann man super mittels PWM erzeugen - hast Du damit schon mal was gemacht?
[/u]
Hallo
wir bauen gerade beim thw ein kart nun soll es auch ein martinshorn bekommen. das möchte ich in Bascom programmiieren. tönne mit timer 0 vom atmega48 kann ich auch programmieren doch das martinshorn setzt sich aus zwei tonhöhen zusammen die immer abwechseldn gespielt werden.
wie kann man dies programmieren
mein code erzeugt jedoch nur eine aufschwellenden ton habt ihr eine idee wie ich es realisieren kann es muss bis spätestens dienstag fertig sein.Code:$regfile "m48def.dat" $crystal = 1000000 $baud = 1200 Ddrd = &B11110000 Dim Timerpreset As Byte On Timer0 Ontimer0 Tccr0 = &B00000010 Timsk.toie0 = 1 Sreg.7 = 1 Do Portd.5 = 1 : Portd.6 = 0 : Portd.7 = 0 Waitms 80 Portd.5 = 0 : Portd.6 = 1 : Portd.7 = 0 Waitms 80 Portd.5 = 0 : Portd.6 = 0 : Portd.7 = 1 Waitms 80 Loop Ontimer0: Timer0 = Timerpreset Toggle Portd.4 Incr Timerpreset Return
lg
martin
Wenn Du den Timer-Preset bei jedem Toggeln des Lautsprecher-Ausganges um 1 inkrementierst, muss der Ton kontinuierlich höher werden.
Zwei definierte Töne im Wechsel kann man super mittels PWM erzeugen - hast Du damit schon mal was gemacht?
[/u]
neee leider noch nicht könntes du mir denn was in der richtung helfen??
wäre super nett
lg
martin
Klar - allerdings musst Du den Lautsprecher dafür an einen der sogenannten "OC"-Pins anschließen. Einer davon wäre z.B. der Port D.3, also gleich neben D.4. Lässt sich das denn Hardware-technisch machen, oder bsit Du auf D.4 festgelegt?
ne das ist das kleinste problem nur alle pins die im programmtext belegt sind werden bis jetzt gebraucht der rest ist frei und da ich auf lochrater gebaut habe ist das kein problem
lg
martin
Hi,
laut Wiki gibt es sind die verschiedenen Frequenzen von dem Ton ja
2 oder 4 kHz (Stadtbetrieb) oder 0,5 und 2 kHz (Landbetrieb). Was man jetzt
braucht ist eigentlich nur ne Routine die die Frequenzen erzeugt. Für
Sachen die Frequenzen und Timer betreffen gibt es ein schönes Programm
im Downloadbereich, das rnAvr heißt. Dort kann man die beiden Frequenzen
die man haben will eintragen und man bekommt dementsprechend den
Timervorgabewert und den Prescaler. Bei 1Mhz wären das
2kHz : Timervorgabe = 194 ; Prescaler = 8
4kHz : Timervorgabe = 6 ; Prescaler = 1
Des Weiteren wird gleich ein Programm generiert in dem die Werte
eingetragen sind, das hab ich mal mit deinem zusammengegebracht.
Im Simulator funktioniert es, musst es evt. noch mal anpassen.
Code:$regfile = "m48def.dat" $crystal = 1000000 $baud = 1200 'mit 4kHz anfangen Config Timer0 = Timer , Prescale = 1 On Timer0 Timer_irq Dim Timervorgabe As Integer Timervorgabe = 6 Ddrd = &B11110000 Config Portd.4 = Output Lautsprecher Alias Portd.4 Dim I As Byte I = 0 Dim A As Byte A = 0 Enable Timer0 Enable Interrupts Do 'Dieser Teil dauert pro Durchlauf 3*80ms = 240ms Portd.5 = 1 : Portd.6 = 0 : Portd.7 = 0 Waitms 80 Portd.5 = 0 : Portd.6 = 1 : Portd.7 = 0 Waitms 80 Portd.5 = 0 : Portd.6 = 0 : Portd.7 = 1 Waitms 80 I = I + 1 If I = 4 Then If A = 1 Then Config Timer0 = Timer , Prescale = 1 Timervorgabe = 6 A = 0 Else Config Timer0 = Timer , Prescale = 8 Timervorgabe = 194 A = 1 End If I = 0 End If Loop 'Dies ist der Programmteil, der in dem von ihnen gewählten 'Intervall aufgerufen wird Timer_irq: Timer0 = Timervorgabe Toggle Lautsprecher Return
Grüße Furtion
Nicht ganz.Zitat von Furtion
Es ist nicht so, dass der eine Ton 2 und der andere 4 kHz hat (das wär als Intervall ne Oktave, also a'-a''; viel zu gross; bei 0,5 und 2 kHz wärs noch extremer mit 2 Oktaven; einfach mal mit nem Soundgenerator testen, wie sich das anhört)
Das Intervall ist immer das gleiche, z.b. das genannte a'–d" (müsste ne Quarte sein; schon lange her). Möglich wären demnach auch g'-c'', oder c'-f''.
Das Tonverhältnis ist also immer gleich. Es soll eben nur beachtet werden, dass der untere Ton 2kHz nicht unter- und der obere 4 kHz nicht überschreitet. Wo man das Intervall aber dort dazwischen ansiedelt, ist mehr oder weniger freigestellt.
Das Beispielintervall a'-d'' hätte z.B. als Grundfrequenzen 440Hz und 587,33Hz.
Hier kommt bei elektronischen Hörnern (v.a. im Landbetrieb) noch die Verwendung eines Filters und des Residuum-Effekts dazu; d.h. die Frequenzen, die man hört, werden garnicht ausgesendet, sondern harmonische Vielfache davon. Vorteil hiervon ist die höhere Reichweite der Frequenzen; Das Ohr bzw. unser Gehirn errechnet daraus wieder die Grundfrequenz.
Mit Cool-Edit kann man sich da wunderbar spielen; mal so Frequenzen erzeugen. Mach ich einfach mal und häng ein Demo hier an.
EDIT: Hab in der ZIP mal 2 MP3s angehängt; einmal nur das reine Sinus-Signal mit 440/587 Hz und einmal nur die Oberwellen, ohne die genannten Frequenzen.
#ifndef MfG
#define MfG
Hi Martin,
zurück zum Thema PWM: Da gibt es verschiedene Modi - beim sogenannten CTC-Modus zählt der Timer so lange hoch, bis er einen bestimmten (frei wählbaren) Grenzwert erreicht. Ist das der Fall, wird der OC-Pin getoggelt, der Timer auf 0 gesetzt (daher auch CTC: Clear Timer on Compare) - und das Spiel fängt von vorne an. Es ist logisch, dass der Pin umso schneller getoggelt wird, je niedriger der Grenzwert ist. Dieser steht im OCR-Register (Output Compare Register) und bestimmt die Frequenz.
Soviel zur Theorie.
Als ersten Schritt zum Martinshorn-Programm solltest Du mal probieren, ob mit folgendem Code ein hörbarer Ton am Pin D.3 entsteht (ich habe nämlich keinen Mega48 da, an dem ich das probieren könnte):
Der Wert im Register OCR2B bestimmt die Tonhöhe: Bei 256 sind es etwa 244 Hz, bei 20 sind es 3125 Hz (Frequenz = 62.500 / OCR2B).Code:$regfile = "m48def.dat" $crystal = 1000000 DDRD.3=1 TCCR2A = &B00010010 TCCR2B = &B00000010 OCR2A = &B11111111 OCR2B=100 Do Loop End
Wenn das funktioniert, kannst Du mit dem Wert von OCR2B herumexperimentieren, bis Du die richtigen Tonhöhen hast. Dann musst Du nur noch mit einem der anderen Timer dafür sorgen, dass der Wert von OCR2A im Takt des Martinshorns zwischen zwei geeigneten Werten hin- und hergesetzt wird.
Lesezeichen