Вот набросал болванку , для захвата длительностей импульсов в два массива , один с длительностями положительных импульсов другой соответственно с отрицательными . В главном цикле можно делать обработку этих импульсов, разрешение таймера очень высокое, равно 8 тактам процессора 0.0000005 , это значит максимальная длительность импульса на входе D2 не должна быть больше чем 32 мс
PHP код:
volatile uint8_t i=0;
volatile uint8_t Counter=0;
volatile uint16_t Time=0;
volatile uint16_t Bit_High[255];
volatile uint16_t Bit_Low[255];
//*************************************************************************
ISR(INT0_vect) // обработчик внешнего прерывания
{
Time=TCNT1;
if (PIND & (1<<2)) // Если бит 2 порта D установлен в лог. 1
{
Bit_High[i]=Time;
} else
{
Bit_Low[i]=Time;
}
i++;
TCNT1 = 0; //обнулить счетчик таймера
}
//*************************************************************************
void setup()
{
pinMode(2, INPUT);
pinMode(13, OUTPUT);
digitalWrite(2, HIGH); // включить подтяжку входа
Serial.begin(115200);
Init_Timer1();
Init_Ext_Int0();
}
//*************************************************************************
void loop()
{
//.......
}
//*************************************************************************
void Init_Ext_Int0()// инициализация прерывания int0
{
EICRA &= ~((1<<ISC00)|(1<<ISC01)); //прерывание вызавается при сигнале LOW
EICRA |= (1<<ISC00); // прерывание вызывается при спадающем или нарастающем фронте сигнала на входе;
EIMSK |= (1<<INT0); // разрешить прерывание INT0;
sei(); //разрешить все прерывания
}
//*************************************************************************
void Init_Timer1()// инициализация таймера
{
TCCR1A = 0; //Normal mode
TCCR1B = (1<< CS11); //предделителm x8
TCNT1 = 0; //обнулить счетчик таймера
TIMSK1 = _BV(TOIE1); // Включить прерывание по переполнению таймера
sei(); //разрешить все прерывания
}
//*************************************************************************
ISR(TIMER1_OVF_vect)//вектор прерывания по переполнению счетчика
{
//Counter++;
TCNT1=0;
}