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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

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

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

Если выводить просто счет импульсов, без таймера и прерываний, то никаих промаргиваний нет и индикация работает нормально.
Вложения
dynamic.asm
Текст самой программы
(6.38 КБ) 379 скачиваний
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

Проясните все же, почему промигивает? В чем ошибка? Почему нельзя делать индикацию циклом?

За совет спасибо, воспользуюсь :P , только поясните все же, почему в вашем варианте промигивать не будет, а в моем промигивает. Хоцца физику процесса понять :))
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 189
Зарегистрирован: Вт май 16, 2006 06:24:49
Откуда: Москва

Сообщение DUKER »

Рисуйте Временной график работы всего, и тогда будет ясно (это можно легко сделать в протеусе, если сделать какой-то пин сигнализирующим о входе в прерывание, и глушить его по выходу), просто пока ваша программа в бесконечном цикле ждет задержки для отрисовки, в какой-то момент эта задержка становиться длиннее на врема входа в прерывание отсчета времени, его отработки, и выхода из него, этого может быть вполне достаточно для того, чтобы заметить глазом...
CLM-9000 CLM-9000+, и прочие вкусности :-)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 422
Зарегистрирован: Ср дек 26, 2007 18:33:00

Сообщение v000va »

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

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

Вернуться в «Микроконтроллеры и ПЛИС»