Forum: Mikrocontroller und Digitale Elektronik Tonleiter erzeugen


von Michael 0. (Gast)


Lesenswert?

Hallo,
ich möchte mit meinem 90s4433 ein hübsche tonleiter erzeugen, kann mir 
da jemand mit dem asm-code und bei der verstärkerschaltung für ein 
kleinen lautsprecher weiterhelfen?
danke.

von Werner Hoch (Gast)


Lesenswert?

Hallo Michael,

kannst du noch mehr zu deinen Anforderungen sagen.

Soll das Ausgangssignal Sinus sein oder reicht dir ein Rechteck?

Für Sinus kannst du dir mal das DDS-Projekt unter Projekte anschauen und 
passend abändern.

Hast du die Frequenzen schon für deine Tonleiter?

440Hz ->Kammerton a
danach mit dem Multiplikator 2^(1/12) in Halbtonschritten nach oben.

mfg
werner

von Michael 0. (Gast)


Lesenswert?

Naja ich hab nich viel ahnung von sinus und rechteck signalen, was ist 
denn da der unterschied?
Ich wollte nur am ausgang meines µC nen lautsprecher anschliessen der 
dann die töne wiedergibt, so wie beim internen lautsprecher im pc 
gehäuse.
Aber ich brauch da irgendwie noch eine verstärkerschaltung weil hab 
schon mal rumexperimentiert und da war der ton ganz leise. Vielleicht 
war aber auch nur mein programm falsch.

von Werner Hoch (Gast)


Lesenswert?

Der Unterschied von Sinus und Rechteck ist der Klang.

Aber laß dir doch nicht alles aus der Nase ziehen,
wie weit bist du den schon gekommen?

Einzelnen leisen Ton erzeugen?
leise Tonleiter erzeugen?

du kannst ja ggf. den Code anhängen.

einfache Verstärkerschaltung:

                 5V
                  |
                  C
uC_pin------R1----B
                  E
                  |
                  +----C1----lautsprecher--+
                  |                        |
                  R2                      Masse
                  |
                Masse


R1=1k
R2=50Ohm
C1=möglichst groß

CBE ist ein NPN-Transistor

mfg
werner

von Michael 0. (Gast)


Lesenswert?

Danke erstmal das du mir so schnell antwortest.
Also das ist der code, is noch nicht viel:

.include "4433def.inc"
.def temp = r16

         ldi temp, RAMEND
         out SPL, temp

         ldi r16, 0xFF
         out DDRB, r16

loop:
  ldi r16, 0b11111110
        out PORTB, r16
  rcall PAUSE
  ldi r16, 0b11111111
        out PORTB, r16
  rcall PAUSE
        rjmp loop


PAUSE:

          ldi  R17, $09
WGLOOP0:  ldi  R18, $6E
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0

          ldi  R17, $01
WGLOOP2:  dec  R17
          brne WGLOOP2
ret

Also der schalten einfach den ersten ausgang von B abwechselnd auf high 
und low, mit einer kleinen verzögerung dazwischen. Wobei ich auch nicht 
weise ob die Pause schleife ne richtige lösung, hab ich aus dem 
DelayProgramm, der sollche schleifen erzeugt mit einer bestimmten 
wartezeit.
Sozusagen hab ich es bis jetzt nur geschafft einen leisen piepton zu 
erzeugen.

von Werner Hoch (Gast)


Angehängte Dateien:

Lesenswert?

Also ich hab das mal kurz abgetippt:

Das Programm holt sich jeweils die Wartezeit=Impulsdauer=Pausendauer aus 
dem Speicher.
Dann werden jeweils 1000 gleiche Perioden ausgegeben.
Dann wird der nächste Ton geholt usw.

Ich hoffe der Code ist einigermaßen lesbar.

Ich hab das Programm nicht getestet, hoffe aber das es läuft.

Die Tonfolge wird in Abhängigkeit von der Tonhöhe immer schneller, die 
Korrektur überlass ich dir.

Für einen Musiker wird sich die Tonfolge aufgrund von Rundungsfehlern 
ziemlich schrecklich anhören.

Die Lautstärke hat natürlich nichts mit dem Programm zu tun, aber ich 
denke das ist dir auch klar.

mfg
werner
PS: ich würde das Programm anders zusammenbauen, aber ich wollte hier 
nichts überstürtzen.

von Werner Hoch (Gast)


Angehängte Dateien:

Lesenswert?

ach du schei....

das Programm enthält einen bösen und einen kleinen Fehler:

- Der Startpointer muß natürlich tonleiter*2 sein.

- beim 2. Durchlauf ist R0=0 => Ton=256 anstatt 254


mfg
werner

von Michael 0. (Gast)


Lesenswert?

Danke,
es funktioniert, hab nur zwei kleine probleme.
Wenn ich die verstärkerschaltung so baue, wie du sie mir oben aufgemalt 
hast, dann ändert sich die lautstärke nich, wenn ich allerding den 
kondensator weglasse (hab nen 100µF benutzt) ist es zwar lauter aber 
mein spannungsregler IC wird sehr heiss.
Das zweite problem ist das die töne sich richtig gut anhörn aber immer 
so ein anderer ton drauf liegt, wie ein brummen.
Ist es irgendwie möglich so ein richtig sauberen ton, wie bei einer 
Armbanduhr zu erzeugen, wenn die zum beispiel piep wenn der alarm 
losgeht?

von Werner Hoch (Gast)


Lesenswert?

Mir scheint, dein Lautsprecher ist niederohmiger als ich dachte.

Für den Fall daß der Lautsprecher nur 8 oder gar 4Ohm hat, mußt du die 
beiden Widerstände verkleinern.

Im Idealfall ist dann R1 kleiner als die Lautsprecherimpedanz.

Der Kondensator ist noch etwas klein, sollte aber gehen.

Den Kondensator darf man aber nicht weglassen, dieser filtert den 
DC-Strom aus.

Der Spannungsregler wird wegen des DC-Stromes heiß.

mfg
werner

von jjjjjjjjjjjjjjjjooooo (Gast)


Lesenswert?

a bissle schlecht

von The D. (devil_86)


Lesenswert?

Was soll denn diese 'Alte-Thread-Ausgraberei'??

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.