web - xeroc - org
CSS-Design version ....|

AVR Midi Player

Eigentlich nur zum Spaß habe ich mir bei meiner letzten Bestellung einen Piezosummer mitbestellt. Klar müsste man den irgendwie zum Klingen bekommen, jedoch hat sich das ganze doch als etwas schwieriger herausgestellt. Es gibt keinen kleinen Beispielquelltext, an dem man sich das ganze verdeutlichen konnte. Auch die Quellen von avrsound waren nur bedingt nützlich, da der Author selbst nicht genau wusste was er tat.

Jedenfalls war das für mich Anlass genug, um mich selbst daran zu versuchen. Ich habe dafür einen ATtiny2313 genommen, da er nicht sehr viel mehr Funktionalität hat als nötig. Falls ein anderer Mikrocontroller eingesetzt werden soll, müssen die Register (in der main-Funktion) eventuell angepasst werden.

Creative Commons-Lizenzvertrag

Design, Inhalte und Grafiken sind unter einer Creative Commons-Lizenz lizenziert.

Was genau tut der Code also:
Zeile 1-15
Kopfdefinitionen. Sie dienen zum Einbinden der nötigen Bibliotheken und Quellen (1-5). Die Datei sound.h beinhält eine Definition der einzelnen Tonhöhen zur Ansteuerung des PWM Generators. Der Rest (6-15) sollte selbsterklärend sein.
Zeile 16-23
Das Lied. Man könnte es optional auch im EEPROM speichern. Das erste Zeichen eines Dubels ist die Dauer des Tones, das zweite ist definiert in der Datei sound.h ist ezeichnet die Tonhöhe.
Zeile 25-30
Ein paar Variablen die gebraucht werden. Der Zeiger Song zeigt auf den Anfang des Liedes. Volume, Duration und Tempo sind selbsterklärend. Die Variable Tone ist ein Schrittzähler, der für jeden Ton der gespielt oder gehalten wurde inkrementiert.
Zeile 25-38
Der Timer wird so eingestellt, dass er im Tempo des Liedes für jeden Schlag (im rhythmischen Sinne) diesen Interrupt ausruft.
Zeile 42-52
Bei jedem rhythmischen Schlag wird die Funtion Play_Tune() aufgerufen. Sie prüft zu Beginn, ob das Lied bereits begonnen hat und setzt gegebenenfalls die Zähler Tone und Duration auf 0 zuück.
Zeile 53-54
Soll der eine, gerade klingende Ton ausgehalten werden, so wird Duration dekrementiert und der Rest übersprungen.
Zeile 55-71
Sollte der nächste Ton von 0 verschieden sein, so werden zwei Bytes aus dem Speicher gelesen. Das erste steht für die Dauer des Tons, das zweite für die Tonhöhe. Sollte die Tonhöe dem Zeichen P entsprechen wirde der Timer angehalten und das Programm wartet auf einen manuellen Interrupt. Ansonsten wird dem PWM Generator die Frequenz des aktuellen Tones mitgeteilt und der Tonzähler inkrementiert.
Zeile 72-85
Sollte das Programm beim vorlestzen Zeichen des Liedes (immer eine Null) angekommen sein, so wird das letzte Zeichen gelesen und das Lied wiederholt, wenn es eine 1 ist. Andernfalls wird der Timer daktiviert.
Zeile 90-132
Die main-Funktion. Hier werden Variablen definiert, alle Zähler zurückgesetzt und beide Timer konfigueriert. Zu beachten ist, das der Timer 0 für die Taktgabe und Timer 1 als PWM Generator fungieren. Die genauen Register sollten im Datenblatt nachgelesen werden.