st232bd (15.01.2008 10:31, просмотров: 102) ответил sda на Коллеги,кто нибудь делал долгий Capture?
Мои потуги для коллекции. С C8051А020 не работал. Пусть есть некий контроллер с 16 битным таймером, его значение TMR и флагом TOIF, и Capture с регистром CCR. В реальном контроллере видимо достаточно одной из двух заплаток, в зависимости от приорететов Capture и Timer. Для надёжности пишем обе.
//----------
unsigned long time = 0, time_of_pulse = 0;
void main (void)
{....}
__interrupt void Timer (void)
{time += 0x10000; //Инкремент старшей части
TOIF = 0;
}
__interrupt void Capture (void)
{time_of_pulse = time + CCRval;
//Заплатка, если CCR после переполнения
//таймера сработал, а таймер не
// синкрементировал старшую часть
//
if ((CCRval < 32000) && (TOIF = 1))
time_of_pulse += 0x10000;
//Заплатка если Capture из прошлого периода
//не обработано, а таймер перепролнился и уже
//синкрементировал старшую часть
if ((TMR < 32000)&&(TOIF = 0)&&(CCRval > 32000))
time_of_pulse -= 0x10000;
}
Реально может еще запреты прерываний нужны для атомарности, если контроллер не заприщает их автоматически при входе в прерывания, и если 8 битн. - лучше вместо long объединение long и структуры из двух int, и т.д. - код упрощённый, только для понимания хода мысли.