Forum: Mikrocontroller und Digitale Elektronik Tonerzeugung unter BASCOM und AT90S2313


von Max Fischer (Gast)


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.

von Anton Trojosky (Gast)


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

von Peter Wilbert (Gast)


Lesenswert?

man könnte auch einfach die sound-anweisung benutzen...

sound pin, duration, pulses 'ist etwas einfacher oder ???

gruß peter

von Peter Wilbert (Gast)


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.

von Max Fischer (Gast)


Lesenswert?

Hallo,
danke erstmal für die Antworten.
Ich komme erst heute zum Antworten, vielleicht hättest Du auch ein
Beispiel in BASCOM für mich ?
Gruß Max

von Anton Trojosky (Gast)


Lesenswert?

Hallo,
sorry, aber ich habe keine Ahnung wie das unter BASCOM geht, kann dir
leider nur die Funktionsweise unter Assembler sagen.

Gruss Anton

von Seeker (Gast)


Lesenswert?

hallo max!
hast du nach jahren endlich herausgefunden, wie man es machen könnte?
ich würde sagen mit timern. hast du evtl. entsprechenden bascom-code
parat?

bye!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.