PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage: Ton per Timer erzeugen



Loosi
05.09.2007, 20:52
Einen wunderschönen guten Abend!

Eins vorweg: Habe schon die Suche benutzt, aber bei den Stichwörtern "Timer Ton" und "Timer Sound" nichts passendes gefunden, wenn ich nur nach "Timer" suche wird es leicht unübersichtlich, nach 23seiten hab ich es aufgegeben alles durch zu gucken :)

Und zwar geht es darum: ich möchte mit meinem uC einen (bzw. mehrere Töne hintereinander) erzeugen. Nur habe ich absolut keine Ahnung wie ich dies per Timer anstellen soll. Mit dem Sound Befehl hab ich es schon versucht, aber der ist leider zu ungenau. Onkel Google hab ich auch schon gefragt, aber ich bin nur so weit gekommen das irgendwo mal stand es ist mit einem Timer möglich, natürlich stand da nicht bei wie man das in Bascom verwirklicht.

Wenn ich jetzt einen Ton von 2000Hz haben will, muss ich dann den Ausgang 2000x pro sek ein und aus schalten, oder wie mache ich das ? Kann mir gut vorstellen das das irgendwas mit der Taktrate des uC´s zu tun hat.

Vielen dank schonmal für eure Hilfe!

Gruß aus dem Sauerland
Daniel

chill-flo
06.09.2007, 00:01
Guten Morgen,
bei 4 mhz und einem prescale von 256kommst du auf eine Frequenz
15625hz jetzt musst du nur noch ausrechnen mit was du den timer laden musst. Bei jedem Timer Overflow löst der AVR einen Interrupt aus der den Port toggelt.

Loosi
07.09.2007, 14:02
hmm, hast du evtl. einen kleinen beispielcode um das zu veranschaulichen? hab das jetzt nicht so ganz verstanden wie du auf die werde gekommen bist :)
gruß
Daniel

chill-flo
07.09.2007, 23:59
ich hab einfach den takt des microcontrollers durch den timer prescale(vorteiler für den timer dass er nicht mit voller taktgeschwindigkeit des controllers mit läuft) beispielcode kann ich morgen(heut mittag) machen

chill-flo
08.09.2007, 23:13
hey,hier der versprochene code
$regfile "m8def.dat"
$crystal = 4000000

Config Timer1 = Timer , Prescale = 64


On Timer1 Ton
Enable Timer1
Enable Interrupts

Ddrd = &B0000100




Do
Loop



Ton:
Toggle Portd.2
Timer1 = 5666
Return
unten wo steht Timer1= musst du mit dem wert experimentiereen und oben wo steht prescale =64 musst du auch ausprobieren (es geht 8,64,256,1024)
müsste so eigentlich funktionieren
vielleicht kann aber jemand mir helfen wen ich die frequenz messe komme ich auf 326hz kann das mal jemand messen kommt bei mir egal was für werte ich für prescale und timer nehme

milkbubi
12.09.2007, 15:16
Hallo Loosi,

sieh dir mal das wiki zu dem Timer an, das ist eigentlich ganz simpel.
https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer

ganz unten ist auch ein link zu einem Berechnungstool mit dem du ganz bequem, nach Angabe deines Taktes und der gewünschten Frequenz, die restlichen Einstellungen berechnen lassen kannst. Außerdem gibt er dir auch den benötigten Code mit aus, den du einfach in dein Programm einfügen kannst.
Bsp.:



'wenn mega 32, dann ändern in $regfile = "m32def.dat"
$regfile = "m16def.dat"

'Quarzfrequenz, entsprechend ihren Angaben
'der passende Quarz muss in die Fassung gesteckt werden
$crystal = 16000000

'Hier wird der Timer und der Teiler festgelegt
Config Timer0 = Timer, Prescale = 64

'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
Config Pinc.2 = Output
'Hier geben wir der Definition einen schöneren Namen
Led3 Alias Portc.2

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer0 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 131


'Hier werden die Timer aktiviert
Enable Timer0
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop



'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer0 = Timervorgabe

'Hier könnte nun ihre beliebige IRQ-Routine stehen
'Dabei sollte man darauf achten das diese nicht mehr Zeit
'benötigt, als das Intervall zuläßt

'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
Toggle Led3

Return


Wenn du jetzt die LED mit einem Speaker ersetzt solltest du einen 1kHz Ton hören. So kannst du dann in gewissem Rahmen jede Frequenz erzeugen, die du magst.

mfg milkbubi