Код
SIGNAL(SIG_OVERFLOW1)
{
long_time++;
}
{
long_time++;
}
А в прерывании по захвату делаю так:
Код
SIGNAL(SIG_INPUT_CAPTURE1)
{
static u32 prev_ticks; // previous edge ticks
u16 icr = ICR1;
u32 ticks;
u32 len;
// get new edge time (extended to 32 bits with long_time)
LoWord(ticks) = icr;
HiWord(ticks) = long_time;
// calc new length (32 bit too)
len = ticks - prev_ticks;
prev_ticks = ticks;
...
{
static u32 prev_ticks; // previous edge ticks
u16 icr = ICR1;
u32 ticks;
u32 len;
// get new edge time (extended to 32 bits with long_time)
LoWord(ticks) = icr;
HiWord(ticks) = long_time;
// calc new length (32 bit too)
len = ticks - prev_ticks;
prev_ticks = ticks;
...
Вроде всё должно быть нормально... Ан нет:-) Приоритет таймерного прерывания меньше, чем у прерывания захвата. Поэтому когда событие захвата совпадает с переполнением таймера, то сначала вызывается прерывание по захвату.
При этом ICR уже больше либо равен 0, а long_time - ещё не инкрементирован.
Это конечно случается редко, но случается. Пока частично вышел из положения так:
Код
LoWord(ticks) = icr;
HiWord(ticks) = long_time;
if (ticks < prev_ticks && HiWord(ticks))
HiWord(ticks)++;
HiWord(ticks) = long_time;
if (ticks < prev_ticks && HiWord(ticks))
HiWord(ticks)++;
Но это конечно не дело. Да и срабатывает не во всех случаях.
Как бы мне эту проблему победить? :-)