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
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
>das programm wird im avr4 geschrieben.
Was ist das für eine Prog. Sprache?
Kenne ich noch nicht.
@ 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ß
steht doch da. schau dir den code an! um genau zu sein die variable count
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.