Ton Erzeugen / Dekodieren (1750Hz)

dg2ygq

Neues Mitglied
23. Juli 2007
239
0
0
Bielefeld
Sprachen
Ich schreibe hier schon wieder in Hardware rein .... Dirk, schieb diesen Beitrag doch bitte in die richtigere Kategorie :eek:

Die Funkamateure benutzen einen Ton von 1750Hz, um ihre Relais-Stationen anzusprechen.
Nun möchte ich das auch haben :D

Ich möchte also einen Ton von 1750Hz erzeugen, das sollte ja nicht weiter schwer sein .... wenn ich nur wüßte wie sich das mit dem Soundbefehl errechnen ließe ....
Oder würdet ihr das anders machen? PWM, DTMF oder sowas?

Anderer Seits möchte ich auf der Empfänger Seite einen 1750Hz Decodierer erstellen. Also wenn der AVR diesen Ton empfängt, soll er etwas schalten.
Da die länge des Tons recht lang ist (gut ne sec), könnte man die Impulse doch in einer gewissen Zeit vergleichen ?!
Natürlich muss auch eine gewisse tolleranz einberechnet werden, da die meisten 1750Hz-Generatoren noch RC-Oszillatoren sind.

Den NF-Level würde ich mit einem OP auf gut 4-5V anheben, und mit ner Diode gleichrichten, damit ich das Signal direkt am Portpin anliegen hab.

Ach ja, das ganze wieder unter Bascom auf dem Mega8 .
 
Hallo Micha,

also, mit dem SOUND Befehl kannst Du einen Ton auf einem beliebigen PIN erzeugen. Ich habe mir allerdings noch nicht genau angesehen, was BASCOM aus genau aus dem Statement macht und wie es auf der Maschine umgesetzt wird da ich es selber noch nicht benutzt habe.

Ich weiß allerdings, dass der SOUND Befehl nicht dazu geeignet ist, genaue Frequenzen auszugeben. Im Manual zum BASCOM wird darauf auch explizit hingewiesen. In solch einem Fall wird darauf verwiesen, den Ton mit einem Timer zu erzeugen.

Wie der SOUND genau zu konfigurieren ist habe ich leider auch noch nicht herausgefunden. Ich vermute für 1750 Hz und 1 Sekunde lang wird das Ding SOUND pin, 1000, 1750 lauten.

Ich würde aber für präzise 1750 Hz eher einen Timer verwenden. Dabeibleibt es Dir überlassen ob Du eine ISR mit 3500 Hz renen und einen PIN toggeln läßt oder ob Du einen Timer verwendest mit dem Du direkt eine Frequenz erzeugen kannst. Schau mal ins Datenblatt von Deinem Mega8 und schau Dir mal die Frequenzerzeugung über Timer an. Das würde ich Dir eher anraten bevor Du den SOUND Befehl verwendest.

mir ist nämlich auch bekannt, dass in früheren BASCOM-Versionen der SOUND-Befehl noch Fehler hatte. Man konnte irgendwie an Parametern angeben was man wollte, die frequenz war immer die gleiche :cool:

Grüße,
Ma
 
Hallo Michael,

Markus hat das mit der Tonerzeugung ja schon erklärt. Wenn du das mit einem Timer realisieren möchtest, dann siehe die einmal die Sache mit dem Compare-Ereignis an, man kann hier sehr einfach Frequenzen erzeugen. Die Frequenzerzeugung kann das Timermodul des AVR selbst erledigen, so dass hier dein Programm in Ruhe weiterarbeiten kann.

Die Frequenzmessung macht man auch über einen Timer, hierfür nimmt man das Capture-Ereignis des Timermoduls. Der AVR hat hier einen Eingangspin InputCapture, an dem das Signal angelegt wird. Dein Signal müsste hier einfach zu messen sein, wenn es gut aufbereitet am InputCapturePin anliegt, Toleranzen kannst du ja in deinem Programm berücksichtigen. Ob der Mega8 InputCapture hat, weiss ich jetzt gerade leider nicht.

Grüße,
Dirk
 
Oha, das scheint ja alles garnicht so einfach zu sein. Besonders mit der ISR tu ich mich verdammt schwer.

Ich bleibe erst mal bei der einfacheren Ausgabem bevor ich mich weiter mit der dekodierung beschäftige.

Einfach nur toggeln find ich "langweilig", also schau ich mir mal die Timer Frequenzerzeugung an (wenn ich sie finde und wenigstens etwas davon verstehe).

Ja der Soundbefehl benötigt den Pin, die Dauer und das wechseln in einem bestimmten Zeitraum (?) .....

Ich versuch mich mal erst schlau(er) zu lesen, die nächsten Fragen kommen bestimmt!
 
Ich hätte da was :D

Code:
$regfile = "M8def.dat"
$crystal = 8000000

Config Portb.1 = Output
Ddrc = &B11110000
Portc = &B00001111

Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Stop Timer1

Declare Sub Frequency_set(byval Frequency As Word)
Declare Sub Frequency_output_on()
Declare Sub Frequency_output_off()

Main:
Do
Debounce Pind.0 , 0 , Ausgabe , Sub
Loop

Ausgabe:
   Call Frequency_set(1750)
   Call Frequency_output_on()
   Wait 1
   Call Frequency_output_off()
Return

End

Sub Frequency_set(byval Frequency As Word)

   Local Tmp_single As Single
   Local Tmp_word As Word

   Tmp_single = Frequency * 2
   Tmp_single = 8000000 / Tmp_single
   Tmp_word = Tmp_single

   Compare1a = Tmp_word
End Sub

Sub Frequency_output_on()
   Start Timer1
End Sub

Sub Frequency_output_off()
   Stop Timer1
End Sub

End
Nein, ich will mich nicht auf fremden Lorbeeren ausruhen, habe ich im Netz gefunden und auf die 1750Hz umgeschrieben :eek:


So, nun zum decodieren.
Ich nehme eine Zeit, zB 10mS, in dieser Zeit zähle ich die Impulse. Ensprechen die die Impulse also den 1750Hz, macht der MC irgendwas. Wenn nicht fragt er immer wieder den Pin nach den Impulsen ab ?
 
Hallo Michael,

So, nun zum decodieren.
Ich nehme eine Zeit, zB 10mS, in dieser Zeit zähle ich die Impulse. Ensprechen die die Impulse also den 1750Hz, macht der MC irgendwas. Wenn nicht fragt er immer wieder den Pin nach den Impulsen ab ?
du könntest so die 1.750Hz schon erkennen, allerdings wahrscheinlich auch alles andere. Wenn innerhalb der 10ms für 5ms zum Beispiel 3,5kHz anliegen, dann wird diese Frequenz als 1.750Hz erkannt, das ist nur ein Beispiel zum Verdeutlichen des Problems, da kann natürlich auch alles andere die Anzahl der Pulse in den 10ms erzeugen.

Wenn du wenig Programmierarbeit haben möchtest, dann such mal im Internet nach Frequenzdekoder, Tondekoder o.ä.

Ansonsten würde ich das wie schon beschrieben über die InputCapture-Funktion eines Timers realisieren. Man ermittelt hier direkt die Periodendauer, wenn der InputCapture-Pin auf Flankentriggerung eingestellt ist. Es wäre hier noch Programmcode notwendig, da ja Toleranz zugelassen werden muss und die Frequenz muss ggf. eine bestimmte Minimalzeit anliegen.

Die Aufbereitung des Signals für den AVR ist eventuell nicht so einfach, das darf man hier nicht unterschätzen.

Dieser link könnte noch für dich interessant sein.

Grüße,
Dirk
 
Ah, klasse Link! Lässt sich vielleicht was draus machen ?!

Dort wird der AT90S2313 verwendet :
Die Eingänge sind dort PB0 und PB1 , also AIN0 und AIN1.
übertragen auf den Mega8 wären die Eingänge demnach PD6 und PD7, seh ich das richtig?

Code:
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1 
Config Aci = On , Compare = On , Trigger = Rising 
 
On Icp1 Oncapture 
Enable Icp1
Von dem Code versteh ich bis jetzt noch garnichts, aber irgendwo muss hier doch stehen, welche Pin`s abgefragt werden sollen?

Code:
Case 1050 To 1070 : Ton = "1"
Also der Wert darf eine Tolleranz von +- 10Hz haben. Wo wird denn der Zeitraum des Auslesens fest gelegt? Und überhaupt, hier wird doch die Amplitude gezählt, und nicht die Zeit gemessen?

Könntet ihr mir das Programm mal ganz grob erklären?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)