Arduino mit 2 Hauptschleifen und 2 Setups

Hallo
Ich habe vor 2 Hauptprogramme in einen Arduino zu Programieren.
Am Anfang stehen die Deklarationen und der Hardwaresetup.
danach soll der Arduino in einer Art Hilfsschleife einen Pin lesen und je nach zustand in das jeweilige Programm springen. Pin wird über Jumper gesetzt und nur beim Einschalten gelesen.
die jeweiligen Teilprogramme haben aber noch ein unterschiedliches Setup für Teile der Hardware .
Diese sollen außerhalb des Loop geschehen um nicht jedesmal im Loop die Hardware neu zu Initialisieren.

So in der Art:

#define...
#define...
#define TX/RX 1

void Setup( Start){
Serial beginn...
pinMode(TX/RX,INPUT);
}
void Loop(Start){

currentSwitchState1 = digitalRead(RX/TX);
if( currentSwitchState1 == LOW )
goto Setup RX;
if( currentSwitchState1 == HIGH )
goto Setup TX;
}
void setup (TX){

tue einiges;
}
void loop(TX){

sende einiges;
}

void setup (RX){

tue einiges;

}

void loop(RX){

empfange einiges;

}

hat jemand Lösungsansätze?
Funktioniert dies so in etwa?

Xboom

Zuerst mal ein Sketch darf nur 1 "setup()" und 1 "loop()" enthalten und beide Funktionen haben weder übergebene Werte noch Rückgabewerte.
Andere Funktionen Loop() bzw Setup() zu nennen ist keine gute Idee, weil man da leicht beim lesen durcheinander kommt.
Achtung: setup() und Setup() sind 2 verschiedene Funktionen.
Du denkst zu kompliziert. In C braucht man eigenlich nie den Befehl "goto".

loop()
{
if (digitalRead(pin))
{
mach irgendwas
}
else
{
mach etwas anderes
}
}

Grüße Uwe

Hallo Uwe
Das Problem ist dass ich mit 2 Identischen Geräten 2 Verschiedene Programme laufen lasse.
1x Sender/Datengenerator
1x Empfänger
1 Gerät ist als Sender Programmiert 1 als Empfänger.
Bei Ausfall des Senders/Datengenerators könnte ich den Empfänger benutzen habe aber die Empfängersoftware drauf.
Umprogrammieren kann der Nutzer vor Ort nicht. Aber aufschrauben und einen jumper umstecken und der Datengenerator währe nutzbar nur die Daten müssten dann über Kabel ausgewertet werden.

In Assembler bei Pic-Mikrokontrollern kann ich ja auch mehrere Schleifen deklarieren und nach der Startroutine
über Sprungbefehle in die einzelnen Schleifen springen.

Ich suche eine Variante dass der Arduino nur die jeweilige Schleife abarbeitet ohne mit der anderen Zeit zu verschwenden.Die habe ich leider nicht.
und am Anfang der jeweiligen Schleife muss er einmalig eine Hardwareadresse ändern.

also in der Art:

Startroutine:

RX-Mode
loop{}

oder

TX-Mode
loop{}

hi,

mach erstmal Deine initialisierungen und am ende der setup springst Du je nach jumpersetting in eine von zwei "künstlichen" loop-funktionen.
void setup
...
if jumper == gesetzt loop_1 else loop_2
ende void

void loop_1
while 1==1
...
ende while
ende void

loop_2 baust Du genauso auf und die "richtige" void loop läßt Du leer. oder Du nimmst die jumperabfrage aus der setup in die loop. kommt auf's gleiche raus.

gruß stefan

Hi,

ich bin auch noch ziemlich frisch in der Materie, also alle Angaben ohne Schußwaffe :wink:
was mir aber so spontan einfällt:

Pin wird über Jumper gesetzt und nur beim Einschalten gelesen.

also gehört das in setup()
und dann direkt in setup() noch dein

currentSwitchState1 = digitalRead(RX/TX);
if( currentSwitchState1 == LOW ) {
    // hier das eine Setup
  currentSetup = 1;
}
if( currentSwitchState1 == HIGH ) {
  //hier das andere Setup
  currentSetup = 2;
}

und in loop() dann je nach currentSetup (1 oder 2) was anderes machen lassen ...

übrigens würde ich keinen jumper nehmen, sondern einen dip-switch. dann muß man nichts aufschrauben, kann es aber auch nicht irrtümlich verstellen.

Hi Eisbär
Danke
deine Tipps werde ich mal versuchen.
natürlich ist das ein DIP- Switch aber schön mit aufschrauben. Dann spielt keiner rum und erst nach dem Panikanruf kommt der Hinweis mit aufschrauben. Nutzer sind Schauspieler und die spielen auch gern an Schaltern. Habe da so meine Erfahrungen, also Kindersicher. :-))

Xboom

Ob DIP-Switch oder Steckbrücke merkt dein sketch nicht.
Den nur in setup() auszulesen ist möglich und sinnvoll, wenn die weiteren Funtionen in setup je nach Betriebsart unterschiedlich sind.
Ich würde dann aber eine boolean Variable setzen und in loop trennen:

boolean SENDER;
void setup()
{
    SENDER = digitalRead(RXTX);
    // generelle Initialisierungen für beide Fälle
    if (SENDER) setupSender();
    else setupReceiver();
}
void loop()    
{
  // generelle Funktionen für beide Fälle
  if( SENDER) loopSender();
  else  loopReceiver();
}

setupSender/loopSender bzw. setupReceiver/loopReceiver kannst du in eigene Dateien schreiben in extra tabs in Arduino, für mehr Übersichtlichkeit.
Gemeinsame Definitionen in eine eigene include Datei.

Ach ja, wirst du hoffentlich schon gemerkt haben:

  • RX/TX ist kein gültiger Name.
  • Pin 1 ( am Arduino UNO ist für Serial reserviert, wenn irgendwas anderes frei ist, nimm das.

Im Loop zu trennen ist die bessere Idee weil dadurch auch der "unsichtbare" Teil außerhalb des Loops noch korrekt prozessiert wird. Wer will kann auch noch das dauernde Prozessieren des IF Statements wegoptimieren. (Was auch sinnvoll wäre weil ja sonst setup und loop nicht zusammenpassen falls die Brücke nach dem Init gezogen wird.

boolean is_sender() {
    static initial_state = digitalRead(RXTX) == HIGH;

    return initial_state;
}

void setup_sender() {}

void loop_sender() {}

void loop_receiver() {}

void setup_receiver() {}

void setup() {
    if (is_sender) {
        setup_sender();
    } else {
        setup_receiver();
    }
}

void loop () {
    static void (*the_loop)(void) = is_sender()? loop_sender: loop_receiver;
    
    the_loop();  
}

Und wer keine Funktionspointer mag programmiert in loop() genauso wie in setup :wink:

Danke an Alle

Hier meine Variante

#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>


#define BUTTON1  3
#define BUTTON2  4
#define BUTTON3  5
#define BUTTON4  6
#define BUTTON5  7
#define BUTTON6  8
#define TXRX    9
#define Sendled  A0

int pot1;
int pot2;
int note1=48;
int note2=50;
int note3=52;
int note4=53;
int note5=55;
int note6=57;
int Velo;
int Velor;

//*****************
// Variables
int switchState1 = HIGH;
int switchState2 = HIGH;
int switchState3 = HIGH;
int switchState4 = HIGH;
int switchState5 = HIGH;
int switchState6 = HIGH;
int currentSwitchState1 = HIGH;
int currentSwitchState2 = HIGH;
int currentSwitchState3 = HIGH;
int currentSwitchState4 = HIGH;
int currentSwitchState5 = HIGH;
int currentSwitchState6 = HIGH;
boolean SENDER;
//****************************




//*******************************************************************
RF12 RF12;


void setup() {
  
  Serial.begin (31250);  //(31250);     // Midi Baudrate
  pinMode(Sendled,OUTPUT);
  pinMode(9,INPUT);
  SENDER = digitalRead(TXRX); 

    if (SENDER) {
    rf12_initialize(20, RF12_868MHZ, 8);
    pinMode(BUTTON1,INPUT);
    pinMode(BUTTON2,INPUT);
    pinMode(BUTTON3,INPUT);
    pinMode(BUTTON4,INPUT);
    pinMode(BUTTON5,INPUT);
    pinMode(BUTTON6,INPUT);
  
    digitalWrite(BUTTON1,HIGH);
    digitalWrite(BUTTON2,HIGH);
    digitalWrite(BUTTON3,HIGH);
    digitalWrite(BUTTON4,HIGH);
    digitalWrite(BUTTON5,HIGH);
    digitalWrite(BUTTON6,HIGH);
    Serial.print("\n[Midi Transmitter]");
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
     delay (200);
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
     delay (200);
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
     delay (200);
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
    }
    
    else {
    rf12_initialize(21, RF12_868MHZ, 8);
    Serial.print("\n[Midi receiver]");
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
     delay (200);
     digitalWrite(Sendled,HIGH);
     delay (200);
     digitalWrite(Sendled,LOW);
    }
}
void loop()    
{
 
  if( SENDER) loopTransmitter();
  else  loop_receiver();
}

Xboom