LPC2106- пропущенные прерывания от узла CAPTURE. Сразу замечу, что ситуация отличается от описанной в Errata sheet на LPC2106, поскольку не используется прерывания на события Match.
Описание задачи.
Необходимо померить скважность трёх сигналов от датчика, для чего надо померить период и длительность положительного полупериода сигнала. Используется таймер 1.
Для получения информации о моментах прихода положительного и отрицательного фронтов в регистре T1CCR попеременно устанавливаются биты Capture on rising edge и Capture on falling edge соответствующего входа. По каждому событию генерируется прерывание. Фрагмент кода для вычисления скважности на одном входе:
if(T1IR & CR0_flag )//channel 0 capture; AX
{
T1IR = CR0_flag; //сброс флага прерывания
if(capture_struct[0].trig_on_re_flag)
{
capture_struct[0].prev_re = capture_struct[0].re;
capture_struct[0].re = T1CR0; //ЧитаемCapture Register 0
capture_struct[0].trig_on_re_flag = 0;
T1CCR &= ~CAP0RE; //сбрасываем бит "capture on rising edge"
T1CCR |= CAP0FE; //Устанавливаем бит "capture on falling edge"
capture_calc(0); //подсчитываем скважность
}
else
{
capture_struct[0].fe = T1CR0; //Читаем Capture Register 0
capture_struct[0].trig_on_re_flag = 1;
T1CCR &= ~CAP0FE; //Сбрасываем бит "capture on falling edge"
T1CCR |= CAP0RE; //Устанавливаем бит "capture on rising edge"
}
}
Пока вычисляется скважность сигналов с одного датчика (сигнала имеют одну частоту, фронты могут совпадать, но всегда имеют одну полярность) , всё хорошо. Если же поданы сигналы с разных датчиков (у которых частоты выходных сигналов слегка различны и, соответственно, возможна ситуация, когда совпадают положительный и отрицательный фронты), по всем задействованным каналам периодически не вырабатываются прерывания и, соответственно, неправильно измеряются длительность и период.
Буду очень признателен за ответы:
-Каковы могут быть причины отсутствия прерываний по событиям Capture?
-Методы борьбы с описанной неприятностью.
Спасибо.