У меня есть рабочий вариант на Algorithm Builder-е. Я его переделал на С (IAR) так сказать в демонстрационных целях. Так что пример чисто ознакомительный.
/********************************************************************************
* Старший бит счётчика InpulseCounter служит в качестве флага идет ли пачка или *
* нет. Пачка состоит из десяти импульсов. При каждом переполнении светодиод *
* переключается, следовательно счётчик должен досчитать до 10*2=20 плюс (точнее *
* OR) флаг пачки (старший бит): *
* 0x14 OR 0x80 = 0x94 *
* Время паузы между пачками равно: *
* 1/(6000000/(0x7F*(0xFFFF-0xFFB8)))= *
* 1/(6000000/((0x7F*0x47))=1/(6000000/9017)=1/665,4=0,0015=1.5 мс. *
* В расчётах правда не уверен. Если надо проверяйте сами
*
********************************************************************************/
#define CPUFrequency=6000000;
unsigned char ImpulseCounter;
#pragma vector=Timer1OverflowInterruptVector
__interrupt void IRTimerInterrupt(void)
{
ImpulseCounter++;
if (ImpulseCounter>0x80) //Если старший бит установлен, то:
{
if (ImpulseCounter==0x94) //если ImpulseCounter досчитал до 0х94-х
{
ImpulseCounter=0; //то пачка закончилась. Обнуляем счётчик
PORTD4=1; //и гасим светодиод
}
else
PORTD^=0x10; //если не закончилась, то переключаем светодиод
}
else //если старший бит сброшен, то
PORTD4=1; //на всякий случай гасим светодиод
TCNT1H=0xFF;
TCNT1L=0xB8; //Заводим таймер на 65464, чтобы
} //частота переполнения была равна 36 кГц
Примерно так.