:AVR: Musik mit PiezoschallwandlerMIttels eines ATtiny2313 soll mit einem Piezoschallwandler Musik erzeugt werden werden. Dazu wird der 16-bit Timer/Counter1 mit Pulsweitenmodularor PWM verwendet. [ ATtiny2313] Seite 88ff.

Im ersten Schritt soll der Piezoschallwandler ein symetrisches Rechtecksignal im Bereich von 1-6 kHz bekommen. Die Möglichkeit komplexere Signale zu erzeugen soll offen gehalten werden.
1 kHz bedeutet 500µs an und 500µs aus. 10 kHz bedeutet 50µs an und 50µs aus. Der Timer wird daher mit 1 MHz, dem Systemtakt getaktet.
Gewählt 1 MHz mit Vorteiler 1:1.
Betriebsart Fast PWM Mode siehe Seite 98ff. Der Timer zählt von 0 bis zu einem einstellbaren TOP Wert und springt dann wieder auf 0. Ein Ausgang kann beim Sprung von TOP auf 0 gesetzt und bei Erreichen eines einstellbaren Wertes OCR1A wieder rückgesetzt werden.
OCR1A als TOP. OCR1B als Pulsweite. Ausgang ist PB4 (OC1B).
| Register | Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Beschreibung |
|---|---|---|---|---|---|---|---|---|---|---|
| TCCR1A | Bedeutung | COM1A1 | COM1A0 | COM1B1 | COM1B0 | FOC1A | FOC1B | WGM11 | WGM10 | Ausgang OC1B bei 0 setzen und bei OCR1B löschen |
| Wert | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
Waveform Generation Mode: Fast PWM mit OCR1A als TOP |
|
| TCCR1B | Bedeutung | ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 | |
| Wert | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | Keine Vorteilung Timer mit CPU-CLK (No prescaling) | |
| TIMSK | Bedeutung | TOIE1 | OCIE1A | OCIE1B | - | ICIE1 | OCIE0B | TOIE0 | OCIE0A | Keine Interrups notwendig |
| Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
![]() |
![]() |
|
|||||||||||||||||||||||||
| Piezoschallwandler | ATtiny2313 | STK200 I/O Port B |
|---|
#include <avr/io.h>
int main(){
DDRB = 0b00010000; // PB4 als Ausgang
TCCR1A = 0b00100011; // Ausgang OC1B bei 0 setzen und bei OCR1B loeschen
TCCR1B = 0b00011001; // Waveform Generation Mode: Fast PWM it OCR1A als Top, Timer mit CPU-CLK
OCR1A = 1000; // Timer 1ms
OCR1B = 500; // Impulslaenge 500us
while (1); // Endlosschleife
}
| Quellcode [Quellcode] |
|---|
// *** Piepser V1.0 (c) Oliver Mezger 16.9.2010 |
Eine Tabelle mit den Tonhöhen finden wir auf Wikipedia. Fluchs eine Tabelle erstellt:
| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ton | c' | cis' | d' | es' | e' | f' | fis' | g' | as' | a' | b' | h' | c'' | cis'' | d'' | es'' | e'' | f'' | fis'' | g'' | as'' | a'' | b'' | h'' |
| Frequenz | 264 | 275 | 297 | 317 | 330 | 352 | 367 | 396 | 422 | 440 | 475 | 495 | 528 | 550 | 594 | .. | ||||||||
| Solmisation | Do | Re | Mi | Fa | So | La | Ti |

Die Tonhöhen und die Melodie werden im Flash-ROM abgelegt.
| Quellcode [Quellcode] |
|---|
; *** PiepserAsm 0.6 (c) Oliver Mezger 12.10.2010
|
Die const-Felder werden im Ram abgelegt und ist dadurch beinahe voll, leider ist der erste Versuch mittels PROGMEM die Daten im Flash zu speichern und wieder zu lesen gescheitert [Data in Program Space] . Bei der Tonerzeugung wird eine Hüllkurve verwendet. Wenn in _delay_ms() keine Konstante eingetragen wird steigt der RAM-Bedarf damatisch an, daher der Work-Around mit der For-Schleife.
Ich beginne den AVR-C-Compiler zu hassen, er ist erschreckend dumm und fabriziert unerwarteten und fehlerhaften Maschienencode -Werkzeug mit Tücken! [AVR Toolchain Bugs]
Weiter gehts mit Daten im Flash: [Programmspeicher (Flash)] [Zugriff string Konstante im PROGMEM eleganterer, einfacherer Weg?]
| Quellcode [Quellcode] |
|---|
// *** Melodie V1.0 (c) Oliver Mezger 12.10.2010 *** |
| Quellcode [Quellcode] |
|---|
// *** Piepser V1.1 (c) Oliver Mezger 12.10.2010 *** |