ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
1034903 Топик полностью
fk0, легенда (09.09.2020 11:40, просмотров: 959) ответил FDA на Простой вопрос по таймеру TMR2 в PIC18. Никогда его не использовал для точного отсчёта времени, а тут потребовалось в одном девайсе реализовать NTP-клиента. Сам клиент сделал, время с сервера получаю раз в час, а вот в течение этого часа замечаю, что мои часы начинают идти с опережением. Проц работает на частоте 64 МГц со включённой PLL. TMR2 настраиваю так: предделитель 4, постделитель 16, PR2=249. Вроде как на 250 такте как раз должно возникнуть прерывание (в реальном
Пост о неумении читать даташит и поэтому нужна аж спец. программа чтоб посчитать делитель для таймера??? microe.com и микро-си? Это нижнее дно нижнего ада! Хуже ардуины! 

И он сделал 500 проектов! Если ближе к теме, то очевидно, что при любом раскладе нацело делиться не будет во-первых, во-вторых нужно постоянно подкручивать делитель (для синхронизации). Поскольку на входе аж мегагерцы, а на выходе аж секунды, то заморачиваться с делением частоты аппаратным таймером -- никакого смысла. Аппаратный таймер может делить на любой удобный коэффициент, чтоб формировать периодические прерывания с известной частотой. Большего от него не нужно. Зная частоту прерываний в обработчике прерывания не сложно инкрементировать переменную содержащую целую и дробную части секунд. Точность может быть любая (хоть 64 бита) здесь, независимо от таймера. И величину инкремента легко регулировать для подстройки.


Сами алгоритмы подстройки везде расписан, но для МК он может быть оверкиллом (там PLL софтовый). Может быть проще не NTP, а всегда брать и жестко ставить полученное по сети время.


Если нужна функция получения точного времени в произвольный его момент (на самом деле такое не нужно...), то вот эту переменную следует сложить с текущим значением таймера домноженным на какой-то там коэффициент, опять же с любой точностью.


Вообще в системе сразу нужно завести ДВА вида времени, иначе добром не кончится:


1) привязанное к местному кварцу, монотонное, не привязанное к внешнему источнику времени или календарю (время от момента старта);


2) привязанное к внешнему источнику и календарю: для него базой, тактовой частотой, является п. 1, но оно подстраивается под внешний источник. Это время может быть резко переведено из-за синхронизации с внешним источником и может быть не монотонным.


Все временные интервалы нужные для работы алгоритмов управления привязаны к первому времени. Второе используется только там, где оно принципиально необходимо (выполнение действий в заданный момент календарного времени). При этом могут возникать проблемы вроде пропуска событий (если время переведено вперёд) или многократного запуска (если время переведено назад). Поэтому условие возникновение событий должно задаваться не строгим равенством календарного времени и заданного (даже программа на ПК может зависнуть на несколько секунд, пока операционка что-то делает), а через некий периодически запускаемый конечный автомат, который проверяет, что при предыдущем запуске время было менее заданного, а в текущий момент больше или равно, но не более заданного порога (периода работы, например) -- значит событие произошло. При переводе назад -- могут быть разные варианты, в зависимости от того, что управляется. Или нет реакции, или есть если сейчас попадает в нужный интервал, а на прошлом шаге время было за интервалом.

[ZX]