- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: martinshorn programmieren

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    30
    Beiträge
    206

    martinshorn programmieren

    Anzeige

    Praxistest und DIY Projekte
    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

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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    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]

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    30
    Beiträge
    206
    neee leider noch nicht könntes du mir denn was in der richtung helfen??
    wäre super nett

    lg
    martin

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    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?

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    30
    Beiträge
    206
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Zitat Zitat von Furtion
    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.
    Angehängte Dateien Angehängte Dateien
    #ifndef MfG
    #define MfG

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    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):

    Code:
    $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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen