Вобщем, соптимизировал слегка.
Код
interrupt (TIMERB0_VECTOR) Timerb_ccr0(void)
{
//PulseRecharge();
TBCCR2 = TBCCR0 + 20u;//HalfPeriod; // Обозначили следующий фронт Gen
TBCCR0 = TBCCR2 + 20u;//HalfPeriod; // Будущий спад сигналов Gen и F
TBCCR1 = TBCCR2 + 4u;//FDelay; // Фронт F
}
По TBCCR2 встаёт 1-й фронт, по TBCCR1 с небольшой задержкой - 2й.
По TBCCR0 оба падают. Использую OUTMODE_3 (Установка/сброс).
Листинг:
Код
23fa: 0f 12 push r15 ;
23fc: 1f 42 92 01 mov &0x0192,r15;0x0192
2400: 3f 50 14 00 add #20, r15;#0x0014
2404: 82 4f 96 01 mov r15, &0x0196;
2408: 1f 42 96 01 mov &0x0196,r15;0x0196
240c: 3f 50 14 00 add #20, r15;#0x0014
2410: 82 4f 92 01 mov r15, &0x0192;
2414: 1f 42 96 01 mov &0x0196,r15;0x0196
2418: 2f 52 add #4, r15;r2 As==10
241a: 82 4f 94 01 mov r15, &0x0194;
241e: 3f 41 pop r15 ;
2420: 00 13 reti
Эффект ещё забавнее.
1 круг таймера (15мс) идёт частота 100кГц, дальше ещё круг - тишина.
На другом выходе (который с задержкой) идут одиночные импульсы 4мкс через 15мс.
В общем, чудеса.
В общем, в данной ситуации вижу только один выход.
Сажать скоростной выход на отдельный таймер (А) без всяких прерываний.
А остальные, менее скоростные - на таймер В в непрерывном режиме с прерываниями.
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)