Ну вот типа: например. Из моего декодера PPM. Использует ICP. Если по каналам, я использовал "подключатель" на hct125d- лишний драйвер тоже не помешает, для выравнивания фронтов. Что касается самих импульсов, я думаю, что если с контроллера выводятся напрямую к машинкам(в приемнике)- то одновременно стартуют...(все включил, по счетчику отключил)
[codebox]
//////////////////////////////////////////////////////////////
#define PULSEZ 32
#define RC_SEQ_PRESENT 0
#define RC_SEQ_ACKQ 1
#define TURN_LED_ON PORTB|=_BV(LED_0)
#define TURN_LED_OFF PORTB&=~_BV(LED_0)
volatile uint16_t MeasuredIcpz[PULSEZ*2], RcvdData[8], cntz;
uint8_t ChnlCnt, SYS_LOGIC_BITS, pulse_Piece;
//////////////////////////////////////////////////////////////
void InitCapture (void) {
cli();
TCCR1B=0;
TCNT1=0;
TCCR1B |=_BV(CS11) |_BV(ICES1);// Период измерения равен 8*65536/XTAL
TIMSK |=_BV(TICIE1) |_BV(TOIE1);
sei();
}
ISR (TIMER1_CAPT_vect){
TCCR1B&=~_BV(CS11);//стоп таймер
TCNT1=0; //счетчик в ноль
if (bit_is_clear(TCCR1B,ICES1)) TCCR1B|=_BV(ICES1);// переключаем полярность срабатывания
else TCCR1B&=~_BV(ICES1);
TCCR1B|=_BV(CS11);// таймер старт
if (ICR1<5555) {// мин. значение длительности на которое следует реагировать (для JR при кварце 12mhz в моем случае)
//TURN_LED_OFF;
SYS_LOGIC_BITS|=_BV(RC_SEQ_PRESENT); // последовательность присутствует!
MeasuredIcpz[pulse_Piece]=ICR1;// сохраняем все данные???
if (MeasuredIcpz[pulse_Piece]>777) {// канальный синхро ~550 не нужен
///////////////////////////////////////////////////////
RcvdData[ChnlCnt]=(RcvdData[ChnlCnt]+MeasuredIcpz[pulse_Piece])>>1;// усредняем???
///////////////////////////////////////////////////////
if (ChnlCnt++>=7) ChnlCnt=7;// сохраняем 8 каналов
}
if (pulse_Piece++==(PULSEZ*2)-1) pulse_Piece=0;
} else {
cntz=pulse_Piece;
ChnlCnt=0;
pulse_Piece=0;
SYS_LOGIC_BITS|=_BV(RC_SEQ_ACKQ);// если больше 5555 - посылка принята!
}
}
ISR (TIMER1_OVF_vect){// при переполнении таймера сбрасываем бит наличия и счетчики
cntz=pulse_Piece;
pulse_Piece=0;
SYS_LOGIC_BITS&=~_BV(RC_SEQ_PRESENT);
SYS_LOGIC_BITS&=~_BV(RC_SEQ_ACKQ);
//TURN_LED_ON;
}
[/codebox]
Типа, вот. просто и понятно. Работает шикарно. Input Capture Noise Canceler -не пробовал, за ненадобностью
MeasuredIcpz и cntz можно выкинуть