Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Большая программа и динамическая индикация
Klim Дата: Чт, 30.09.2010, 21:25  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Делаю довольно большой проэкт на 16f877a. Пока программа была небольшой, динамическая индикация в протеусе работала замечательно (реализовывалось подпрограммой). По мере разростания проэкта в протеусе индикатор начал подмигивать. Это будет и в железе? Может лучше реализовать это на прерываниях? Проэкт скоро сдавать, не хотелось бы в последний момент переписывать софт. Использован сдвиговый регистр 74НС595 и транзисторные ключи. Если надо, могу выложить исходники.
Сообщение отредактировал Klim - Чт, 30.09.2010, 21:26
ЯНДЕКС Дата: 30.09.2010
ivan_fd Дата: Чт, 30.09.2010, 22:14  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Программа большая, следом Протеус начинает забирать ресурсы процессора компа под 100%, и потому подмигивает.
В железе не должно. Ну и конечно, динамическую индикацию лучше сделать на прерывании, причем на хардварном.
Klim Дата: Чт, 30.09.2010, 23:26  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Сделал на прерывании, все равно моргает. Выкладываю исходники и модель протеуса. Вопрос - будет или нет моргать в реале?
Прикрепления: TestSecondary.bas (9.8 Kb) · TestSecondary.dsn (160.4 Kb) · TESTSECONDARY.hex (5.2 Kb)
ivan_fd Дата: Пт, 01.10.2010, 14:51  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (Klim)
Вопрос - будет или нет моргать в реале?

Думаю, что будет. Зачем Вы за одно прерывание выводите все 4-ре цифры? Нужно выводить по одной, по кругу.
Тоесть, в этом прерывании выводим первую, в следующем вторую......

p.s: Еще одно замечание, в хардварном прерывании лучше писать на ассемблере. Потому что могут быть глюки.

Сообщение отредактировал ivan_fd - Пт, 01.10.2010, 14:53
DAlexV Дата: Пт, 01.10.2010, 20:03  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Klim)
Сделал на прерывании, все равно моргает.
в таком варианте будет.
Quote (ivan_fd)
Зачем Вы за одно прерывание выводите все 4-ре цифры? Нужно выводить по одной, по кругу. Тоесть, в этом прерывании выводим первую, в следующем вторую......

Иван абсолютно прав. Немного подкорректировал файл проекта. Добавил анализатор сигнала. Не возникал ли вопрос-Почему цифры моргают, а знак температуры нормально горит?
Все верно. Последний сегмент горит дольше всего, а остальные просто вспыхивают на короткий промежуток времени.
Quote (Klim)
будет или нет моргать в реале?
Моргатль может и не будет, но будет огромная разница в яркости 1-3 и 4 сегментов.
Quote (ivan_fd)
Еще одно замечание, в хардварном прерывании лучше писать на ассемблере. Потому что могут быть глюки.

А вот здесь я не согласен. И на барсике все нормально работает.
Прикрепления: 3507067.dsn (159.5 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
ivan_fd Дата: Пт, 01.10.2010, 21:04  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (DAlexV)
А вот здесь я не согласен. И на барсике все нормально работает.

Это я написал с собственного опыта, и в HELP-e на Протон об этом пишет.

Quote
Precautions

Because a hardware interrupt may occur at any time, It cannot be fully guaranteed that a SYSTEM variable will not be disturbed while inside the interrupt handler, therefore, the safest way to use a HARDWARE interrupt is to write the code in assembler, or to implement a managed interrupt. This should guarantee that no system variables are being altered. Alternatively, the assembler code may be viewed in order to ascertain whether any system variables are being used. Some of these are: -

На форуме я об этом писал уже, тоже сделал проэкт на HARDWARE прерываниях, и в них всунул барсик команды. Работать то оно работало,
но в некоторые моменты на индикатор выскакивала всякая муйня. Как только переписал на ассемблере, все стало четко. Повторяю еще раз, это касается только аппаратных прерываний, а не софтовых.
DAlexV Дата: Пт, 01.10.2010, 21:42  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ivan_fd)
это касается только аппаратных прерываний, а не софтовых.

Да на сколько я помню они все хардовые. Как понимать софтовые, ну не пойму. А что касаемо прерываний гланое правильно сохранять и восстанавливать регистры и не зацикливать их сами на себя. Позабыл сбросить флаг прерывания, и оно ушло само в себя smile . Для этих целей Шпротеус в помощь. В нем эти глюки ловяться на ура !!!!!!


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Klim Дата: Пт, 01.10.2010, 21:57  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Вроде моргать перестало, но и перестало читать температуру. Интуитивно чуствую, что из-за частого прерывания не успевает выполняться основная программа. Я на правильном пути? И как с этим бороться? Вкладываю текущий вариант по выводу 1-й цифры за каждое прерывание.
Прикрепления: 4240687.dsn (160.4 Kb) · 9473349.hex (4.6 Kb) · 0827053.bas (8.6 Kb)
ivan_fd Дата: Пт, 01.10.2010, 22:14  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (DAlexV)
Да на сколько я помню они все хардовые. Как понимать софтовые, ну не пойму. А что касаемо прерываний гланое правильно сохранять и восстанавливать регистры и не зацикливать их сами на себя. Позабыл сбросить флаг прерывания, и оно ушло само в себя smile . Для этих целей Шпротеус в помощь. В нем эти глюки ловяться на ура !!!!!!

Насколько это понимаю я: компилятор Протон, да и PicBasicPro, при софтовом прерывании (когда пишется ON INTERRUPT) при компиляции все равно
переводит все операторы на ассемблер, но при софтовом прерывании, если написать например delayms 2000, то 2 сек. никакого прерывания не произойдет. И точность в этих "софтовых" прерываниях условная. Поэтому, если нужна высокая точность, нужно использовать аппаратные прерывания (ON_INTERRUPT).
И как раз в Протеусе эти глюки не ловились на ура, потому, что они появлялись на доли секунды, и не в Протеусе а реальном устройстве.

retas Дата: Пт, 01.10.2010, 22:36  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Я когда то долго мучился с прерывами - взял от куда то пример, проверил и взял на вечное
пользование (даже и не знаю какой он там у меня), а если мне нужно вставить задержки да чтоб
они не мешали прерывам, так я пишу типа " For d1=1 To 500 : Next : d1=0 " (тут, правда, сразу
не схватишь какая задержка получится, но Протеус мигом просчитает).
DAlexV Дата: Пт, 01.10.2010, 22:45  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Klim)
Интуитивно чуствую, что из-за частого прерывания не успевает выполняться основная программа.

да верно. Слишком часто прерываешься на индикацию. увеличь время на индикацию, или уменьши время на считывание АЦП. И выкинул бы ты этот сдвиговый регистр. Только время на нем теряешь. У самого 16 не задействовано. А COF у тебя бейсик не генерит случайно. С hex особо не поглянешь на программу.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
ЯНДЕКС Дата: 01.10.2010
Klim Дата: Пт, 01.10.2010, 22:48  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

А мысли есть живые, как исправить мой код? smile
DAlexV Дата: Пт, 01.10.2010, 22:52  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Это весь код что будет или нет ????

Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
ivan_fd Дата: Пт, 01.10.2010, 23:09  |                                                                                                                Сообщение # 14
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (retas)
Я когда то долго мучился с прерывами - взял от куда то пример, проверил и взял на вечное
пользование (даже и не знаю какой он там у меня), а если мне нужно вставить задержки да чтоб
они не мешали прерывам, так я пишу типа " For d1=1 To 500 : Next : d1=0 " (тут, правда, сразу
не схватишь какая задержка получится, но Протеус мигом просчитает).

Я для себя написал прерывание на ассемблере, и тоже никаких проблем.

Quote (Klim)
А мысли есть живые, как исправить мой код?

Я же Вам говорил что с хардварными прерываниями будут проблемы.
Вот Ваш исправленый код. Смотрите.

Прикрепления: 1225567.bas (8.6 Kb)
Klim Дата: Пт, 01.10.2010, 23:14  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Огромное спасибо. Изучил. Но все-таки цифирки моргают... Или это только в протеусе?

P.s. Извиняюсь, подправил. Убрал Delayms 20 , и все заработало.
Там выше спрашивали насчет кода - отвечаю: Это код не весь. Примерно 10-я часть. Будет еще связь с другим МК для передачи данных по температуре, плюс управление 3-мя устройствами (2 реле и управление тенами по ПИД)

Сообщение отредактировал Klim - Пт, 01.10.2010, 23:20
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: