hab ich vor einiger zeit schonmal gepostet, so mach ich das.. vllt
hilfts:
music.h
#define TONE_C 654
#define TONE_CIS 693
#define TONE_DES 693
#define TONE_D 734
#define TONE_DIS 778
#define TONE_ES 778
#define TONE_E 824
#define TONE_F 873
#define TONE_FIS 925
#define TONE_GES 925
#define TONE_G 980
#define TONE_GIS 1038
#define TONE_AS 1038
#define TONE_A 1100
#define TONE_AIS 1165
#define TONE_B 1165
#define TONE_H 1235
#define TONE_c 1308
#define TONE_cis 1386
#define TONE_des 1386
#define TONE_d 1468
#define TONE_dis 1556
#define TONE_es 1556
#define TONE_e 1648
#define TONE_f 1746
#define TONE_fis 1850
#define TONE_ges 1850
#define TONE_g 1960
#define TONE_gis 2077
#define TONE_as 2077
#define TONE_a 2200
#define TONE_ais 2331
#define TONE_b 2331
#define TONE_h 2469
#define TONE_c1 2616
#define TONE_cis1 2772
#define TONE_des1 2772
#define TONE_d1 2937
#define TONE_dis1 3111
#define TONE_es1 3111
#define TONE_e1 3296
#define TONE_f1 3492
#define TONE_fis1 3700
#define TONE_ges1 3700
#define TONE_g1 3920
#define TONE_gis1 4153
#define TONE_as1 4153
#define TONE_a1 4400
#define TONE_ais1 4662
#define TONE_b1 4662
#define TONE_h1 4939
#define TONE_c2 5233
#define TONE_cis2 5544
#define TONE_des2 5544
#define TONE_d2 5874
#define TONE_dis2 6223
#define TONE_es2 6223
#define TONE_e2 6593
#define TONE_f2 6985
#define TONE_fis2 7400
#define TONE_ges2 7400
#define TONE_g2 7840
#define TONE_gis2 8306
#define TONE_as2 8306
#define TONE_a2 8800
#define TONE_ais2 9324
#define TONE_b2 9324
#define TONE_h2 9878
#define TONE_c3 10465
#define TONE_cis3 11087
#define TONE_des3 11087
#define TONE_d3 11747
#define TONE_dis3 12445
#define TONE_es3 12445
#define TONE_e3 13185
#define TONE_f3 13969
#define TONE_fis3 14800
#define TONE_ges3 14800
#define TONE_g3 15680
#define TONE_gis3 16612
#define TONE_as3 16612
#define TONE_a3 17600
#define TONE_ais3 18647
#define TONE_b3 18647
#define TONE_h3 19755
music.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include "music.h"
#define PAUSE 10
unsigned int speed = 1500;
int pause = PAUSE;
unsigned int count = 0;
unsigned int pos = 0;
unsigned int melody1[27][2] = {
{TONE_g1, 8},
{TONE_g1, 8},
{TONE_a1, 4},
{TONE_g1, 4},
{TONE_c2, 4},
{TONE_h1, 2},
{TONE_g1, 8},
{TONE_g1, 8},
{TONE_a1, 4},
{TONE_g1, 4},
{TONE_d2, 4},
{TONE_c2, 2},
{TONE_g1, 8},
{TONE_g1, 8},
{TONE_g2, 4},
{TONE_e2, 4},
{TONE_c2, 8},
{TONE_c2, 8},
{TONE_h1, 4},
{TONE_a1, 4},
{TONE_f2, 8},
{TONE_f2, 8},
{TONE_e2, 4},
{TONE_c2, 4},
{TONE_d2, 4},
{TONE_c2, 2}
};
unsigned int length = 27;
void make_music(int freq, int time)
{
TCCR0 = 0;
if(freq < 4910)
{
TCCR0 = (1<<COM00) | (1<<CS02) | (1<<WGM01);
OCR0 = 312500 / freq;
}
else
{
TCCR0 = (1<<COM00) | (1<<CS00) | (1<<CS01) | (1<<WGM01);
OCR0 = 1250000 / freq;
}
count = (speed / time) / 10;
OCR2 = 156;
TIMSK = (1<<OCIE2);
TCCR2 = 0;
TCCR2 = (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);
return;
}
ISR(TIMER2_COMP_vect)
{
count--;
if(count == 0)
{
TCCR0 = 0;
pause--;
count++;
if(pause == 0)
{
TCCR2 = 0;
start_melody(melody1);
pause = PAUSE;
}
}
}
void start_melody(int melody[16][2])
{
if(pos >= length-1)
return;
make_music(melody[pos][0], melody[pos][1]);
pos++;
return;
}
int main (void)
{
DDRB = 0xFF;
sei();
start_melody(melody1);
while(1);
return 0;
}