Forum: Mikrocontroller und Digitale Elektronik Melodiengenerator? Hilfe, wie geht das !!!


von Tomi (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?


von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

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
}

  

von Andreas K. (oldcoolman)


Lesenswert?

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

von xyz (Gast)


Lesenswert?

>das programm wird im avr4 geschrieben.
Was ist das für eine Prog. Sprache?
Kenne ich noch nicht.

von tomi (Gast)


Lesenswert?

@ 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ß





von SirSydom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.