Arduino hängt sich auf

Hallo liebes Forum,
Ich habe eine Stoppuhr programmiert welche mit einer 7 Segment
Anzeige funktioniert. Das Datenblatt der Anzeige findet ihr in den ersten Zeilen des Programms.
Verwendet habe ich einen Arduino Nano aus China aber der Fehler tritt in ähnlicher Weise auch auf meinem Originalen Arduino UNO auf. Und zwar ich kann ganz Normal stoppen. Wenn ich den einen Taster drücke, startet sich und gibt mir Feedback. Und wenn ich dann den anderen Taster drücke stoppt sich und gibt mir auch Feedback. Dann zeigt sie mir auch die richtige Zeit an, aber nur für etwa eine Sekunde, Geht nichts mehr auser de Doppelpunkt der Dauerhaft eingeschalten ist und vieleicht noch von der letzten Ziffer ein paar Striche. Wenn ich den Arduino nicht resete geht gar nichts mehr. an sich wäre es nicht schlimm wenn er sich aufhängt was ich vermute, aber in einer Sekunde kann ich die Zeit nicht wirklich ablesen. Ich habe gedacht dass es ihm vielleicht zu schnell geht, daraufhin habe ich die Wartezeit zwischen den Anzeigen verändert(gespeichert in sw) aber er hängt sich nach DERSELBEN ANZAHL DER DURCHLÄUFEN wieder auf. Das konnte ich herausfinden wie ich eine Serielle Rückmeldung an den Computer eingerichtet habe. Es waren genau 1434 Durchläufe. Ach ja wenn die Serielle Verbindung besteht, hält der Arduino nicht so lange durch als wenn ohne.

//Stoppuhr fuer eine 7 Segment Anzeige
//Link zur 7 Seg. Anzeige: Datenblatt: https://cdn-shop.adafruit.com/datasheets/1264datasheet.pdf
//                        Amazon Link: https://www.amazon.de/Adafruit-7-Segment-Uhranzeige-rot-Extra-Zeichenh%C3%B6he/dp/B00T31OKY4/ref=mp_s_a_1_33?__mk_de_DE=%C3%85M%C3%85Z%C3%95%C3%91&qid=1537815361&sr=8-33&pi=AC_SX236_SY340_FMwebp_QL65&keywords=7+segment+anzeige&dpPl=1&dpID=51JmMCHtsXL&ref=plSrch
// pin Verbindungen
// Polarität      PIN BEZEICHNUNG      ARDUINO PIN
/* A = 7
* B = 8
* C = 9
* D = 3
* E = 5
* F = 6
* G = 4
* Dezimalpunkt = 2
* Doppelpunkt = 13
* COM 1 = 1
* COM 2, DIG 1 = 12
* COM 3, DIG 2 = 11
* COM 4, DIG 3 = 10
* COM 5, DIG 4 = 0
* 
* 
* 
* 
*/

/* Folgende Pins müssen auf HIGH geschalten werden, damit eine Zahl erscheint
eins[2] = 9,3;
zwei[5] = 8,9,4,6,5;
drei[5] = 8,9,4,3,5;
vier[4] = 7,9,4,3;
funf[5] = 8,7,4,3,5;
sechs[6] = 8,7,4,3,5,6;
sieben[3] = 8,9,3;
acht[7] = 3,4,5,6,7,8,9;
neun[6] = 3,4,5,7,8,9;
nul[6] = 3,5,6,7,8,9;
*/

// Damit die Stoppuhr nicht 2mal startet überprüft
//sie den Wert und setzt ihn dann in die andere Bedienung
int i = 0;
// Diese Werte werden zum Speichern der Zeiten benötigt
unsigned long start, ende, ergebnis;
// In diesen Werten werden die Ziffern fuer die 7 Seg Anzeige gespeichert
// Also aus 13 Sekunden werden dann 1zs und 3s
int zs, s, ds, cs;
// DAs ist die Pause für die Anzeige bevor die nächste Ziffer geladen wird
int sw = 7;
// a ist die Definierung welche Anzeige Ziffer der 7 Seg Anzeige geladen wird
int a = 1;
//Mir ist dann eingefallen dass ich vielleicht den Loopteil bei jedem Durchgang
// Einbinden sollte und hab dann w wingeführt
// wenn w 1 ist soll im Loopteil die Stoppuhr ausgefürt werden wenn aber 0 soll wieder der
// Verwaltungsteil aufgerufen werden
int w = 1;

void setup() {
 pinMode(A0, INPUT);
 pinMode(A2, INPUT);
 pinMode(0, OUTPUT);
 pinMode(1, OUTPUT);
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
 digitalWrite(0, HIGH);
 digitalWrite(1, HIGH);
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(10, HIGH);
 digitalWrite(11, HIGH);
 digitalWrite(12, HIGH);
 digitalWrite(13, LOW);
 digitalWrite(2, HIGH);
 digitalWrite(1, LOW);
}

void loop() {
 if (w == 0){       // Überprüfung ob Stoppuhr oder Anzeige
   verwaltung();
 }
 
 if ((analogRead(A0) > 300) && (i == 0)){
   start = millis(); //Startet Stoppuhr
   digitalWrite(0, LOW);  // Gibt Benutzer ein Zeichen dass die Stoppuhr gestartet ist
   digitalWrite(1, LOW);
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
   digitalWrite(13, HIGH);
   delay(100);
   digitalWrite(0, HIGH);
   digitalWrite(1, HIGH);
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, HIGH);
   digitalWrite(11, HIGH);
   digitalWrite(12, HIGH);
   digitalWrite(13, LOW);
   i = 1;
 }
 if ((analogRead(A2) > 300) && (i == 1)){
   ende = millis(); // stoppt die Stoppuhr
   digitalWrite(0, LOW); // Gibt Benutzer ein Zeichen, dass die Stoppuhr fertig ist
   digitalWrite(1, LOW);
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, HIGH);
   digitalWrite(6, HIGH);
   digitalWrite(7, HIGH);
   digitalWrite(8, HIGH);
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
   digitalWrite(13, HIGH);
   delay(100);
   digitalWrite(0, HIGH);
   digitalWrite(1, HIGH);
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, HIGH);
   digitalWrite(11, HIGH);
   digitalWrite(12, HIGH);
   digitalWrite(13, LOW);
   i = 0;
   auswertung(); //Ergebnis berechnen
   
 }
}
void auswertung(){
 ergebnis = ende - start;
 zs = ergebnis / 10000;
 if (zs > 9){ //Wenn länger als 100 Sekunden gestoppt wird, fängt sie von 0 an
   zs = 0;
 }
 s = ergebnis / 1000 - (zs * 10);
 ds = ergebnis / 100 - (s * 10);
 cs = ergebnis - (s * 10);
 digitalWrite(1, LOW);
 digitalWrite(13, HIGH);
 w = 0;
 verwaltung();
}

void verwaltung(){// Überprüfung welche Ziffer angezeit werden soll
 //Serial.println("DA");
   if (a == 1){
      anzeige1();
   }
   if (a == 2){
     anzeige2();
   }
   if (a == 3){
     anzeige3();
   }
   if (a == 4){
     anzeige4();
   }
}
void anzeige1(){// dementsprechender Pin wird auf 0 gesetzt und dann wird zur ZAhlenbildung weitergeleitet
 //Ziffer 1
 Serial.println("1");
 a = 2;
 digitalWrite(12, LOW);
 if (zs == 1){
   fall1();
 }
 if (zs == 2){
   fall2();
 }
 if (zs == 3){
   fall3();
 }
 if (zs == 4){
   fall4();
 }
 if (zs == 5){
   fall5();
 }
 if (zs == 6){
   fall6();
 }
 if (zs == 7){
   fall7();
 }
 if (zs == 8){
   fall8();
 }
 if (zs == 9){
   fall9();
 }
 if (zs == 0){
   fall10();
 }
}

void anzeige2(){
 //Ziffer 2
 Serial.println("2");
 a = 3;
 digitalWrite(11, LOW);
 if (s == 1){
   fall1();
 }
 if (s == 2){
   fall2();
 }
 if (s == 3){
   fall3();
 }
 if (s == 4){
   fall4();
 }
 if (s == 5){
   fall5();
 }
 if (s == 6){
   fall6();
 }
 if (s == 7){
   fall7();
 }
 if (s == 8){
   fall8();
 }
 if (s == 9){
   fall9();
 }
 if (s == 0){
   fall10();
 }
}

void anzeige3(){
 //Ziffer3
 Serial.println("3");
 a = 4;
 digitalWrite(10, LOW);
 if (ds == 1){
   fall1();
 }
 if (ds == 2){
   fall2();
 }
 if (ds == 3){
   fall3();
 }
 if (ds == 4){
   fall4();
 }
 if (ds == 5){
   fall5();
 }
 if (ds == 6){
   fall6();
 }
 if (ds == 7){
   fall7();
 }
 if (ds == 8){
   fall8();
 }
 if (ds == 9){
   fall9();
 }
 if (ds == 0){
   fall10();
 }
}

void anzeige4(){
 //Ziffer4
 Serial.println("4");
 a = 1;
 digitalWrite(0, LOW);
 if ((cs > 9) && (cs < 20)){
   fall1();
 }
 if ((cs > 19) && (cs < 30)){
   fall2();
 }
 if ((cs > 29) && (cs < 40)){
   fall3();
 }
 if ((cs > 39) && (cs < 50)){
   fall4();
 }
 if ((cs > 49) && (cs < 60)){
   fall5();
 }
 if ((cs > 59) && (cs < 70)){
   fall6();
 }
 if ((cs > 69) && (cs < 80)){
   fall7();
 }
 if ((cs > 79) && (cs < 90)){
   fall8();
 }
 if ((cs > 89) && (cs < 100)){
   fall9();
 }
 if ((cs > -1) && (cs < 10)){
   fall10();
 }
}

Teil 1 zu Ende da sonst zu lang

Teil 2

// Hier werden die Zahlen ausgegeben für die Zeit sw, danach wird alles in Ausgangszustand gesetzt und in den LOOP
//teil gewechselt der wieder in die Verwaltung wechselt
void fall1 (){
 digitalWrite(9, HIGH);
 digitalWrite(3, HIGH);
 delay(sw);
 digitalWrite(9, LOW);
 digitalWrite(3, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall2(){
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(5, HIGH);
 delay(sw);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(4, LOW);
 digitalWrite(6, LOW);
 digitalWrite(5, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall3(){
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(3, HIGH);
 digitalWrite(5, HIGH);
 delay(sw);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(4, LOW);
 digitalWrite(3, LOW);
 digitalWrite(5, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall4(){
 digitalWrite(7, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(3, HIGH);
 delay(sw);
 digitalWrite(7, LOW);
 digitalWrite(9, LOW);
 digitalWrite(4, LOW);
 digitalWrite(3, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall5(){
 digitalWrite(8, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(3, HIGH);
 digitalWrite(5, HIGH);
 delay(sw);
 digitalWrite(8, LOW);
 digitalWrite(7, LOW);
 digitalWrite(4, LOW);
 digitalWrite(3, LOW);
 digitalWrite(5, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall6(){
 digitalWrite(8, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(3, HIGH);
 digitalWrite(5, HIGH);
 digitalWrite(6, HIGH);
 delay(sw);
 digitalWrite(8, LOW);
 digitalWrite(7, LOW);
 digitalWrite(4, LOW);
 digitalWrite(3, LOW);
 digitalWrite(5, LOW);
 digitalWrite(6, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall7(){
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(3, HIGH);
 delay(sw);
 digitalWrite(9, LOW);
 digitalWrite(8, LOW);
 digitalWrite(3, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall8(){
 digitalWrite(3, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(5, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 delay(sw);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall9(){
 digitalWrite(3, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(5, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 delay(sw);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
 digitalWrite(7, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

void fall10(){
 digitalWrite(3, HIGH);
 digitalWrite(5, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(7, HIGH);
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 delay(sw);
 digitalWrite(3, LOW);
 digitalWrite(5, LOW);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 if (a == 2){
   digitalWrite(12, HIGH);
   loop();
 }
 if (a == 3){
   digitalWrite(11, HIGH);
   loop();
 }
 if (a == 4){
   digitalWrite(10, HIGH);
   loop();
 }
 if (a == 1){
   digitalWrite(0, HIGH);
   loop();
 }
}

Ich hoffe mir kann jemand von euch einen Tipp geben wie ich es schaffe, dass er sich nicht mehr aufhängt.

Hast du den Sketch auch "gut dokumentiert", damit man erkennen kann, wo und was passiert ?
So sucht man sich ja nen Wolf.

Hallo

ich kenne die Anzeige nicht. Gibts für das Ding keine Lib zum Ansteuern das was Du da hast ist doch ziemlich ???

fuktioniert Deine Stoppur ohne die Anzeige, z.B mit dem Monitor ohne Probelme ?

Hallo,

Ich hab den Code mal überflogen. Da sind ein paar loop() aufrufe in anderen funktionen. Mit return true; verläßt Du die Funktion wieder was Dich auch in die loop zurückwirft.
Die Variable sw ist auf 7 eingestellt, das sind 7ms für die Anzeige. Gib da mal sw = 5000 ein dann bleibt die Anzeige für 5 Sekunden aktiviert aber eigentlich solltest Du das nicht mit einem delay() lösen sondern mit millis(), eines nach dem anderen. <- Beispiel: BlinkWithoutDelay

Ohne zu Wissen für was welcher Pin gut ist, ist es schwer zu sagen wo der Fehler liegt. Der Code ist ja mal: :o

Grüße,
Donny
Nachtrag: Ich hab alle loop()'s rausgeschmissen, da hängt sich nichts mehr auf. Ich kann das nur auf der Seriellen Konsole testen. Da läuft es und läuft immer noch. :slight_smile:

Ich weiß der Code ist lang aber wenn man sich etwas damit beschäftigt ist er einfach aufgebaut. Die Stoppuhr funktioniert komplett also sie kann das richtige Ergebnis anzeigen Am PC als auch auf dem 7 Seg. Display. Nur das Problem ist wenn der Arduino die Zeit dann anzeigen soll, sollte er das für immer machen, bis ich ihn dann über den Resettaster Resete oder vielleicht auch später über den Start oder Stoptaster. Aber das macht er nicht. Er Zeigt die Zeit für etwa 1 Sekunde an. Dann ist das Display Schwarz(bis auf den Doppelpunkt der dauerhaft eingeschaltet ist). Und wenn ich noch dazu schreibe er soll mir über seriell die gestoppte Zeit übertragen macht er das auch für etwa 1 Sekunde immer die gleiche Zeit was normal ist, aber dann bekomme ich nur noch Sonderzeichen zugeschickt, und dass bis ich ihn wieder resete. Und ich habe leider keine Libary dafür. DIe Pinverbindungen sich im Programm ganz oben zu finden und falls der Code nicht ausreichend beschriftet ist kann ich ihn morgen nochmal besser reinschicken. Und dony, JA wenn ich sw auf 5000 stelle bleibt die Anzeige länger an. ABer 1. Das heißt dann, dass alle 5 Sekunden eine andere Ziffer angezeit wird. und 2. Ich habe es mit 1000 ausprobiert und er hat dann auch irgendwann wieder abgebrochen. Denn wenn ich den Wert auf 7 habe dann zeigt er es ca. 1Sekunde an aber ist der Wert auf 1 dann zeigt er es nur 1siebtel der 1 Sekunde an. Also meine Vermutung ist, dass er sich nach einer gewissen anzahl an Durchläufen aufhängt, aber warum???

Hallo,

Ja wenn man sich den Code ein bissi anschaut ist er leichter aufgebaut als gedacht.

allzeittechniker:
...dass er sich nach einer gewissen anzahl an Durchläufen aufhängt, aber warum???

Wie ich oben nur Nachgetragen habe, die Abbrüche kommen sicher von den ganzen loop() Aufrufen die alle ineinander Verschachtelt werden das könnte der Grund sein. Ich hab das bei mir getestet, halt nur auf der Seriellen Schnittstelle und ohne den loop's lief es ohne Probleme, mit den Code von Dir gabs sehr schnell Probleme. Schmeiß die mal alle raus, Du wirst eh wieder in die loop zurückgeworfen.

void fall2(){
 digitalWrite(8, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(5, HIGH);
 delay(sw);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(4, LOW);
 digitalWrite(6, LOW);
 digitalWrite(5, LOW);

Was wird auf der 7-seg. Anzeige angezeigt, nur eine Zahl? Wenn ja, dann schaltest Du diese hier nach 7ms wieder ab.
Bedeutet fall1(), fall2() der Buchstabe 1 oder 2? Und wird dieser auch an der richtigen Stelle der 4x7seg. Anzeige angezeigt?

Grüße,
Donny
Edit: Danke combie, das dachte ich mir.

nach einer gewissen anzahl an Durchläufen aufhängt, aber warum???

Du solltest die Antworten lesen!

Da sind ein paar loop() aufrufe in anderen funktionen.


Du hast dir da eine prächtige indirekte Rekursion gebaut.

Und genau die bricht dir das Genick!

Der klassische Stack Überlauf.
Ein Parade Beispiel.

Super Danke!!!
Ich habe jetzt alle loop Verknüpfungen bei den Fälle weggemacht und es funktioniert.
Danke an alle die sich damit beschäftigt haben, denn das Programm ist wirklich nicht sehr übersichtlich.

Mit freundlichen Grüßen,

Allzeittechniker

allzeittechniker:
denn das Programm ist wirklich nicht sehr übersichtlich.

Das kannst Du ja noch ändern.
Grüße Uwe