Laufschrift programmieren (Denksport für echte Profis) ;)



  • Hallo Leute!

    Ich will eine Laufschrift programmieren. Habe zwar eine grobe Vorstellung von C++ und auch eine von dem Programm, aber langsam wird mir das ganze zu komplex von daher erbitte ich eure Hilfe!

    Zum Projekt:

    Ich habe vor, einen Countdownzähler zu programmieren, der von 7 Minuten auf 0 herunterzählt und dann bei 7 Minuten wieder beginnt hoch zu zählen, bis man die ganze Schaltung wieder zurück setzt und die Schaltung nichts mehr ausgibt, was den "Normalzustand" darstellen soll.

    Zur Hardware:

    Habe eine Laufschrift mit zwölf 5x7 LED-Feldern. Diese werden über einen Microprozessor gesteuert, den es zu programmieren gilt.
    Dieser sollte aus technischen Gründen nacheinander die 12 Spalten für immer eine Zeile mit Daten versorgen, dann die nächste Zeile, usw.

    Zum Ablaufplan:

    Ich hatte vor, das ganze in XXXXX Teile auf zu teilen:

    1. Ein Programmteil, der den Sekundentakt angibt.

    Dieser Unterpunkt würde dann eine Variable immer nach einer Sekunde mit 1 beschreiben, der Programmteil ist soweit fertig, müsste nach dem auslesen aber wieder auf 0 gebracht werden, um ein erneutes beschreiben zu ermöglichen.

    2. Ein Programmteil, der die Zahlen für die Zeit bestimmt.

    Dieser Unterpunkt müsste also bei jedem Takt vom ersten Programmteil die sieben Minuten verstreichen lassen. Ich habe das ganze wie folgt aufgebaut:
    Ich lasse für jeden Takt die Variable für die Sekunden um eins kleiner werden. Sobald diese 0 erreicht, wird die Variable dür die zehntel Sekunden um eins kleiner, usw.

    3. Ein Programmteil, der die Zeitzahl in die Werte für die Ausgabe bringt

    Da, wenn ich Beispielsweise den Wert 6 für die Sekunden habe ich a) nur 0 und 1 als Ausgabewert für je eine LED habe und b) diese nicht direkt nacheinander schreiben kann, gestaltet sich das ganze schon schwieriger. Hier bräuchte ich nun eure Hilfe, dazu aber gleich mehr.

    4. Ein Programmteil, der die ganzen Informationen gezielt auf die Ausgänge des Microcontrollers schreibt.

    Ich muss also für den fall eins Spalte 1 in Feld 1 mit Informationen versorgen.
    In Fall zwei Spalte 1 in Feld 2 usw. Bis ich alle Spalten und Felder durch habe, um dann von neuem an zu fangen.
    Der vierte Teil muss das Hauptprogramm sein und darf nicht durch all zu lange Rechnerreien der ersten drei Abschnitte beschäftigt sein, da die Anzeige sonst flackert. Aber dazu auch wieder später.

    Ich hoffe, das ich mein Problem einigermaßen gut anzeigen konnte und euch mit dem Lesen nicht all zu viel Zeit geraubt habe, aber eine kleine Einführung ins Thema dürfte ganz nützlich sein.

    Kommen wir zu meinem Problem:

    Ich möchte letztlich einen Register schreiben, der wenn er von den Sekunden den Wert 6 erhält, die Informationen für die einzelnen Spalten beschreibt. Da die Sekunden immer an der selben stellte Stehen muss diese Funktion auch immer nur diese 5 Spalten beschreiben. (ich hätte dies mit einer case-Funktion gelöst) Problem ist aber, das er auch die Zehnersekunden und Minuten etc mit Informationen füllen muss, was ein ziemlich langes Programm ergäbe und diesen Platz habe ich leider nicht.

    Hier ein Beispiel für die 6:

    Ich habe den Wert:

    sekunde1 = 6

    und will haben:

    s1=1000001
    s2=0110110
    s3=0110110
    s4=0110110
    s5=1001101

    Die Informationen stehen fest, da eine sechs immer eine sechs ist und die Zeilen immer gleich beschrieben werden müssen.
    Das mein Problem ist einfach nur, wie ich aus einer sechs die Variablen s1-s5 beschreibe und der mit für die Minuten dann statt s1-s5 die Variablen m1-m5 beschreibt...

    Wenn dafür jemand also eine Idee hat, bin für alles offen!!



  • Du willst also das jede Sekunde eine LED ausgeht, oder?
    Wie kannst du die einzelnen LEDs genau ansprechen? Wie sind die angeordnet und bei welchen Registerwerten leuchten welche LEDs?



  • Also das ganze ist wie folgt angeordnet:

    I II III IV V VI VII VIII IX X XI XII
    12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
    a OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    b OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    c OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    d OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    e OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    f OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    g OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO

    Jedes O stellt hier eine LED dar. Die Buchstaben können gleichzeitig geschaltet werden. Das Problem ist nun, das ich zuerst alle 1er nacheinander beschalten muss, danach die 2er usw. Die Frage ist nun einfach, wie ich für den Wert z.B. 6 auch so eine sechs anzeigen kann. Da diese ja aus einer bestimmten Bitfolge besteht.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • I     II   III    IV    V     VI   VII   VIII   IX    X     XI   XII
      12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
    a OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    b OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    c OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    d OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    e OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    f OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    g OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO
    


  • Was muss man denn jetzt machen, damit bestimmte LEDs brennen?



  • Beispiel:

    Ich möchte im Feld I eine sechs haben:

    Dann muss ich für 1 den Wert 0111110 haben. Dieser muss also zugewiesen werden. Dann müssen alle anderen 11 Felder also II-XII mit dem Wert für die jeweiligen Felder zugewiesen werden. Anschließend muss 2 den Wert 1000001 erhalten. Und dann wieder alle anderen 2er. Das solange, bis alles ausgegeben wurde und das ganze von vorn beginnt.
    Also sowas in der Art wie:

    Eingang = 6;

    Ausgang = I=1; 1=1; Bitfolge=1000001;

    Letztlich brauch ich also einen Code, der mir für meine 6 die vorher definierten Bitfolgen auf meine Werte legt. Und dass, egal um welches Feld es sich handelt.
    Wie gesagt ist alles ein wenig komplizierter...



  • Geil - genauso etwas hatte ich mal gebaut. Ohne Prozessor, nur mit handgelöteter
    Hardware und einem Zeichengenrator im Eprom. Die Tastatur lief über ein Latch in
    ein statisches Ram, über Zähler dann ausgelesen und angezeigt.

    Eine Saulöterei mit dem 960 LEDs. :-)))))))))))

    Mit einem uP geht das heute einfacher.

    Die kompletten Panels gibt's heute als China-ware. Selbstbau lohnt nicht.



  • Die Begeisterung freut mich.. Aber nun hab ich den ganzen Kack schon gelötet und ich sage dir:
    1. Nicht schön, so ne lange Platine zu finden, aber Connections machen es möglich!
    2. Nicht schön, ein so großes Säurebad zu finden, um das ganze dann auch noch zu ätzen, aber auch hier Connections!
    3. Nicht schön, 420 LEDs, also monoton 840 Beinchen auf gleiche länge bringen, einsetzen und anlöten, auf so ein Board zu bekommen!
    4. Nicht schön, eine komplette Software für den Mist zu schreiben, um dann festzustellen, dass der µC zu klein für so ein großes Programm ist..
    5. Nicht schön, keinen zu finden, der mir helfen kann.. Suche jetzt schon seit gut zwei Monaten..



  • Naja.. Das leben ist hart ^^

    Brauche aber echt nur eine Idee, für nen Register, sodass ich wenn ich ne sechs da reinschmeiße für meine 5 Ausgangswerte die entsprechenden Bitfolgen bekomme.. Das spart unendlich viel Platz ^^



  • 420 ? Weichei 🙂

    Mit einem der modernen uCs ist das doch kein Problem.

    Ich würde die Anzeige multiplexen, dh, die Werte für an/aus aus einem Zeichengenerator
    holen (wie angegeben, halt ein Bitmuster) und dann die Spalten und Zeilenn einzeln
    durchgehen.
    Im Prinzip der Nachbau eines Primitiv-Grafik-Controllers.

    Das ganze über einen Timer steuern und den Strom (damit's auch hell wird) durch
    dir LEDs etwas großzügiger dimensionieren.

    Es wird eine ziemliche Pfriemelei das zu optimieren, aber viel Spaß !



  • ok schrieb:

    Was muss man denn jetzt machen, damit bestimmte LEDs brennen?

    z.B. ohne Vorwiderstand in die Steckdose stecken.



  • Witzbald schrieb:

    ok schrieb:

    Was muss man denn jetzt machen, damit bestimmte LEDs brennen?

    z.B. ohne Vorwiderstand in die Steckdose stecken.

    Das macht mit den kleinen Trabistörchen mit Metalldeckel aber mehr Spaß.
    *pfump* kein Deckel mehr 🙂



  • Scheppertreiber schrieb:

    Witzbald schrieb:

    ok schrieb:

    Was muss man denn jetzt machen, damit bestimmte LEDs brennen?

    z.B. ohne Vorwiderstand in die Steckdose stecken.

    Das macht mit den kleinen Trabistörchen mit Metalldeckel aber mehr Spaß.
    *pfump* kein Deckel mehr 🙂

    diese 0.1µF/160-volt kondensatoren aus alten röhrenradios sind auch toll. die halten das ca. 30 sekunden aus und dann zerfetzt es sie wie einen sylvesterknaller.



  • Oder die netten Elkos 220 uF / 6.3V ... eine Riesensauerei. Was auch gut knallt
    beim Löten sind diese kleinen Lithiumknopfzellen 🙂



  • ^^quecksilber-schalter aus aus alten treppenhausautomaten sind auch nicht zu verachten. allerdings sollte man's nur im freien machen, wegen der dämpfe und so.
    🙂



  • cotty schrieb:

    Die Begeisterung freut mich.. Aber nun hab ich den ganzen Kack schon gelötet und ich sage dir:
    1. Nicht schön, so ne lange Platine zu finden, aber Connections machen es möglich!
    2. Nicht schön, ein so großes Säurebad zu finden, um das ganze dann auch noch zu ätzen, aber auch hier Connections!

    Warum tust Du Dir das an? Mit dem selbstgeätzten Zeug vertust Du nur viel Zeit für miese Qualität, mal abgesehen von der Sauerei.

    cotty schrieb:

    3. Nicht schön, 420 LEDs, also monoton 840 Beinchen auf gleiche länge bringen, einsetzen und anlöten, auf so ein Board zu bekommen!

    Mir kommen die Tränen. Bei Conrad kannst Du so LED- Zeilen fix und fertig kaufen, per COM programmierbar. Wenn Du's schon unbedingt selbst machen willst, sollte Dir aber von vorneherein klar sein, daß Du kaum eine Chance hast, mit der Bastelei kostenseitig unter der Fertiglösung zu bleiben. Zudem bist Du uns schuldig geblieben, wie Deine Matrix nun wirklich verschaltet ist.

    cotty schrieb:

    4. Nicht schön, eine komplette Software für den Mist zu schreiben, um dann festzustellen, dass der µC zu klein für so ein großes Programm ist..

    Nicht schön, festzustellen, daß Dir nicht klar ist, wie trivial das Problem ist. Meine Matrixtreiber (soft) brauchen im Schnitt 100 Byte ASM- Code plus Tabelle. Das darüberliegende Problem mit der Uhr paßt in C vermutlich auf eine Bildschirmseite. Controller mit mehr als 2 k EPROM aufzutreiben, war zuletzt 1988 eine Schwierigkeit.

    cotty schrieb:

    5. Nicht schön, keinen zu finden, der mir helfen kann.. Suche jetzt schon seit gut zwei Monaten..

    Nicht schön, aber mein Klo ist hoffnungslos verstopft und ich finde keinen, der das kostenlos freimachen mag. Wenn der Rohrmax kommt, will er 130 EUR Anfahrt und für jede angefangene halbe Stunde 50 EUR plus Märchensteuer. Ich weiß, daß er nach 10 Minuten fertig sein wird und ich mit der Handspirale fünf, sechs Stunden an Kackesteinen herumkratze, bis ich ungefähr das gleiche Reinigungsergebnis haben werde.

    Wenn es Dein Hobby ist, billige China- Displays in Handarbeit nachzustricken, darfst Du nicht motzen, wie mühselig das ist. Wenn Du Software dazu brauchst und Dich überfordert siehst, zergliedere die Probleme (Matrixtreiber und Timer) und Du wirst sehen, wie simpel das ist. 😃

    Jedenfalls ist Kotsteinwegkratzen nicht mein Hobby, der Rohrmax kommt am Donnerstag und ich werde wohl schluchzend gute 200 EUR für geräumte 5 m Rohr abdrücken müssen. 😞



  • Moin!

    Was du brauchst ist ein eigener Zeichensatz für die Ziffern.
    Leg dir eine Tabelle (Mein_Zeichensatz) an, mit 10 Elementen (0 - 9). Jedes dieser Elemente speichert die Adresse einer weiteren Tabelle (Zeichen0..Zeichen9), in der du die für die Ziffern nötigen Bitmuster Zeile für Zeile speicherst.

    Wenn du jetzt die erste Zeile (für beispielsweise 67543) anzeigen willst, lädst du zuerst das erste Element aus der Adresse von Mein_Zeichensatz[6] (Zeichen6[0]) in einen Speicher, hängst dann das nächste Element ran (Zeichen7[0]) und so weiter, bis (Zeichen3[0]). Jetzt schaltest du alle Zeilen aus, lägst den Speicherinhalt an die Ports und schaltest die Zeile "a" an. Das machst du bis zur letzten Zeile und fängst dann wieder von vorne an.


Anmelden zum Antworten