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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren