Страница 1 из 1

вопрос: динамическая инидикация и прерывания CPU

Добавлено: Пт май 30, 2008 17:41:23
v000va
Подскажите начинающему: я пишу программу для вывода на дисплей семисигментного инидикатора (под Tiny2313). Программа пока тренировочная. На дисплей выводится счет секунд и минут. Индикация дисплея ессно динамическая, управляем 4-мя разраядами. Частота кварца 4мгц. Алгоритм такой: загружаем константы, загружаем таймер, включаем прерывания. Далее бесконечный цикл индикации, из которого выходим по прерыванию. Делаем inc счетчика секунд, и снова бесконечный цикл индикации.

Так вот суть вопроса в чем: программа работает, но когда меняются секунды (т.е. выходим по прерыванию), весь дисплей промаргивает. Думал что дело в длительной обработке участка кода обрабатывающего прерывание, но выходит всего около 0,16 милисекунд (по числу тактов в участке обработки TIM_COMP1:
), т.е. промаргивания быть не должно. Потом переписал прогорамму так, чтоб секунды и минуты хранились регистрах (сначала хранились в памяти), та же петрушка выходит. Просвятите пожалуйста, что я делаю не так?

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

Добавлено: Пт май 30, 2008 18:49:53
ARV
начитались обучалок... ну кто делает динамическую индикацию в бесконечном цикле?! сделайте наоборот: по прерываниям от одного таймера обновляйте индикатор, а по прерываниям от другого - считайте время. а основной цикл программы будет бесконечным и пустым :)

Добавлено: Пт май 30, 2008 22:02:09
v000va
Проясните все же, почему промигивает? В чем ошибка? Почему нельзя делать индикацию циклом?

За совет спасибо, воспользуюсь :P , только поясните все же, почему в вашем варианте промигивать не будет, а в моем промигивает. Хоцца физику процесса понять :))

Добавлено: Вс июн 01, 2008 02:38:44
DUKER
Рисуйте Временной график работы всего, и тогда будет ясно (это можно легко сделать в протеусе, если сделать какой-то пин сигнализирующим о входе в прерывание, и глушить его по выходу), просто пока ваша программа в бесконечном цикле ждет задержки для отрисовки, в какой-то момент эта задержка становиться длиннее на врема входа в прерывание отсчета времени, его отработки, и выхода из него, этого может быть вполне достаточно для того, чтобы заметить глазом...

Добавлено: Пн июн 02, 2008 12:00:07
v000va
Все решил проблему, :)) Дело было в команде Rcall, которая была тексте обработчика прерывания. Убрал rcall, поменял текст программы все стало ОК. :))

Обошелся без использования второго таймера.