PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Töne erzeugen, ZVEI Geber mit Mega8



Halvar
26.07.2008, 12:56
Ich möchte mit einem AtMega8 Töne erzeugen, die zwischen 1060 und 2600Hz liegen.
Es handelt sich um eine Folge von 5 unterschiedlichen Tönen, wobei jeder Ton gerade mal 70mS lang ist.
http://de.wikipedia.org/wiki/5-Ton-Folge

Wie kann ich ohne möglichst zusätzliche Hardware diese Töne aus dem Mega8 herraus zaubern?

Christopher1
26.07.2008, 13:20
Hi,
eigentlich brauchs du nur einen kleinen Speaker (z.B.von Reichelt) und dann kannst du mit einem Timer das Signal erzeugen.

Halvar
26.07.2008, 13:42
Danke für deine Antwort.

Mit dem Timer bekomme ich doch nur einen Ton herraus, oder?
Ich brauche aber verschiedene Töne, die hintereinander abgespielt werden sollen.

python_rocks
26.07.2008, 13:51
Ich möchte mit einem AtMega8 Töne erzeugen, die zwischen 1060 und 2600Hz liegen.
Hallo Halvar!

Gestatten, Halvar mein Name. :-)

Mit Buzzer (Piezo) oder Lautsprecher und Transistor (laut): http://halvar.at/elektronik/kleiner_bascom_avr_kurs/timer0_als_timer/

Mit Lautsprecher aber ohne Transistor (leise): http://www.mcselec.com/index.php?option=com_content&task=view&id=175&Itemid=41

Dieser Beitrag http://www.loetstelle.net/forum/viewtopic.php?p=11781#11781 und die folgenden Beiträge dürften auch noch interessant sein.

Wenn du mit dem Timer1 arbeitest, dann brauchst du nur zuerst den Überlaufwert in das Pseudo-Register Compare1a schreiben. Danach schaltest du den Timer1 so lange ein, so lange der Ton dauern soll. Danach schaltest du den Timer einfach wieder aus.


STOP TIMER1
START TIMER1
Es gibt auch noch den SOUND-Befehl, den ich hier nicht verschweigen möchte. Der ist dann interessant, wenn es nicht so genau auf die Frequenz ankommt und das Programm in der Zwischenzeit sowiso nichts zu tun hat.

mfg
Gerold
:-)

radbruch
26.07.2008, 14:18
Ein 8Ohm Lautsprecher aus einem PC direkt am Kontroller-Pin macht auch viel Krach:
http://www.youtube.com/watch?v=Yw3iHIym58k

Gruß

mic

Halvar
26.07.2008, 14:48
Danke euch beiden.

Die Lautstärke ist Nebensache, da der Ton hinterher direkt auf die NF-Eingangsstufe der Funkgerätes gehen soll.

Das mit dem Timer leuchtet ein, wie ändere ich ganz schnell die Tonhöhe?

Ich möchte jeder Ziffer einen Ton zu ordnen. Diese Ziffer möchte ich vorher eingeben, und auf Knopfdruck die eingestellte 5Ton-Folge abbspielen.
Wenn ich den Timer configuriert habe, lässt er sich doch nicht ganz fix um stellen?

python_rocks
26.07.2008, 15:36
Wenn ich den Timer configuriert habe, lässt er sich doch nicht ganz fix um stellen?
Hallo Halvar!


$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100

Config Portb.1 = Output 'OC1A

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


Do
Call Frequency_set(1060)
Call Frequency_output_on()
Waitms 70
Call Frequency_set(1500)
Waitms 70
Call Frequency_set(2600)
Waitms 70
Call Frequency_output_off()
Wait 3
Loop

End


Sub Frequency_set(byval Frequency As Word)
'Voreinstellung = 8000000 / (Hz * 2)

'1060 Hz: 8000000 / (1060 * 2) = 3773,5849 = 3774
'Test: 8000000 / 3774 / 2 = 1059,88 Hz

'1500 Hz: 8000000 / (1500 * 2) = 2666,66 = 2667
'Test: 8000000 / 2667 / 2 = 1499,81 Hz

'2600 Hz: 8000000 / (2600 * 2) = 1538,46 = 1538
'Test: 8000000 / 1538 / 2 = 2600,78 Hz

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
mfg
Gerold
:-)

EDIT: Code ausgebessert

python_rocks
26.07.2008, 15:57
Hallo Halvar!

Ich habe das jetzt nachgemessen. Statt 1060 Hz hatte ich am Ausgang ca. 1090 Hz. Du brauchst unbedingt einen Quarz, wenn du eine genaue Frequenz ausgeben möchtest. Mit dem internen RC-Oscillator kommst du nicht weit. ;-)

mfg
Gerold
:-)

Halvar
26.07.2008, 22:17
Hallo Gerold - Halver,
Hey, das ist ja schon ein fertiges Programm!
Ausgang ist OC1A, also PinD1 ? Kann ich den auch erstmal mit einem Lautsprecher und Widerstand belasten, oder arbeitet der Pin als OC anders?
Natürlich habe ich keinen 8Mhz Quarz rum liegen, aber funktioniert doch auch mit jeder anderen Frequenz bis 16Mhz? Einen mit 10,24 Mhz hätte ich liegen.

Danke dir !


Gerade nen Fehler entdeckt: OC1A ist PinB1 , nicht PinD1.

python_rocks
26.07.2008, 22:38
Hallo Halvar!

Kann ich den auch erstmal mit einem Lautsprecher und Widerstand belasten, oder arbeitet der Pin als OC anders?
Schaltpläne findest du hier:
- http://www.mcselec.com/index.php?option=com_content&task=view&id=175&Itemid=41
- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/timer0_als_timer/



Natürlich habe ich keinen 8Mhz Quarz rum liegen, aber funktioniert doch auch mit jeder anderen Frequenz bis 16Mhz? Einen mit 10,24 Mhz hätte ich liegen.
Die Frequenz des Quarz ist egal. Wichtig ist nur, dass du das Programm entsprechend anpasst. "8000000" sollte dann natürlich durch "10240000" ersetzt werden. Und die FuseBits musst du natürlich auch anpassen, dass der Systemtakt vom Quarz genommen wird. http://halvar.at/elektronik/kleiner_bascom_avr_kurs/ (Beiträge 22-25)

mfg
Gerold
:-)

Halvar
26.07.2008, 23:37
Ja super, läuft !
Jetzt mit dem Quarz bekomme ich eine sehr genaue Frequenz hin.

Ich habe den Speaker (8Ohm, 0,25W) über einen 100Ohm Widerstanddirekt an PinB1 angeschlossen.

Nun ärgert mich das Programm an anderer Stelle:
ich möchte einen Zahlenwert übergeben, und demnach die Töne aus einer Tabelle holen.

...
Dim A As Byte

Dim Ton1 As Word

A = 9

Ton1 = Lookup(a , Freq)

Call Frequency_set(ton1)

end

Freq:
Data 1000 , 1060 , 1160 , 1270 , 1400 , 1530 , 1670 , 1830 , 2000 , 2200 , 2400 , 2600

Der Code ist hier unvollständig, gekürzt auf das wesentliche was ich hinzu gefügt habe!

Über die Variable A bestimme ich eine Ziffer zwischen 0 und 9.
In der Tabelle wird Ton1 der Wert zugeteilt, den A bestimmt.
Das ganze geht aber nicht, also Ton1 einthält nicht 2200.

Was mache ich falsch?

Halvar
26.07.2008, 23:55
Arghhhhh, ich hab das % vergessen

Freq:
Data 1000% , 1060% , 1160% , 1270% , 1400% , 1530% , 1670% , 1830% , 2000% , 2200% , 2400% , 2600%

:-b

python_rocks
27.07.2008, 00:14
Ich habe den Speaker (8Ohm, 0,25W) über einen 100Ohm Widerstanddirekt an PinB1 angeschlossen.
Hallo Halvar!

Das wird der ATmega8 wahrscheinlich nicht lange durchhalten.

5 V / 108 Ohm = 0,046 A

Der ATmega8 kann maximal 0,040 A an einem Ausgang aushalten ohne Schaden zu nehmen.

mfg
Gerold
:-)

Halvar
27.07.2008, 00:25
Grins, Ok, ich bastel auch noch einen Transi dazwischen. Sicher ist sicher.
Später schließ ich den Mega8 ja an einen hochohmigen Mikrofoneingang an, also kann ich den Kondensator auch jetzt schon mit rein basteln.

Vielen Dank für deine Tips, Gerold, und einen schönen Sonntag!