При изучении мультиплексирования 7 сегментов с использованием прерываний в PIC было обнаружено, что когда это используется в реальных приложениях синхронизации, частая ISR вызывает пошаговую кумулятивную задержку в основном цикле, которая затем увеличивается по сравнению с реальным временем. из-за задержки, вызванной обслуживанием основной программы подпрограммой ISR.
Я использую кристалл 20 МГц с PIC с таймером 0 для обновления мультиплексированных дисплеев, но задержка, вызванная ISR, очевидна в основном цикле программы, когда измерение в реальном времени выполняется подпрограммой задержки и т. д. Таким образом, когда подсчитываются 5 минут, это добавляет несколько секунд в зависимости от настройки timer0 для ISR. Например, 5 секунд в течение 5 минут и около минуты в течение 1 часа и т. д.
Есть ли способ решить эту проблему, кроме использования последовательных дисплеев??
Вместо использования задержки основного цикла для вычисления времени, которое прерывается аппаратным счетчиком, используйте сам аппаратный счетчик для определения времени.
Установите timer0 на прерывание (скажем) каждые 1 мс. Это становится тиком вашей системы или сердцебиением. Используйте процедуру прерывания для увеличения счетчика мс и обновления дисплеев.
В основном цикле используйте счетчик мс в качестве «настенных часов», подождите, пока он не продвинется вперед на 300 000 тиков, и вы подождите 5 минут с некумулятивной точностью 1 мс.
Этот ответ намеренно неполный, есть еще некоторые технические детали, которые могут потребоваться в зависимости от продолжительности вашей процедуры проверки времени, но представление трактата сейчас было бы перегрузкой. Как только вы начнете вдаваться в подробности, вы обнаружите, что для получения чистой связи между основным циклом и ISR требуется немного осторожности, объявление переменных volatile, создание снимков, отключение прерываний в критические периоды, но все это задокументировано, и это способ все остальные это делают.
Вы можете использовать прерывания таймера для измерения времени, добавить определенное количество мс к счетчику в каждом ISR, чтобы сохранить точное измерение времени, попытаться избежать длинных задач в ISR, вместо этого установить флаги и проверить их в основном цикле, попытаться профилировать ваш код с помощью вывода отладчика для поиска задач, выполнение которых занимает больше времени. Максимально оптимизируйте свой код, помните, что 8-битные процессоры отправляют людей на Луну...
пгвурхис
Крис Стрэттон
пользователь132257