Ich probiere schon seit einigen Tagen mein void setup mit einem Taster zu starten, bekomme es aber einfach nicht hin, weil ich keine Ahnung hab wie das geht. Im Internet konnte ich auch nichts finden. Bitte helfen!
Nach Reset des µCs wird setup()
automatisch einmalig durchlaufen, um alle Initialisierungen vornehmen zu können. Danach wird loop()
als Endlosschleife durchlaufen. Abgesehen davon, daß das Drücken des Resettatsers setup()
startet, ergibt Deine Frage leider keinen Sinn. Daher kannst Du darüber auch nichts finden
Wenn Du beschreibst, was Du machen möchtest, wäre eventuell eine Hilfestellung möglich.
Wenn du bestimmte Zeilen im Setup erneut aus dem Programm starten möchtest, kannst du diese Zeilen in eine Funktion auslagern und diese Funktion dann per Taster individuell neu starten.
Evtl. ist es das, was du erreichen möchtest ?
Der Fehler liegt in Zeile 42
Bitte schreibe das nicht. Das ist die Funktion Setup(). void ist der Rückgabetype der Funktion, in diesem Fall "nichts" (=void).
Schreib eine Unterroutine z.b. sub_setup_wiederholen.
Diese ruft du im Setup auf, und in der normalen Loop_schleife wenn der Taster gedrückt wird.
Sind nur 2-3 Zeilen mehr Code.
Sowas Ähnliches mache ich dauernd. Ich setze z.b. die Normal_anzeige des Display am Ende der Setup_routine.
Und rufe selbrige Routine nochmal auf, wenn ich nach einen Untermenü_Punkt wieder die normale Anzeige haben will.
Grundsätzlich gilt bei mir, wenn ich mehr als 5 Zeilen wiederholen muss, wird eine Unterroutine draus. Gilt für ALLE Programmiersprachen in den ich schreibe. Muss man weniger Scrollen und hat den Prg_code besser unter Kontrolle finde ich.
Gruß
Pucki
Setup() sollte nur einmal nach dem reset ausgeführt werden danach nie wieder.
Vielleicht hilft es wenn du 1-2 Schritte zurück trittst und uns einmal erklärst was du vor hast.
Beginne die Funktion setup() einfach mit der Abfrage deines Tasters und warte so lang bis der Taster gedrückt wurde.
Nach Tastendruck machst du mit deinem Programm weiter.
Ach, das ist doch kein Problem!
(aus meiner Wühlkiste, für diesen Zweck angepasst)
// Arduino Mega Pin 2 ist PE4
// modifiziertes blink Beispiel
// main() und damit das setup() wird erst aufgerufen, wenn taster an Pin 2 gedrückt wurde.
void initPE4 (void) __attribute__ ((naked)) __attribute__ ((section (".init3")));
void initPE4 (void)
{
PORTE |= 1 << PE4; // Pulluo ein
}
void haltBisPE4 (void) __attribute__ ((naked)) __attribute__ ((section (".init8")));
void haltBisPE4 (void)
{
while(PINE & (1 << PE4));
}
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Unter "das" verstehst du vermutlich die Frage
"Wie kann ich Code schreiben, der noch vor setup()
aufgerufen wird"
Auch wenn noch nicht klar ist, was der TO eigentlich will, ist die Antwort, wie du auch zeigst:
Mit Arduino gehts nicht, aber man kann in der Arduino - IDE auch nackten avr-gcc Code schreiben, ist dann halt Hardware-abhängig.
Zusätzlich stellt sich mir bei deiner Antwort die Frage nach dem wozu:
Deine Lösung ist doch gleichwertig zu Arduino-Code
void initialWaitForPin(byte pin) {
pinMode(pin, INPUT_PULLUP);
while (digitalRead(pin)) ;
}
void setup() {
initialWaitForPin(2); // warten bis Taster gedrückt wird und nach GND schaltet
// erst dann gehts richtig los:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// BLINK Sketch
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
Warum soll vor setup()
laufen, was doch genauso gut am Anfang von setup()
sein kann ?
Das hat auch @noiasca schon gemeint.
Weiter geraten:
Falls der TO @legacy755 einen Reset simulieren will, ist setup() aufrufen eine schlechte Idee.
Naja...
Die Aufgabe lautete:
setup() soll nach einem Tastendruck ausgeführt werden.
Bei dir wird in setup() geprüft.
Das ist schon ein markanter Unterschied.
Kann natürlich sein, dass in der Frage schon ein Defekt steckt.
Das kann ich nicht beurteilen.
Aber ich weiß:
Im Internet lässt sich alles finden, was zur Lösung der Frage beitragen kann.
Vermutlich weiß das Internet mehr, als jeder hier im Forum.
Durchaus.... Aber ich bin mal gespannt auf die Beschreibung des TO was er wirklich braucht...
Ja, ich auch...
Die Frage wurde leider quasi ohne ihren Kontext gestellt.
Ist damit vermutlich ein XY Problem.
Motto:
Eine Frage sagt oft mehr, als ihre Antwort.
Nicht direkt.
Laut der Frage sollte offensichtlich der automatische Aufruf von setup() unterbunden werden, und damit muss auch der Aufruf von loop() logischer weise unterbunden werden.
Dabei habe ich "setup() starten" mit "setup() aufrufen" gleich gesetzt. Wenn das nicht so gemeint war, möchte ich herzlichst um Verzeihung bitten.
Für eine Lösung unter den "Bedingungen" gibt es leider wenig Spielraum
Ich meine, dass ich das setup mit einem Ein-Taster erneut starten will und nicht mit dem Reset-Knopf, weil ich den Arduino in eine Kiste einbauen will und da halt nicht an den Reset-Knopf drankomme.
Der Controller hat einen Pin mit RST, damit kannst du den Reset auch nach außen führen.
Du willst einen Software Reset machen. Du könntest probieren den Reset-Pin mit einem GPIO zu verbinden und dann mit digitalWrite()
zu arbeiten.
Für den Uno R3 hab ich noch diesen Code gefunden, hab den jetzt aber nicht testen können:
void (* resetFunc) (void) = 0;
...
void loop(){
resetFunc();
}
Du könntest dich auch noch in den Watchdog einlesen.
Bleibt noch die Frage nach dem Warum.
Einwand:
Der Resetimpuls benötigt eine Mindestbreite, laut Datenblatt.
Das abschalten des Pins erfolgt schneller.
Laut einer Atmel Aussage, damals, habe vergessen wo, kann man so keinen zuverlässigen/vollständigen Reset erzeugen.
Auch der Sprung zur Adresse 0 ist bedenklich, da so die Hardware Komponenten nicht zurückgesetzt werden.
Atmel hat damals einen WDC Reset empfohlen, Welcher aber z.B. beim alten Nano zu einer Dauerreset Folge werden kann/wird.
Das Beste dürfte wirklich sein, den Reset Pin nach Außen, auf einen Taster, zu führen.
Ist damit auch meine Empfehlung!
Du brauchst keinen Reset!
Du möchtest endliche Automaten bauen!
Das ist meine ultimative Empfehlung.
Also:
Reset nach außen, die quick and dirty Sache.
Oder Automat, weils besser ist.
Ich glaube, dass ich es mal damit probieren werde.
Vielen Dank!
Es mag Ausnahmen geben, aber eigentlich kannst Du alle Dinge, die Du in setup()
machst, auch in loop()
machen. Beispielsweise in einer Schrittkette (=endlicher Automat, =finite state machine) ist der erste Schritt das Setup, der zweite und alle folgenden Schritte beinhalten Dein normales Programm. Durch einen Druck auf eine Taste gehst Du zum ersten Schritt.