Вот сам код на WinAVR:
CODE
...
ISR(TIMER2_OVF_vect){
OCR1A = music[num_byte];
num_byte++;
if (num_byte>959) num_byte=1; // stop timer1
TCNT2 = 224; // bitrate - 8 kHz
}
...
int main(void)
{
DDRD |=(1<<4)|(1<<3)|(1<<1)|(1<<6)|(1<<7); // LED OUT
PORTD |=(1<<6)|(1<<3); // LOW SEGMENT
DDRC = 0xFF; // all outputs
PORTC = 0xFF;
DDRB |=(1<<1); //OC1A - output
TCCR2B |=(0<<CS22)|(1<<CS21)|(1<<CS20); // CK/32 - 8kHz
TIMSK2 |=(1<<TOIE2); // interrrupt OVF 8kHz
TCNT2 = 224; // bitrate - 8 kHz
TCCR1A |=(1<<COM1A1)|(0<<COM1A0)|(1<<WGM10); //---___, 8 bit fast PWM
TCCR1B |=(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); //CK/1 - PWM - 31kHz
OCR1A=0x66;
sei();
while(1);
}
ISR(TIMER2_OVF_vect){
OCR1A = music[num_byte];
num_byte++;
if (num_byte>959) num_byte=1; // stop timer1
TCNT2 = 224; // bitrate - 8 kHz
}
...
int main(void)
{
DDRD |=(1<<4)|(1<<3)|(1<<1)|(1<<6)|(1<<7); // LED OUT
PORTD |=(1<<6)|(1<<3); // LOW SEGMENT
DDRC = 0xFF; // all outputs
PORTC = 0xFF;
DDRB |=(1<<1); //OC1A - output
TCCR2B |=(0<<CS22)|(1<<CS21)|(1<<CS20); // CK/32 - 8kHz
TIMSK2 |=(1<<TOIE2); // interrrupt OVF 8kHz
TCNT2 = 224; // bitrate - 8 kHz
TCCR1A |=(1<<COM1A1)|(0<<COM1A0)|(1<<WGM10); //---___, 8 bit fast PWM
TCCR1B |=(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); //CK/1 - PWM - 31kHz
OCR1A=0x66;
sei();
while(1);
}