Как заставить две программы работать одновременно ?

FastCat
Offline
Зарегистрирован: 30.01.2014

Заранее прошу прощения за возможно глупый вопрос, т.к. начинающий я.

Есть две программы. Которые по отдельности прекрасно работают.

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);
        }
}

Но в итоге получается так. Сначала работает первая программа, потом заканчивает. Начинает работать вторая программа, и продолжает дальше работать.

Но мне нужно, что бы они вместе и одновременно работали. Как это сделать ?

vlkam
Offline
Зарегистрирован: 17.02.2013

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

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Копипастить вы уже научились - теперь надо учиться программировать.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

вариант "заставить пинками" не подойдет?

axill
Offline
Зарегистрирован: 05.09.2011

ардуина не умеет выполнять паралельные задачи, все задачи выполняются последовательно

есть механизмы услрвно паралельного выполнения - это применения прерываний как от внешних событий так и от внутренних (например заданные таймерами). Условно здесь означает, что логика програмирования при соблюдении ряда условий может програмироваться как для задач выполняемых паралельно, но фактически все равно все выполняется последовательно

xorkrus
Offline
Зарегистрирован: 22.09.2013

Если я правильно понял предыдущих отвечаторов, то надо первые две программы сделать как

void mux(){
...mux code...
}

void tlc(){
...tlc code...
}

Ну и соответственно потом в лупе вызывать mux(); tlc();

Adeni
Offline
Зарегистрирован: 26.01.2014

Распаралеливание задач надо делать по условиям. Т.е. в loop() постоянно проверять условия и выполнять соответствующую процедуру. И при всем этом от delay() внутри процедур тоже нужно уходить, т.к. во время такой задержки вообще никакая программа не выполняется. Нужно делать задержки используя таймер исполнения программы, как в базовом примере DelayWithoutBlink.