mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenz erzeugen


Autor: katus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich bin dabei mit dem einem AT Mega8-16PU (3,6864 MHz Quartz) einen Ton
mit 1745 Hz zu erzeugen. Soweit nicht das große Problem.
Um meine Frequenz zu berechnen habe ich RnAVR genommen. Jedoch komme
ich mit RnAVR nicht auf 1750 HZ, sondern 873HZ

Wer kann mir das erklären, und macht es Sinn auf diesem Wege eine
Frequenz zu erzeugen?

Beispiel RnAVR
'##############################################################
' Timer Beispiel für das universelle Controllerboard
' rn-control mit mega 16 oder mega 32
' Ausführliche Infos zum Controller Board findet man
' unter www.robotikhardware.de als auch im
' www.roboternetz.de
'
' Dieses Demo läßtz eine LED in dem von ihnen gewählten
' Timer-Rhytmus blinken
' Der generierte Code kann direkt in den Bascom-Compiler kopiert
' und kompiliert werden. Natürlich läßt sich der Code auch in
' bestehende Programme integrieren

' Autor: Frank
' Weitere Beispiele und Beschreibung der Hardware
' unter http://www.Roboternetz.de oder robotikhardware.de
' Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'##############################################################



'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 = 3686400

'nur notwendig wenn rs232 benutzt werden soll
$baud = 9600

'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 = 223


'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 ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
   Toggle Led3

   Return



Eigender Code mit 1745HZ
####################################


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 57600
'-----------------------------------------------------------------------
Config Pind.5 = Output                                      '
Lautsprecher
Speaker Alias Portd.5

'----------------------------------------------------------
' Timer0 8 Bit  (1745 Hz)    Timer Preload = 132
' ##############################################
On Timer0 Ontimer0
Config Timer0 = Timer , Prescale = 8

Enable Timer0
'-------------------------------------------------------------
'Start Timer0
'Stop  Timer0

Enable Interrupts


Do
'Hauptschleife
Loop

End

Ontimer0:
    Toggle Speaker
    Timer0 = 132
Return

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1750 HZ, sondern 873HZ

873 ist ungefähr die Hälfte von 1750.

Wenn du den Ausgang toggelst brauchst du 2 Interrupts um eine
komplette Schwingung zu erhalten. Daher: ungefähr die Hälfte.

Warum du nicht exakt die Hälfte kriegst?
Weil vom Zeitpunkt an dem der Interrupt auftritt, bis zu
dem Zeitpunkt an dem du den Timer neu setzt ebenfalls Zeit
vergeht. Diese Zeit hast du aber nicht eingerechnet. Daher
stimmt dein Timing nicht.

Autor: katus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wirds sein, vielen Dank.

Gibt es noch bessere Möglichkeiten einen solchen Ton zu erzeugen?

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besser inwiefern? Du kannst einen DDS-Schaltkreis benutzen
(www.analog.com), lohnt sich aber hier wohl kaum.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten funzt alles? Du schreibst oben von einem Mega8 und hast im
Programm die m16def.inc drin...

Autor: katus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA, ansonsten geht alles , das mir der m16def war nur ein versehen.
Also ich verstehe das nun so:

DAs Programm RnAVR berechnet die Anzahl der Interrupts pro Sekunde, und
nicht meine eigentliche Tonfreqenz.

Vielen Dank für die Tips

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.