Tonerzeugung unter BASCOM und AT90S2313

Gast #48474
Lesenswert?
• ▲
▼
Hallo,
Ich beschäftige mich seit kurzem mit dem AT90S2313 (4Mhz Quarz) und
versuche ihm mit Bascom Intelligenz einzuhauchen (div.Blink
u.Lc-Anzeige liegen hintermir).
Mich interessiert nun die Tonerzeugung, d.h wie kann ich z.B 440Hz
(a-Ton) oder 1Khz genau erzeugen (Tonleiter). Der Sound-Befehl ist ja
recht ungenau und wie der Timer mit Vorteiler(das "krumme" Frequenzen
herauskommen) usw.programmiert wird ist mir nicht klar.Wer hat einen
Tip für mich ? Das kpl. Programm für die AVR-Klingel" ist einfach zu
mächtig für mich trotz Kommentare.
Gruß Max.
Gast #48475
Lesenswert?
• ▲
▼
Hallo,

also einen ton erzeugst du indem du an dem pin an dem dein lautsprecher
angeschlossen ist in bestimmten abstaenden auf 1 und 0 setzt. Wenn du
in einer Sekunde den pin auf 1 und dann wieder auf null setzt hast du
ein Hertz. Jetzt musst du zwischen den Befehlen die den pin auf 1 oder
0 setzten, sbi oder cbi, noch warteschleifen einbauen. Du hast deinen
4MHz Quarz also 4 Millionen takte pro sekunde. Um 1KHz zu erseugen
brauchst du eine warteschleife von 2000 Takten zwischen den befahlen
sbi und cbi. Wenn du die warteschleife aenderst aender sich die
frequenz. Die laenge des Tons kannst du beeinflussen indem du eine
warteschleife um deine ganze procedure herum setzt. Siehe Beispiel:

ton:  mov tonlaenge,temp1    ;Tonlaenge (fequenz*sekunden/40)
        mov tonhoehe,temp2    ;Tonhoehe (1=10KHz,10=1KHz,100=100Hz,
255=39.2Hz)
        ldi temp3,0b01000001
  ldi temp4,0b00101000

an:  sbi portb,0
Zeit1:  dec temp3
  brne Zeit1
  ldi temp3,0b01000001
  dec tonhoehe
  brne Zeit1
  mov tonhoehe,temp2

aus:  cbi portb,0
Zeit2:  dec temp3
  brne Zeit2
  ldi temp3,0b01000001
  dec tonhoehe
  brne Zeit2
  mov tonhoehe,temp2

  dec temp4
  brne an
  ldi temp4,0b00101000
  dec tonlaenge
  brne an

Das einzige problem hier ist das man den 10KHz ton maximal 1s erzeugen
kann. Das kann man aber mit ein paar kleinen modifikationen aendern.

Viele Gruesse Anton
Gast #48477
Lesenswert?
• ▲
▼
sorry... hatte übersehen das du das schon getestet hattest.

wenn der ton sehr genau produziert werden soll, bleibt dir nur die wahl
eine timer mit config entsprechend deiner vorgaben einzurichten
und in der isr dann je nach ton eine ausgangspin zu setzen oder
zurückzusetzen. die "auflösung" bzw. genauigkeit hängt also direkt
von
der zeit zwischen zwei isr-aufrufen ab.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.