2016-04-13 4 views
2

Я знаю, это будет звучать абсурдно просто. Но я не могу придумать или адекватно определить для поиска, как иметь код на C, чтобы мигающий светодиод шел с постоянной частотой, пока остальная часть программы работает. Установите и забудьте что-нибудь. Сегодня я видел резьбу, хотя для моего базового понимания это казалось немного сложным.Запуск кода во время ожидания кода

Я развиваюсь в Windows и работает на MikroC для PIC18, но имел те же мысли, когда работал над другим проектом Arduino.

+0

Изучите интегрированную среду разработки (IDE). Возможно, Visual Studio уже будет иметь функцию, которая соответствует вашим потребностям (и у них также есть бесплатная версия). –

+0

Знаете ли вы многопоточность? –

+1

На какой ОС вы запускаете программу? – user3386109

ответ

1

Смотрите ответы на Multithreading using C on PIC18

Для разработки стандарта C, для этого потребуется многопоточность, но this answer предлагает использовать цикл событий.

+0

Многопоточность на 8-битных микроконтроллерах - это нонсенс. Ни многопоточные, ни петли событий не нужны для чего-то настолько простого и быстрого, что переключают вывод ввода-вывода. – Lundin

0

В PIC вы не обязательно будете прыгать прямо от чего-то столь же простого, как петли ожидания ожидания, к чему-то сложному, как многопоточные библиотеки, как это предлагается в некоторых комментариях.

Предположим, что вы каждый день мигаете своим светодиодом в цикле. Это дает код в этом цикле (или вызван изнутри этого цикла) почти 1 секунду для выполнения чего-то другого. Если вы можете нарезать эти задачи на такие мелкие кусочки, которые они вписываются в интервал «когда вам нужно вернуться», чтобы мигать светодиод, это начало.

Очевидно, что если вы выполняете произвольный код в мигающем цикле, частота вашего мигания будет зависеть от того, когда будут использоваться другие компоненты кода, и вы больше не сможете использовать процессор в качестве временной базы. Вам нужно что-то другое чтобы проверить, должно ли мигать. У большинства микроконтроллеров есть таймер, который позволяет это сделать. Чтение таймера свободного времени, чтобы проверить, нужно ли «мигать», будет первым простым шагом. Ниже псевдокод:

while (1){ 
    if (((time = readTimer()) - oldTime) > INTERVAL){ 
    /* Timer run-around ignored for reasons of simplicity */ 
    oldTime = time; 
    blink(); 
    } 
    else 
    doSomethingElse(); 
} 

Обратите внимание на somethingElse() должен быть закончен в минимально возможных сроках, как его во время выполнения влияет на точность вашего моргания.

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

+0

Это не даст никакой производительности в реальном времени, что-то-никогда. Даже если 'doSomethingElse' быстрее, чем рабочий цикл мигания, вы получите постоянные задержки на мигающей частоте в интервале 0 <= delay <= time для выполнения' doSomethingElse'. И он использует 8-битный MCU с древним ядром процессора с 1980-х годов, он определенно не должен заглядывать в многопоточные библиотеки. – Lundin

+0

Я пытался заставить OP экспериментировать и, используя небольшие шаги, получить некоторые приемлемые решения. Даже если он * видит * вариации частоты вспышки, он бы чему-то научился (кстати, он не просил о производительности в реальном времени). Предполагая, что речь идет не о контроле робота-марса, это выглядело как приемлемый подход. – tofro

+0

В зависимости от длины задержки петля может вызвать мерцание, достаточно большое для человеческого глаза. Это, как говорится, также очень плохая идея для внедрения _tight connection_ в ваши программы. Ваша петля имеет плотную связь между светодиодным кодом и чем-то совершенно не связанным. Однажды кто-то изменит код сокета TCP/IP, а затем внезапно начнет мигать светодиод «из кофе». Это не то, как вы разрабатываете надежные программы. – Lundin

1

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

int shouldblink = 0; 
int ledstatus = 0; 
void OnTimer(void) /* configure your microcontroller to call this on timer */ 
{ 
    if (ledstatus) 
    { 
     turnoffLED(); 
     ledstatus = 0; 
    } 
    else { 
     if (shouldblink) 
     { 
      turnonLED(); 
      ledstatus = 1; 
     } 
    } 
} 

int main() 
{ 
    configure_timer(); 
    shouldblink = 1; 
    do_slow_work(); 
    shouldblink = 0; 
} 
+0

На PIC ваш 'main' должен лучше не просто бежать до конца, а скорее оставаться в бесконечном цикле. – tofro

1

Просто использовать микроконтроллер оборудование, предназначенное для таких. Выходные таймеры сравнения, аппаратное обеспечение ШИМ и т. Д. Если у вас нет такого оборудования, переключение порта ввода-вывода с прерывания должно быть достаточно точным в большинстве случаев.