Прерывания и временные приложения

При изучении мультиплексирования 7 сегментов с использованием прерываний в PIC было обнаружено, что когда это используется в реальных приложениях синхронизации, частая ISR вызывает пошаговую кумулятивную задержку в основном цикле, которая затем увеличивается по сравнению с реальным временем. из-за задержки, вызванной обслуживанием основной программы подпрограммой ISR.

Я использую кристалл 20 МГц с PIC с таймером 0 для обновления мультиплексированных дисплеев, но задержка, вызванная ISR, очевидна в основном цикле программы, когда измерение в реальном времени выполняется подпрограммой задержки и т. д. Таким образом, когда подсчитываются 5 минут, это добавляет несколько секунд в зависимости от настройки timer0 для ISR. Например, 5 секунд в течение 5 минут и около минуты в течение 1 часа и т. д.

Есть ли способ решить эту проблему, кроме использования последовательных дисплеев??

Конечно есть. Есть много точных часов. Вы можете: A) Использовать более эффективные процедуры вождения сегмента. DMA действительно может помочь. Б) Используйте специальные аппаратные часы и просто используйте микро для выполнения менее важных задач. C) вы можете измерить, а затем учесть время, проведенное в ISR. И т. д. и т. д.
Очевидно, что вы не можете проводить измерения в реальном времени с помощью задержек !! Для этого предназначены аппаратные таймеры; подсчитайте переполнение в программном обеспечении, чтобы отслеживать более длительные периоды времени.
Крис, проблема в том, что я использую таймер 0, когда я включаю таймер 1, код не работает.

Ответы (2)

Вместо использования задержки основного цикла для вычисления времени, которое прерывается аппаратным счетчиком, используйте сам аппаратный счетчик для определения времени.

Установите timer0 на прерывание (скажем) каждые 1 мс. Это становится тиком вашей системы или сердцебиением. Используйте процедуру прерывания для увеличения счетчика мс и обновления дисплеев.

В основном цикле используйте счетчик мс в качестве «настенных часов», подождите, пока он не продвинется вперед на 300 000 тиков, и вы подождите 5 минут с некумулятивной точностью 1 мс.

Этот ответ намеренно неполный, есть еще некоторые технические детали, которые могут потребоваться в зависимости от продолжительности вашей процедуры проверки времени, но представление трактата сейчас было бы перегрузкой. Как только вы начнете вдаваться в подробности, вы обнаружите, что для получения чистой связи между основным циклом и ISR требуется немного осторожности, объявление переменных volatile, создание снимков, отключение прерываний в критические периоды, но все это задокументировано, и это способ все остальные это делают.

Вы можете использовать прерывания таймера для измерения времени, добавить определенное количество мс к счетчику в каждом ISR, чтобы сохранить точное измерение времени, попытаться избежать длинных задач в ISR, вместо этого установить флаги и проверить их в основном цикле, попытаться профилировать ваш код с помощью вывода отладчика для поиска задач, выполнение которых занимает больше времени. Максимально оптимизируйте свой код, помните, что 8-битные процессоры отправляют людей на Луну...