Mikrocontroller und Digitale Elektronik
›
Thread
Melodiengenerator? Hilfe, wie geht das !!!
T
Tomi
Gast
22.06.2007 14:50
#587867
hi leute,
habe eine aufgabe zu löse.
könnte mir da jemand helfen dass programm zu erstellen.
es geht um einen melodiengenerator.
hier die aufgabenstellung:
"Programmieren Sie einen Melodiengenerator, der acht in Tabellen
festgelegte Melodien abspielt, indem mit drei
Tasten eine Kombination gedrückt wird. Alle Melodien sollen bekannt,
erkennbar und dokumentiert sein."
also es würde reichen wenn es mit einer melodie klappen würde.
das programm wird im avr4 geschrieben.
als platine wird das atmega88 genutzt.
BITTE um HILFE !
gruß
tomi
I
Ing-Dom
(sirsydom)
(Firma: OpenKNX)
22.06.2007 14:57
#587876
ich hab das mal mit nem atmega32 gemacht, interrupt gesteuert:
Code : music.h 1 #define TONE_C 654
2 #define TONE_CIS 693
3 #define TONE_DES 693
4 #define TONE_D 734
5 #define TONE_DIS 778
6 #define TONE_ES 778
7 #define TONE_E 824
8 #define TONE_F 873
9 #define TONE_FIS 925
10 #define TONE_GES 925
11 #define TONE_G 980
12 #define TONE_GIS 1038
13 #define TONE_AS 1038
14 #define TONE_A 1100
15 #define TONE_AIS 1165
16 #define TONE_B 1165
17 #define TONE_H 1235
18 #define TONE_c 1308
19 #define TONE_cis 1386
20 #define TONE_des 1386
21 #define TONE_d 1468
22 #define TONE_dis 1556
23 #define TONE_es 1556
24 #define TONE_e 1648
25 #define TONE_f 1746
26 #define TONE_fis 1850
27 #define TONE_ges 1850
28 #define TONE_g 1960
29 #define TONE_gis 2077
30 #define TONE_as 2077
31 #define TONE_a 2200
32 #define TONE_ais 2331
33 #define TONE_b 2331
34 #define TONE_h 2469
35 #define TONE_c1 2616
36 #define TONE_cis1 2772
37 #define TONE_des1 2772
38 #define TONE_d1 2937
39 #define TONE_dis1 3111
40 #define TONE_es1 3111
41 #define TONE_e1 3296
42 #define TONE_f1 3492
43 #define TONE_fis1 3700
44 #define TONE_ges1 3700
45 #define TONE_g1 3920
46 #define TONE_gis1 4153
47 #define TONE_as1 4153
48 #define TONE_a1 4400
49 #define TONE_ais1 4662
50 #define TONE_b1 4662
51 #define TONE_h1 4939
52 #define TONE_c2 5233
53 #define TONE_cis2 5544
54 #define TONE_des2 5544
55 #define TONE_d2 5874
56 #define TONE_dis2 6223
57 #define TONE_es2 6223
58 #define TONE_e2 6593
59 #define TONE_f2 6985
60 #define TONE_fis2 7400
61 #define TONE_ges2 7400
62 #define TONE_g2 7840
63 #define TONE_gis2 8306
64 #define TONE_as2 8306
65 #define TONE_a2 8800
66 #define TONE_ais2 9324
67 #define TONE_b2 9324
68 #define TONE_h2 9878
69 #define TONE_c3 10465
70 #define TONE_cis3 11087
71 #define TONE_des3 11087
72 #define TONE_d3 11747
73 #define TONE_dis3 12445
74 #define TONE_es3 12445
75 #define TONE_e3 13185
76 #define TONE_f3 13969
77 #define TONE_fis3 14800
78 #define TONE_ges3 14800
79 #define TONE_g3 15680
80 #define TONE_gis3 16612
81 #define TONE_as3 16612
82 #define TONE_a3 17600
83 #define TONE_ais3 18647
84 #define TONE_b3 18647
85 #define TONE_h3 19755
Code music.c : 1 #include <avr/io.h>
2 #include <avr/interrupt.h>
3 #include "music.h"
4
5 #define PAUSE 10
6
7 unsigned int speed = 1500 ;
8 int pause = PAUSE ;
9 unsigned int count = 0 ;
10 unsigned int pos = 0 ;
11 unsigned int melody1 [ 27 ][ 2 ] = {
12 { TONE_g1 , 8 },
13 { TONE_g1 , 8 },
14 { TONE_a1 , 4 },
15 { TONE_g1 , 4 },
16 { TONE_c2 , 4 },
17 { TONE_h1 , 2 },
18 { TONE_g1 , 8 },
19 { TONE_g1 , 8 },
20 { TONE_a1 , 4 },
21 { TONE_g1 , 4 },
22 { TONE_d2 , 4 },
23 { TONE_c2 , 2 },
24 { TONE_g1 , 8 },
25 { TONE_g1 , 8 },
26 { TONE_g2 , 4 },
27 { TONE_e2 , 4 },
28 { TONE_c2 , 8 },
29 { TONE_c2 , 8 },
30 { TONE_h1 , 4 },
31 { TONE_a1 , 4 },
32 { TONE_f2 , 8 },
33 { TONE_f2 , 8 },
34 { TONE_e2 , 4 },
35 { TONE_c2 , 4 },
36 { TONE_d2 , 4 },
37 { TONE_c2 , 2 }
38 };
39 unsigned int length = 27 ;
40
41
42
43 void make_music ( int freq , int time )
44 {
45 TCCR0 = 0 ;
46 if ( freq < 4910 )
47 {
48 TCCR0 = ( 1 << COM00 ) | ( 1 << CS02 ) | ( 1 << WGM01 );
49 OCR0 = 312500 / freq ;
50 }
51 else
52 {
53 TCCR0 = ( 1 << COM00 ) | ( 1 << CS00 ) | ( 1 << CS01 ) | ( 1 << WGM01 );
54 OCR0 = 1250000 / freq ;
55 }
56
57 count = ( speed / time ) / 10 ;
58 OCR2 = 156 ;
59 TIMSK = ( 1 << OCIE2 );
60 TCCR2 = 0 ;
61 TCCR2 = ( 1 << WGM21 ) | ( 1 << CS22 ) | ( 1 << CS21 ) | ( 1 << CS20 );
62
63 return ;
64 }
65
66 ISR ( TIMER2_COMP_vect )
67 {
68 count -- ;
69 if ( count == 0 )
70 {
71 TCCR0 = 0 ;
72 pause -- ;
73 count ++ ;
74 if ( pause == 0 )
75 {
76 TCCR2 = 0 ;
77 start_melody ( melody1 );
78 pause = PAUSE ;
79 }
80 }
81 }
82
83 void start_melody ( int melody [ 16 ][ 2 ])
84 {
85 if ( pos >= length - 1 )
86 return ;
87 make_music ( melody [ pos ][ 0 ], melody [ pos ][ 1 ]);
88 pos ++ ;
89 return ;
90 }
91
92 int main ( void )
93 {
94 DDRB = 0xFF ;
95 sei ();
96
97 start_melody ( melody1 );
98
99
100 while ( 1 );
101 return 0 ;
102 }
Hallo Tomi,
zunächst mal... DU hast eine Aufgabe zu lösen.
will heissen , wenns ein anderer tut haste nix draus gelernt.
beschaff dir mal die frequenzen zu den benötigten noten.
Die Noten der Lieder.
Die Frequenzen must du dann mit dem timer erzeugen.
Gruß
Andi
X
xyz
Gast
22.06.2007 15:04
#587885
>das programm wird im avr4 geschrieben.
Was ist das für eine Prog. Sprache?
Kenne ich noch nicht.
T
tomi
Gast
22.06.2007 18:43
#588107
@ oldcoolman:
also das mit den frequenzen hab ich.
es geht mir mehr um die timer.
ich brauche doch 2 timer, oder?
einen für die Tonhöhe und den anderen für die tonlänge.
die tonhöhe geht über die frequenz (PWM) aber die tonlänge ist mir nicht
ganz klar.
gruß
S
SirSydom
Gast
22.06.2007 23:37
#588228
steht doch da. schau dir den code an! um genau zu sein die variable
count
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren