Hallo,
die alte Melodieklingel aus DDR Zeiten mit U880 hat schlapp gemacht.
Also hab ich mich nach einem Ersatz hier im Forum umgeschaut und diesen
Artikel Beitrag "Klingel mit 100 Melodien - last minute Weihnachtsgeschenk" gefunden.
Nichts leichter als das und die ganze Sache nachgebaut.
Leider ist der Klang nicht so gut wie bei der Variante mit dem U880 :(
Woran liegt das? Das Prinzip ist doch im Grunde das gleiche oder? Ein
Timer der nach einer gewissen Zeit also je nach benötigter Frequenz
immer den Ausgangspin toggelt.
Wie ließe sich das ganze mit PWM realisieren?
Müsste ja im Grunde so sein das ein Interrupt regelmaßig (Tonfrequenz)
ausgeführt wird und auf einer Sinustabelle einen Schritt weiter geht.
Der zweite Timer nimmt den Sinuswert als Tastgrad für die PWM.
Hat da jemand ein paar C-Code Schnipsel damit ich irgendwo aufsetzen
kann? Gerade die Einstellungen der Timer würden mich interessieren.
Bacchus schrieb:> Das Prinzip ist doch im Grunde das gleiche oder?
Jein. Beim DDR-MELO4 wird die Frequenz noch mit einem FF halbiert.
Dadurch erzeugt man so eine Art Mini-Akkord.
> die alte Melodieklingel aus DDR Zeiten mit U880 hat schlapp gemacht.
Und das kann man nicht reparieren?
Abgesehen vom Stromverbrauch und der Größe, kann man doch bei dem Ding
nicht meckern...
Jens
> Hat da jemand ein paar C-Code Schnipsel damit ich irgendwo aufsetzen kann?
Ich würd an deiner Stelle mal kleinere Brötchen backen.
Einfach nur mittels _delay_ms den Pin toggeln lassen.
1
#define F_CPU 8000000 // aber nur wenn du CKDIV8 ausgeschaltet hast!
2
3
#include<avr/io.h>
4
#include<util/delay.h>
5
6
intmain()
7
{
8
DDRB=(1<<PB1);
9
10
while(1){
11
PORTB|=(1<<PB1);
12
_delay_ms(1);
13
PORTB&=~(1<<PB1);
14
_delay_ms(1);
15
}
16
}
wenn die Hardware grundsätzlich in Ordnung ist UND die Taktfrequenz
stimmt, dann trötet dir der µC was vor. Hört sich zwar grauenhaft an
aber ist immerhin ein erster Funktionstest
Edit:
die 1ms kommen so zu stande.
Der Kammerton A hat eine Frequenz von 440Hz. Kehrwert davon macht rund
0.00227. Die Hälfte davon (weil ja einmal ein UND aus eine komplette
Schwingun ergeben) sind ungefähr, über den Daumen 1ms. D.h. den Ton
sollte man hören und er sollte in etwa im mittleren Hörbereich liegen.
@Nils: Ich habe versucht die PWM Funktionalität mit einzubauen
@Jens: Ah ok danke für die Info!
Das Problem scheint mir der EPROM zu sein. Klar könnte man einen neuen
einsetzen aber man kann ja auch mal was neues probieren ;)
Grundsätzlich nochmal: Das mit dem Pintoggeln habe ich bereits
ausprobiert und es funktioniert wunderbar. Fuses sind alle richtig
gesetzt. Programmcode habe ich verstanden.
Es geht mir jetzt um die Optimierung!
Bacchus schrieb:>> Es geht mir jetzt um die Optimierung!
Wen interessiert Optimieiung solange ... Zitat Ereöffnungsposting
> Laut Simulation tut es auch was es soll aber in echt kommt kein Ton raus...
Wenn nichts raus kommt, brauchst du nichts optimieren sondern musst den
Fehler finden und beheben.
FAQ: Timer
(Wobei ich persönlich als erstes mal die Registerbindung der Variablen
aufheben würde. Ich leg mich doch nicht mit dem Compiler an, welche
Register er nicht benutzen kann. 256 Bytes SRAM sind zwar nicht viel,
reicht aber für die halbe Handvoll Variablen alle mal.)
Karl Heinz schrieb:> Wenn nichts raus kommt, brauchst du nichts optimieren sondern musst den> Fehler finden und beheben.>> FAQ: Timer
Und azu würde ich dann trotzdem wieder bei der einfachen Variante
anfangen und die _delay_ms Geschichte rauswerfen, den Timer
konfigurieren und dann den alle 1ms den Pin toggeln lassen.
So führt eines zum anderen.
Du baust dann zwar das Programm im Grunde wieder neu auf, hast aber den
Vorteil, dass du auch verstehst was du da tust.
Also nochmal für dich Karl Heinz zur Erklärung:
Ich habe das Projekt aus dem anderen Mikrocontroller Beitrag genommen
und umgesetzt. Hat alles wunderbar funktioniert. Nun finde ich aber,
dass die Klingel noch schöner klingen könnte (Stichwort Optimierung).
Ich habe mich also ran gemacht und das bestehende Projekt nach meinen
Überlegungen umgeschrieben. Ich suche zurzeit also tatsächlich nur nach
dem Fehler.