На PIC вам не обязательно сразу переходить от чего-то столь простого, как циклы ожидания, к чему-то столь сложному, как многопоточные библиотеки, как предлагается в некоторых комментариях.
Предположим, вы мигаете светодиодом каждую секунду в цикле. Это дает коду в этом цикле (или вызываемому из этого цикла) почти 1 секунду для выполнения чего-то другого. Если вы можете разделить эти задачи на такие маленькие кусочки, чтобы они соответствовали интервалу «когда вам нужно вернуться», чтобы мигать светодиодом, это начало.
Очевидно, что если вы выполняете произвольный код в цикле мерцания, на частоту вашего мигания будет влиять время, затрачиваемое этими другими частями кода, и вы больше не сможете использовать ЦП в качестве временной базы. Вам нужно что-то другое, чтобы проверить, мигает ли должен. У большинства микроконтроллеров есть таймер, который позволяет вам это сделать. Первым простым шагом будет чтение автономного таймера, чтобы проверить, «нужно ли вам моргать». См. ниже псевдокод:
while (1){
if (((time = readTimer()) - oldTime) > INTERVAL){
/* Timer run-around ignored for reasons of simplicity */
oldTime = time;
blink();
}
else
doSomethingElse();
}
Обратите внимание, что somethingElse()
нужно закончить за минимально возможное время, так как время его выполнения влияет на точность вашего моргания.
Если вы все еще хотите, чтобы мигание происходило с точными интервалами, вам следует изучить процедуры обслуживания прерываний. Узнайте, как заставить таймер запускать прерывание с частотой вашего мигания, и выполните мигание в подпрограмме обслуживания прерывания. Это освобождает ваш основной цикл от этого, и вы можете выполнять там любые длительные задачи, которые хотите. Таймер вызовет прерывание на желаемой вами частоте, а процедура обслуживания прерывания включит свет.
person
tofro
schedule
13.04.2016