мигающий светодиод замедляет работу микропроцессора

Я разработал систему, когда сопротивление потенциометра ниже установленного значения, светодиод мигает led1 = 1; wait(0.2); led1 = 0 wait(0.2)вот что происходит. Мне нужны обе последовательности ожидания, иначе пользователь не увидит никаких изменений. У меня также есть подключенный ЖК-дисплей, когда пользователь нажимает кнопки, ЖК-дисплей меняется для отображения разных вещей. Проблема в том, что это изменение на ЖК-дисплее значительно замедляется до wait(0.2) заявление (задержка 0,2 секунды). Этот вид дает системе чувство запаздывания. Есть идеи, что я могу сделать?

ISR
Сначала я подумал о включении мигающих светодиодов в процедуру прерывания, но быстро понял, что, если пользователь не изменяет значение потенциометра и оно всегда устанавливается на 0, система просто останется в ISR.

голосование
Моя вторая идея состояла в том, чтобы попытаться опросить, заставить светодиод мигать каждые 100 раз, когда он входил в эту функцию. Результаты не были хорошими, это теперь будет замедлять работу системы очень часто. Когда это не замедляло работу системы, это происходило слишком быстро.

-2

Решение

Я хотел бы предположить, что аппаратный таймер и ISR это путь. Задерживая выполнение программы таким, какой вы есть, вы будут «запаздывание» для любой другой обработки, а не только для ЖК-дисплея.

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

2

Другие решения

Вам нужно закончить разработку системы.

Похоже, вы не используете ISR сейчас, и это может работать просто отлично. Вам нужно пройти пути исполнения и понять худшие случаи.

Частично это может быть проблемой набора инструментов + процессора. Если опрос, как вы говорите, вызывает задержку (по сравнению с принудительным циклом ожидания), то это, скорее всего, процессорное время для того, что вы делаете, и будет в ISR. Возможно, я неправильно понял. Если ваш процессор + часы + компилятор + program_language + coding_style и т. Д. Производит что-то, что не может выполнить все задачи за время, необходимое для выполнения задач, добавление большего количества ресурсов (ISR, опрос и т. Д.) Не заставит его работать быстрее. найти реальные проблемы и атаковать их, не просто добавить больше проблем.

Используйте аппаратный таймер, у вас, вероятно, есть. Проходя по основному циклу, вы проверяете, является ли банк малым, истекло ли время таймера или если дельта с последнего времени до текущего времени больше X, затем измените состояние индикатора и продолжайте через цикл, не останавливайтесь на достигнутом и не ждите. Используйте конечный автомат, если он облегчает программирование (для некоторых людей конечный автомат намного сложнее).

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

Если обработчик ISR не проверяет все условия (но решение, не относящееся к isr), добавляет условия, если значение банка в 0 является особым случаем, то есть код для проверки для особого случая. или не включайте прерывание (или отключайте его), если пользователь установил этот случай. Основная проблема программирования, «маленький вопрос программирования», чтобы решить ее.

0

Я не уверен, что именно вы имеете в виду. В связи с наличием wait(0.2) Заявление, обновление LCD очень медленно. Заявление о светодиоде не нужно размещать в ISR. После обновления ЖК-дисплея продолжайте обрабатывать светодиод в главном циклеwhile(1)).

-2
По вопросам рекламы [email protected]