ich möchte ein Ereignis - Beendigung eines Backvorgangs - akustisch
anzeigen. Dem Ereignisangemessen wäre eine kleine Fanfare, z.B.
verkürzter Walkürenritt. Dafür suche ich einen einfachen Tongenerator.
Ich habe bislang:
1 | main(){
|
2 | ...
|
3 | #if 01
|
4 | #define wait _delay_ms(20);
|
5 | soundtimer=10000;
|
6 | while(1){
|
7 | wait;pwm_sound_on(10);//2778
|
8 | wait;pwm_sound_off();
|
9 | wait;pwm_sound_on(20);//1562
|
10 | wait;pwm_sound_off();
|
11 | wait;pwm_sound_on(30);//1000
|
12 | wait;pwm_sound_off();
|
13 | wait;pwm_sound_on(40);//780
|
14 | wait;pwm_sound_off();
|
15 | wait;pwm_sound_on(50);//610
|
16 | wait;pwm_sound_off();
|
17 | wait;pwm_sound_on(60);//510
|
18 | wait;pwm_sound_off();
|
19 | wait;pwm_sound_on(70);//446
|
20 | wait;pwm_sound_off();
|
21 | wait;pwm_sound_on(80);//390
|
22 | wait;pwm_sound_off();
|
23 | wait;pwm_sound_on(90);//347
|
24 | wait;pwm_sound_off();
|
25 | wait;pwm_sound_on(100);//312
|
26 | wait;pwm_sound_off();
|
27 | wait;pwm_sound_on(120);//260
|
28 | wait;pwm_sound_off();
|
29 | wait;pwm_sound_on(130);//242
|
30 | wait;pwm_sound_off();
|
31 | wait;pwm_sound_on(140);//225
|
32 | wait;pwm_sound_off();
|
33 | wait;pwm_sound_on(150);//208
|
34 | wait;pwm_sound_off();
|
35 | wait;pwm_sound_on(200);//156
|
36 | wait;pwm_sound_off();
|
37 | wait;pwm_sound_on(250);//125
|
38 | wait;pwm_sound_off();
|
39 | wait;pwm_sound_on(254);//124
|
40 | wait;pwm_sound_off();
|
41 | wait;pwm_sound_on(255);//123
|
42 | wait;pwm_sound_off();
|
43 | _delay_ms(1000);
|
44 |
|
45 | }
|
46 |
|
47 |
|
48 | #else
|
49 | pwm_sound_on(110);
|
50 | soundtimer=2;
|
51 | #endif
|
52 |
|
53 | ...
|
54 | }
|
55 |
|
56 |
|
57 |
|
58 |
|
59 | void pwm_sound_on(u8 ton){
|
60 | /*
|
61 | cs02+01+00:
|
62 | 0 no clock
|
63 | 1 no presc
|
64 | 2 /8
|
65 | 3 /64
|
66 | 4 /256
|
67 | 5 /1024
|
68 | */
|
69 |
|
70 | TCCR2A |= (1<<WGM21);
|
71 | // 1; Timer0 Vorteiler: 64 -> bei 16 MHz:
|
72 | // 16.000.000 / 64 = 250000 Mal pro Sek gibts einen Takt an den Timer
|
73 | // 8.000.000 / 1024 = 7812 Mal pro Sek gibts einen Takt an den Timer
|
74 |
|
75 | TCCR2B |= ((1<<CS22)|(1<<CS20));//1024
|
76 |
|
77 | // Timer0 soll bei 250 einen Output Compare Interrupt ausl?sen ->
|
78 | // 250.000 / 250 = 1000 mal pro Sek gibts einen Interrupt
|
79 | // 7812 /78 = 100 mal pro Sek gibts einen Interrupt
|
80 | OCR2A = ton;//189;//30ms
|
81 |
|
82 | //Compare Interrupt aktivieren
|
83 | TIMSK2 |= (1<<OCIE2A);
|
84 |
|
85 | //Globale Interrupts aktivieren
|
86 | sei();
|
87 |
|
88 |
|
89 | }
|
90 |
|
91 | void pwm_sound_off(void){
|
92 | TCCR2A =0;
|
93 | TCCR2B=0;
|
94 | TIMSK2 &= ~(1<<OCIE2A);
|
95 | }
|
Die Frequenzen sind mit dem la ausgemessen. Müsste jetzt Tonleiternoten
zugeordnet werden. Bevor das ganze in Arbeit ausartet, hat jemand
irgendetwas brauchbares Fertiges für avr?
Danke für Unterstützung