Как заставить две программы работать одновременно ?
- Войдите на сайт для отправки комментариев
Сб, 05/04/2014 - 17:59
Заранее прошу прощения за возможно глупый вопрос, т.к. начинающий я.
Есть две программы. Которые по отдельности прекрасно работают.
1. программа
#include "MUX74HC4067.h"
MUX74HC4067 mux(4, 5, 6, 7, 8);
void setup()
{
mux.signalPin(2, OUTPUT, DIGITAL);
}
void loop()
{
for (byte i = 0; i < 12; ++i)
{
mux.write(i, HIGH);
delay(500);
}
mux.disable();
delay(100);
}
2. программа
#include "Tlc5940.h"
#define NUM_TLCS 1
void setup()
{
Tlc.init();
}
void loop()
{
int direction = 1;
for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {
Tlc.clear();
if (channel == 0) {
direction = 1;
} else {
Tlc.set(channel - 1, 1000);
}
Tlc.set(channel, 4095);
if (channel != NUM_TLCS * 16 - 1) {
Tlc.set(channel + 1, 1000);
} else {
direction = -1;
}
Tlc.update();
delay(10);
}
}
Я так пытаюсь делать:
#include "Tlc5940.h"
#define NUM_TLCS 2
#include "MUX74HC4067.h"
MUX74HC4067 mux(4, 5, 6, 7, 8);
void setup()
{
mux.signalPin(2, OUTPUT, DIGITAL);
Tlc.init();
}
void loop()
{
int direction = 1;
for (byte i = 0; i < 12; ++i)
{
mux.write(i, HIGH);
delay(500);
}
mux.disable();
delay(100);
for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {
Tlc.clear();
if (channel == 0) {
direction = 1;
} else {
Tlc.set(channel - 1, 1000);
}
Tlc.set(channel, 4095);
if (channel != NUM_TLCS * 16 - 1) {
Tlc.set(channel + 1, 1000);
} else {
direction = -1;
}
Tlc.update();
delay(10);
}
}
Но в итоге получается так. Сначала работает первая программа, потом заканчивает. Начинает работать вторая программа, и продолжает дальше работать.
Но мне нужно, что бы они вместе и одновременно работали. Как это сделать ?
Нужно полностью менять логику работы "программ". Они должны выполняться не блоком в одном loop(), а исполнятся маленькими кусочками по необходимости, при каждом вызове loop().
Копипастить вы уже научились - теперь надо учиться программировать.
вариант "заставить пинками" не подойдет?
ардуина не умеет выполнять паралельные задачи, все задачи выполняются последовательно
есть механизмы услрвно паралельного выполнения - это применения прерываний как от внешних событий так и от внутренних (например заданные таймерами). Условно здесь означает, что логика програмирования при соблюдении ряда условий может програмироваться как для задач выполняемых паралельно, но фактически все равно все выполняется последовательно
Если я правильно понял предыдущих отвечаторов, то надо первые две программы сделать как
void mux(){ ...mux code... } void tlc(){ ...tlc code... }Ну и соответственно потом в лупе вызывать mux(); tlc();
Распаралеливание задач надо делать по условиям. Т.е. в loop() постоянно проверять условия и выполнять соответствующую процедуру. И при всем этом от delay() внутри процедур тоже нужно уходить, т.к. во время такой задержки вообще никакая программа не выполняется. Нужно делать задержки используя таймер исполнения программы, как в базовом примере DelayWithoutBlink.