Hallo, ich hänge seit 2 Stunden an einem einfachen Problem.
Mein Timer funktioniert nicht wie er soll, ich will Töne mit möglichst exakten Frequenzen erzeugen.
Aus diesem Grund verwende ich Timerß0 ohne Prescaler. Zusätzlich beträgt der reload 255.
Allerdings passen die töne nicht, und ich komme nicht drauf, wieso...
Es wäre nett wenn mir jemand zeigt, wo sich das gehölz vor meinem kopf befindet
Code:
volatile unsigned short sound_count=0;
volatile unsigned short sound_fcount=0;
volatile unsigned char sound_state=0;
volatile unsigned short sound_length=0;
volatile unsigned short sound_freq=0;
void Sound_Beep(unsigned short freq, unsigned short length)
{
sound_length=(F_CPU*length)/1000;
sound_freq=(F_CPU/2/freq);
sound_state=0;
sound_count=0;
sound_fcount=0;
//Enable timer
TCNT0=255;
TCCR0=(1<<CS00);
}
ISR (TIMER0_OVF_vect)
{
sound_count++;
if (sound_count>sound_length)
{
PORTD&=~(1<<7);
TCCR0=0;
};
sound_fcount++;
if (sound_fcount>sound_freq)
{
sound_fcount=0;
if (sound_state==0)
{
sound_state=1;
PORTD|=(1<<7);
}
else
{
sound_state=0;
PORTD&=~(1<<7);
};
};
TCNT0 = 255;
}
Lesezeichen