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){
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
}
}
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.
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.
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. :-))
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.