Задача сформулирована точно.
Другим способом задачу решить нельзя.
Необходимо генерация 2-х задержек исключительно аппаратно, с внешним
запуском и внешней тактовой серией.
Программно можно только менять уставки задержек.
Синхронно с внешним запуском.
---
Цифровой компаратор оказался несовершенным - убогим каким-то.
Форсированное сравнение не записывает результат сравнения в в выходной триггер - оно может только установить его в заданное значение, если значение регистра счётчика достигло или превысило значение регистра сравнения. Это надо специально постараться. Ибо что может быть
проще записи бита в триггер ? :0
При этом в аппаратной логике процессора имеется баг - в режиме "тоггле" почему-то подача сигнал на выход происходит более сложно, в том числе и не правильным образом.
Исходник получился таким:
// Инициализация:
....
// инициализаци таймера 1
TCNT1 = 0;
#ifdef T1MODE_TOGGLE
TCCR1A = 0x50;// спрограммируем моду "toggle"
#endif
#ifdef T1MODE_AUTO // вариант сброса счётом, без использования FOC
TCCR1A = 0xF0;
#endif
#ifdef T1MODE_FOC // вариант сброса c использованием FOC
TCCR1A = 0xF0;
#endif
TCCR1B = 0x07;// Внешняя серия
#ifdef T1MODE_TOGGLE
OCR1A = 2-1; // "-1" поскольку к выходу подключен синхронизатор с
OCR1B = 3-1; // c серией 1 мгц. Он даёт задержку на 1 такт
#endif
#ifdef T1MODE_AUTO
OCR1A = 3-1;
OCR1B = 4-1;
#endif
#ifdef T1MODE_FOC
OCR1A = 4-1;
OCR1B = 5-1;
#endif
// разрешаем прерывание таймеру 1
ITT1_EN
#ifdef T1MODE_AUTO
o1st=0;
#endif
// разрешим все прерывания
EI
....
//----------------------------------------------------------------
// прерывания от таймера 1
//
interrupt [TIMER1_OVF1_vect] void t1_tim (void)
{
#ifdef T1MODE_TOGGLE
T1CLK_RES
TCNT1 = 0xFFFF; // для "правильного" сравнения
//#define OCR1ARES if(PIND & (PD5)) {TCCR1A |= FOC1A;}
//#define OCR1BRES if(PINE & (PE2)) {TCCR1A |= FOC1B;}
OCR1ARES
OCR1BRES
TCNT1 = 0;
// SCOP1
// SCOP0
#endif
#ifdef T1MODE_AUTO // сброс счётом небольшого количества внешних тиков
switch(o1st)
{
case 0:
TCCR1B = 0;
TCCR1A = 0xA0;
OCR1A = 0xFFFE;
OCR1B = 0xFFFE;
TCNT1 = 0xFFFD;
TCCR1B = 0x07;
o1st=1;
break;
case 1:
T1CLK_RES
TCNT1 = 0;
OCR1A = 3-1;
OCR1B = 4-1;
TCCR1A = 0xF0;
o1st=0;
break;
default: o1st=0;break;
}
// SCOP1
// SCOP0
#endif
#ifdef T1MODE_FOC // программный сброс сигналом FOC
T1CLK_RES // запрет счётной серии
TCNT1 = 0xFFFF; // сравним с максимумом
TCCR1A = 0xA0; // выдать 0 (фактически это вызовет сброс)
TCCR1A |= FOC1A | FOC1B; // произвести сравнение (сброс)
TCNT1 = 0; // подготовимся к следующему циклу работы
TCCR1A = 0xF0;
#endif
}
//----------------------------------------------------------------