Alle Jahre wieder rieselt der Schnee leise auf Rudolf den rotnasigen
Weihnachtsbaum (oder so ähnlich)!
Für eine Weihnachtsbastelei (wie alle Jahre wieder) brauchte ich einen
"Melody-Player".
Mein bisherig verwendete Timer1 (welch Verschwendung), und den benötige
ich nun für anderes.
Also muß 8-Bit Timer0 herhalten. Zu meinem Erschrecken (ich habe mit dem
alten ATmega8 lange nichts gemacht) hat dieser keinen Compare-Match auf
Timer0. (sollte ich mich hier irren und ich bin blind durchs Datenblatt
gelatscht, bitte ich um Korrektur)
Damit der Melody-Player auf so ziemlich allen AVR's läuft habe ich das
nun im
8-Bit Overflow Modus
gelöst und hoffe, dass ich das nicht noch einmal machen muß (für welche
Bastelei auch immer).
Der Melody-Player wurde getestet auf:
ATtiny13, ATtiny2313, ATtiny44 / 84, ATtiny45 / 85, ATmega8, ATmega88,
ATmega168 und ATmega328p.
Die benutzbaren Taktfrequenzen sind:
4,8MHz; 8MHz; 9,6MHz, 16MHz
Der Melody-Player spielt einen String, der die zu spielenden Noten
enthält.
Dieser "Notenparser" versteht folgende Zeichen:
Buchstaben c d e f g a h sowie C D F G A gefolgt von einer numerischen
Ziffer.
Hierbei stellen die Buchstaben die zu spielende Note dar und die Ziffer
die Tonlänge. Die Großbuchstaben sind hierbei Cis, Dis, Fis, Gis, Ais
Bsp.
a2 : spielt eine halbe Note "a"
C4 : spielt eine viertelnote "C"
Eine Besonderheit ist (weil mir die Ziffern ausgegangen sind) die Ziffer
9. Diese spielt (abweichend von der sonstigen Notation) eine sechzehntel
Note.
Das + Zeichen erhöht die zu spielende Oktave, - Zeichen vermindert die
zu spielende Oktave.
Buchstabe "p" gefolgt von einer Ziffer fügt eine Pause mit der
Notenlänge der Ziffer ein.
p2 : fügt eine Pause mit der Dauer einer halben Note ein.
------------------------------------------------------------
Die Frequenzen wurden mittels eines Libre-Office Calc Sheets ermittelt.
Hier würde ich für eine Rückmeldung dankbar sein, ob dieses auch in
Excel funktioniert, besonders die Berechnung der Abweichung von der
gewünschten Frequenz.
Mit dieser Tabellenkalkulation kann der Melody-Player an andere
CPU-Frequenzen angepasst werden.
Innerhalb des Headers toene_melodie.h ist die Angabe zu machen, an
welchen Portpin der Lautsprecher angeschlossen ist:
1 | // -------------- Lautsprecheranschluss ---------------------
|
2 | #define speaker_port B
|
3 | #define speaker_portnum 4
|
Aktuell ist hier Portpin PB4 (für die 8-poligen ATtinys) eingestellt.
toene_melodie.c beinhaltet eine globale Variable:
volatile uint8_t sound
Diese Variable wird im Interrupt ausgewertet. Mit ihr kann die
Frequenzerzeugung an- oder ausgeschaltet werden:
sound = 0; // Ton aus
sound = 1; // Ton an
uint16_t playtempo= 5;
Diese Variable bestimmt die grundsätzliche Geschwindigkeit, mit der ein
Notenstring abgespielt wird.
Makro von toene_melodie.h
-------------------------
speaker_init();
Initialisiert den im Kopf der Datei angegebenen Portpin als Ausgang
Funktionen von toene_melodie.c
------------------------------
void timer0_init(void);
Initialisiert den Timer0 als 8-Bit
void playnote(char note);
schaltet den Ton ein und spielt die angegebene Note solange, bis sie
durch
sound= 0;
wieder abgeschaltet wird
void playstring(const unsigned char* const s);
spielt einen Notenstring, der im Codespeicher abgelegt sein muß.
Bsp.
1 | const uint8_t tonleiter[] PROGMEM = { "c4 d4 e4 f4 g4 a4 h4 + c4" }
|
2 | .
|
3 | .
|
4 | .
|
5 | playstring(&tonleiter[0]);
|
------------------------------------
Beispiel für den Anschluss eines Lautsprechers:
1 | +Ub
|
2 | ^
|
3 | |
|
4 | ,-,
|
5 | | | 16 - 390 ( je nach gewuenschter Lautstaerke )
|
6 | '-'
|
7 | |
|
8 | |
|
9 | ,-,/|
|
10 | | | |
|
11 | '-'\|
|
12 | |
|
13 | 2,2k |
|
14 | ___ |/
|
15 | o-------|___|----| BC549
|
16 | Input |>
|
17 | von Portpin |
|
18 | |
|
19 | |
|
20 | |
|
21 | ---
|
Viel Spaß beim Noten zusammenbasteln und schöne Vorweihnachtszeit.