[ERLEDIGT] Nur eine 7-Segment-Anzeige leuchtet

Guten Morgen

Ich versuche einen Sketch zu schreiben für Zeitmultiplexing und 2 7-Segment-Anzeigen. Soweit läuft der Sketch auch. Also Zahlen werden vernünftig angezeigt und so. Jedoch ist mein Problem, dass bei 2 Stelligen Ziffern immer nur die zuletzt angesprochene Segment-Anzeige leuchtet. Wenn ich an der entsprechenden Stelle eines der beiden Segmente auskommentiere zeigt mir das 1. Segment sauber die Zehnerstelle an und andersherum das 2. Segment die Einerstelle. Nur zusammen wollen sie nicht arbeiten. Wo habe ich meinen Fehler?

Hier mein Code:

else if(number >= 10){
 // Segmente ausgeben
 for(byte i=0; i <= 7; i++) {
 /*
 * Abhängig ob nun erst die 1er-Stelle oder die 10er-Stelle geschrieben 
wird, wird nur die zu letzt
 * ausgegebene Zahl angezeigt. Merkwürdigerweise versucht de Arduino beide 
Zahlen in einer Anzeige Darzustellen
 * wenn das "delay()" groß bzw. hoch genug ist. Bei delay(1000)lässt es 
sich gut sehen.
 */
 //Freigabe für 1. Anzeige (10er-Stelle
 digitalWrite(seg1, HIGH);
 digitalWrite(seg2, LOW);
 // Schreibt am Pin den zugehörigen BitWert
digitalWrite(segpins[i], bitRead(digits[((number%100)/10)],i));
 //delay(100);
 // Freigabe für 2. Anzeige (1er-Stelle)
 digitalWrite(seg2, HIGH);
 digitalWrite(seg1, LOW);
 // Schreibt am Pin den zugehörigen BitWert
 digitalWrite(segpins[i], bitRead(digits[((number%10))],i));
 }
 }

P.S.

Weshalb muss ich 8 Mal meine Nachricht hier eingeben, damit sie einmal vollständig angezeigt wird?

WBergmann:
Guten Morgen

Ja…genau.
Sehr schön, danke.

Edit:
Weil du vermutlich einen Fehler gemacht hast.

Und dein Sketch ist schlecht zu lesen, da es keine Formatierung gibt.

Auch ist es nur ein Code-Fragment. meist liegt der Fehler im geheimen Teil.

Naja, den Fehler bei der Nachrichtverfassen ist mir aufgefallen. Emojis vom Smartphone werden nicht angenommen und der ganze nachfolgende Text dann abgeschnitten.

Ich kopiere den Code formatiert und füge ihn ein. Und selbst nach dem Einfügen lässt es sich nur eingeschränkt bearbeiten… besser geht es nicht:

else if(number >= 10){
    // Segmente ausgeben
    for(byte i=0; i <= 7; i++) {
 /*
   * Abhängig ob nun erst die 1er-Stelle oder
   *die 10er-Stelle geschrieben
   *wird, wird nur die zu letzt
   * ausgegebene Zahl angezeigt.
   *Merkwürdigerweise versucht de Arduino beide
   *Zahlen in einer Anzeige Darzustellen
   * wenn das "delay()" groß bzw. hoch genug ist.
   *Bei delay(1000)lässt es sich gut sehen.
   */

    //Freigabe für 1. Anzeige (10er-Stelle
    digitalWrite(seg1, HIGH);
   digitalWrite(seg2, LOW);

   // Schreibt am Pin den zugehörigen BitWert
       digitalWrite(segpins[i],bitRead(digits[((number%100)/10)],i));

   //delay(1000);

   // Freigabe für 2. Anzeige (1er-Stelle)
   digitalWrite(seg2, HIGH);
   digitalWrite(seg1, LOW);

   // Schreibt am Pin den zugehörigen BitWert
   digitalWrite(segpins[i],     bitRead(digits[((number%10))],i));
   }
 }

Das der Fehler woanders liegt, ist nicht möglich. Denn 1. wie geschrieben funktioniert es sofern die Segmente einzeln angesteuert werden und 2. gibt es im Grunde nur noch die If-Abfrage für den Fall das die Zahl kleiner 10 ist. Also ist es so gesehen der ganze code.

WBergmann:
Zeitmultiplexing und 2 7-Segment-Anzeigen.

Bei Zeitmultiplexing wird immer nur eine Anzeige angesteuert, aber alle Ziffern so schnell nacheinander,
dass das Auge meint, alle gleichzeitig zu sehen.

Mit dem Einstreuen von delay() oder einem blockierenden Umfeld verhinderst du das effektiv.

Ähm... was meinst Du mit einer Segmentanzeige? Meinst Du Segment um eine Einstellige Zahl darzustellen oder ein Segment wo mehrstelligezahlen dargestellt werden?

Denn für einstelligen Zahlen brauche ich nur eine Schleife. Also reden wir wohl vom Selben.

Also entweder hast Du etwas an meine Frage nicht verstanden und nicht nachgefragt oder Du hast dich für mich nicht deutlich genug ausgedrückt.

Aber ganz gewiss hast Du meine Frage und meinen Code-Schnipsel nicht gelesen. Denn sonst würdest Du merken, dass dein Posting nicht wirklich was zur Sache beiträgt.

WBergmann: Aber ganz gewiss hast Du meine Frage und meinen Code-Schnipsel nicht gelesen. Denn sonst würdest Du merken, dass dein Posting nicht wirklich was zur Sache beiträgt.

Irrtum.

Ich habe dir den Grund für das Verhalten deines Programms genannt.

Wenn du das nicht hören willst, auch gut.

Viel Erfolg noch.

Wo hast Du Grund genannt? Also doch wie ich schon geschrieben habe, dass Du dich für mich nichtvdeutlich ausgedrückt hast.

Meine 2 7-Segment-Anzeigen fungieren ja als eine. Alle LEDleitungen teilen sich die Anzeigen... also frage ich noch einmal was verstehst Du unter ein oder 2 Segmentanzeigen?

In meinen Posts kommt "Segmentanzeigen" nicht vor, kann ich dir also nicht erklären.

Der POV Effekt entsteht, wenn die Wechsel zwischen einzeinen Anzeigen schneller als ca 25x in der Sekunde stattfindet.

Das heisst, das maximale Delay zwischen zwei aufeinanderfolgenden Darstellungen darf 40 ms nicht überschreiten.

*Bei delay(1000)lässt es sich gut sehen.

1000 ist deutlich größer als 40, oder bei dir nicht?

  1. ist das delay bei mir auskommentiert und 2. ist es von mir zum Verdeutlichen drin.

Mir ist es auch bewusst 1000ms zu heftig sind... aber da sieht man sehr schön was ich im Kommentar beschrieben habe.

Wie gesagt, hat das delay keine Bewandnis im eigentlichen Programmablauf, da es auskommentiert ist.

Da kommt das nicht gepostete Umfeld ins Spiel.

Das muss dein Schnipselchen of genug aufrufen, und das - meine Vorhersage - tut es nicht.

Poste den gesamten Kode, auch wenn du irrtümlicherweise meinst

Das der Fehler woanders liegt, ist nicht möglich.

Entferne bitte auch alle auskommentierten Zeilen, die du nicht beabsichtigst (später/testweise) in deinem Kode zu verwenden, das erhöht die Lesbarkeit, ein Strg-T in der IDE kann die auch erhöhen.

Ich habe sehr wenig Erfahrung mit dem programmieren, aber das dein Sketch beschissen zu lesen und unvollständig ist erkenne sogar ich.

Auch dein Auftreten hier lässt sehr zu wünschen übrig.

Delay ist auskommentiert, ja klar, jetzt, aber wenn du schreibst das es mit lesbar ist, dann steht es auch mal drin.

Noch ein Punkt, wie soll man an seinem eigenen System deinen Sketch testen wenn du nicht alles preisgibst?

Egal, es war bzw. ist ja schon immer einfacher die Fehler bei anderen zu suchen.

Ich wünsche dir noch viel Erfolg, auf deinen einsamen Wegen.

MiReu

Dein Problem ist, dass Du die Segmente vor dem Umschalten der Anzeige nicht wieder ausschaltest. Das Zeitmultiplexing von 2 7-Segmentanzeigen erfordert ein getaktetes Timing: Anzeige auswählen, Segment einschalten und für eine definierte Zeit eingeschaltet lassen. Dann wieder ausschalten, Anzeige umschalten, dort das entsprechende Segment schalten und ebenfalls für eine definierte Zeit eingeschaltet lassen. Leider zeigst Du uns deine Schaltung nicht. Kannst Du bei jeder Anzeige alle notwendigen Segmente gleichzeitig einschalten? Dann solltest Du das Ganz umdrehen: erst für eine Anzeige alle notwendigen Segmente einschalten und eine definierte Zeit anlassen. Ausschalten, Anzeige wechseln und dann dort alle notwendigen Segmente einschalten und für die definierte Zeit anlassen.

Was fehlt ist die saubere Taktung für das Zeitmultiplex.

P.S. dein Aufreten hier ist in der Tat nicht dazu geeignet, dass man dir gerne hilft.

@MicroBahner

Ich danke Dir für deine freundliche Hilfe. Wie Du schriebst, fehlte tatsächlich nur die Taktung bzw. das ich die einzelnen Segmente wieder ausschalte.

Wie ich geschrieben hatte, an dem Code-Schnippsel hat es gelegen.

@Alle anderen

Weshalb wollt ihr ständig irgendwelche Codes als erstes sehen? Ihr solltet mal bissl weniger fordernd sein und dann werden Menschen wie ich gewiss auch nicht pampig. Oder seid ihr nur süchtig nach neue Codes um nicht selber nachdenken zu müssen?

Wie dem auch sei, mein Problem ist nun keins mehr und von daher kann dieser Thread geschlossen werden. (Macjen es die Admins oder muss ich das irgendwo machen?)

Wünsche euch noch einen schönen Abend

WBergmann: @Alle anderen

Weshalb wollt ihr ständig irgendwelche Codes als erstes sehen? Ihr solltet mal bissl weniger fordernd sein und dann werden Menschen wie ich gewiss auch nicht pampig. Oder seid ihr nur süchtig nach neue Codes um nicht selber nachdenken zu müssen?

Wir haben die Erfahrung gemacht, dass in >80% der Anfragen, bei denen es nur einen Codeschnipsel gibt, das Problem im unbekannten Rest des Codes liegt. Deshalb wollen wir den ganzen Code sehen, um nicht unsere Zeit sinnlos zu vergeuden. Wir machen das nicht gegen Stundenlohn!

Wenn Dir das nicht gefällt - es zwingt Dich keiner unsere Hilfe zu beanspruchen.

Gruß Tommy

WBergmann: Ich danke Dir für deine freundliche Hilfe.

Bitte schön :D

WBergmann: Weshalb wollt ihr ständig irgendwelche Codes als erstes sehen? Ihr solltet mal bissl weniger fordernd sein und dann werden Menschen wie ich gewiss auch nicht pampig.

Wie Tommy schon schrieb, kommt die Forderung aus der Erfahrung heraus - und manchmal vielleicht auch etwas vorschnell, ja. Aber mit pampigen Antworten darauf förderst Du die Lust dir zu helfen nicht gerade.

WBergmann: Oder seid ihr nur süchtig nach neue Codes um nicht selber nachdenken zu müssen?

Mit so einer Bemerkung geht die Lust dann gleich ganz auf Grundeis. Immerhin möchtest Du von uns Hilfe und nicht umgekehrt.

WBergmann: Wie dem auch sei, mein Problem ist nun keins mehr und von daher kann dieser Thread geschlossen werden. (Macjen es die Admins oder muss ich das irgendwo machen?)

Threads werden in der Regel nicht geschlossen. Das kommt höchstens mal in ganz seltenen Fällen vor, wenn ein Thread ganz aus dem Ruder läuft. Du kannst deinen Startpost editieren und vor den Titel ein [Erledigt] stellen, dann weis jeder, dass Du keine weitere Hilfe benötigst.

WBergmann: Oder seid ihr nur süchtig nach neue Codes um nicht selber nachdenken zu müssen?

Glaubst du wirklich die Leute hier brauchen dich dazu um sinvolle Code zu schreiben??

Vonn was träumst du Nachts, wenn du schon solche Tagträume hast??

Franz

Hi

WBergmann: @Alle anderen

Weshalb wollt ihr ständig irgendwelche Codes als erstes sehen?

Das hat, unter Anderem, aber auch damit zu tun, daß man nicht dümmer wird und mit einem funktionierendem GANZEN Code kann man die geschilderte Lösung genau so 1:1 übernehmen - man muß das Rad nicht jedes Mal neu erfinden.

MfG

mit einem funktionierendem GANZEN Code kann man die geschilderte Lösung genau so 1:1 übernehmen

Sehr selten bis gar nicht, denke ich, werden Lösungen 1:1 übernommen. Ist allerdings ein besseres Gefühl, wenn man weiss, dass es genau so schon mal irgendwo funktioniert haben muss. Man sucht Fehler dann eher bei den eigenen Modifikationen :)

ProgrammCode oder der Sketch wird auch gern mal überbewertet. So schlimm wie falsches Hardwaredesign oder eine kalte Lötstelle ist ein Programmierfehler selten :)

Hier im Forum bin ich eigentlich immer für reduzierte Sketche, die genau das Problem zeigen und sonst möglichst wenig. Allerdings komplett ( d.h. kompilier- und lauffähig mit dem problematischen Verhalten ) sein sollen sie schon.

Da dies viele überfordert, ist ein "Komplett-Sketch" immer besser als ein Schnipsel, der meist das Problem nicht enthält. Alles ohne z.B. Variablendefinitionen wäre Frechheit, wenn es nicht Dummheit wäre.

Oft fehlt auch ein Link zu verwendeten Libraries.

Aber dieser Topic ist ja [ERLEDIGT]. Sehr schön.

Genau.

michael_x: Hier im Forum bin ich eigentlich immer für reduzierte Sketche, die genau das Problem zeigen und sonst möglichst wenig. Allerdings komplett ( d.h. kompilier- und lauffähig mit dem problematischen Verhalten ) sein sollen sie schon.

Da dies viele überfordert, ist ein "Komplett-Sketch" immer besser als ein Schnipsel, der meist das Problem nicht enthält. Alles ohne z.B. Variablendefinitionen wäre Frechheit, wenn es nicht Dummheit wäre.

Ja, ein reduzierter, lauffähiger Sketch, der das Problem zeigt - das wäre optimal. Das hilft generell sehr bei der Fehlereingrenzung und hat mir schon sehr oft geholfen das Problem selbst zu finden. Dann war eine Frage hier im Forum nicht (mehr) nötig :)