ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
4 июля
110284 Топик полностью
st232bd (15.01.2008 10:31, просмотров: 81) ответил 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, и т.д. - код упрощённый, только для понимания хода мысли.