PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : martinshorn programmieren



RobbyMartin
22.07.2010, 09:34
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



$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


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.

lg
martin

Sauerbruch
22.07.2010, 09:43
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]

RobbyMartin
22.07.2010, 09:51
neee leider noch nicht könntes du mir denn was in der richtung helfen??
wäre super nett

lg
martin

Sauerbruch
22.07.2010, 10:04
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?

RobbyMartin
22.07.2010, 10:30
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

Furtion
22.07.2010, 15:36
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.




$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

Jaecko
22.07.2010, 16:13
laut wiki gibt es sind die verschiedenen Frequenzen von dem Ton ja
2 oder 4 kHz (Stadtbetrieb) oder 0,5 und 2 kHz (Landbetrieb).

Nicht ganz.
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.

Sauerbruch
23.07.2010, 00:13
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):



$regfile = "m48def.dat"
$crystal = 1000000

DDRD.3=1
TCCR2A = &B00010010
TCCR2B = &B00000010
OCR2A = &B11111111

OCR2B=100

Do
Loop

End


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).

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.