#define FCLK 16.000 //clock frequency, MHz
#define TSYS 500.0 //system tick, uS
#define SND (1 << PB0) //OL - sound output
#define Port_SND (PORTB & SND)
#define Port_SND_0 (PORTB &= ~SND)
#define Port_SND_1 (PORTB |= SND)
#define T2VAL (FCLK * TSYS / 64.0) //system timer period
//--------------------------- System timer init: -----------------------------
void Main_Timer_Init(void)
{
TCCR2 = (1<<WGM21) | (1<<CS22); //timer 2 mode: CTC, CK/64
OCR2 = T2VAL - 1; //load compare register
TIFR = (1<<OCIE2); //pending interrupts clear
TIMSK = (1<<OCIE2); //compare interrupt enable
fTick = 1; //force update
}
//------------------------ System timer interrupt: ---------------------------
#pragma vector = TIMER2_COMP_vect
__interrupt void Timer(void)
{
Sound_Gen(); //generate sound
}
#define BEEP_D 100.0 //beep duration, mS
#define MS2P(x) (int)(x * 500 / TSYS) //convert mS to periods
//------------------------------ Variables: ----------------------------------
int SndTimer; //sound duration in periods
//--------------------------- Beep generation: -------------------------------
__monitor void Sound_Beep(void)
{
SndTimer = MS2P(BEEP_D);
}
//--------------------------- Sound generation: ------------------------------
void Sound_Gen(void)
{
if(SndTimer)
{
Port_SND? Port_SND_0 : Port_SND_1;
if(Port_SND) SndTimer--;
}
}
//----------------------------------------------------------------------------