-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: Erneut Schieberegister

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    30
    Beiträge
    379

    Erneut Schieberegister

    Anzeige

    Hallo Jungs!
    Ich habe erneut ein Problem mit Schieberegistern (74HC595). Ich bin momentan dabei eine Qlocktwo nachzubauen und habe dazu einen AtMega8 mit 3 kaskadierten Schieberegistern beschaltet ohne das SPI Interface zu nutzen. Hinter den Schieberegistern hänge 3 Transistorarrays (ULN2981).
    Ich nutze von den 24 Ausgängen die mir nun zur verfügung stehen 20 um die einzelnen Worte der Uhr anzusteuern allerdings harkt es jetzt an der Software realisierung.
    Die Uhr ist ja in 5 Minuten Schritten genau, sodass ich im Programm die Schieberegister alle 5 Minuten neu beschreiben muss allerdings stellt sich folgendes Problem:
    Ich habe eine Stundenvariable, eine Minutenvariable und eine Sekundenvariabele die durch einen Timer hochgezählt werden. Jetzt muss ich allerdings jeweils die Bitmuster irgendwo speichern die zur jeweiligen Uhrzeit gehören. Da jede Stunde 12 unterschiedliche Bitmuster benötigt wären das also 12*12 Bitmuster und ich kann ja schlecht 144 If abfragen hintereinander machen wie z.b. so:

    if (Stunden == 12 && Minuten == 0 && Minuten < 5)
    {
    Bitmuster für 12:00 ausgeben
    }
    if (Stunden == 12 && Minuten > 4 && Minuten < 10)
    {
    Bitmuster für 12:05 ausgeben
    }
    ...
    ...

    Das muss doch irgendwie einfacher gehen. Hat da jemand einen Tipp für mich? Ist es hier sinnvoll die 144 Bitmuster mit Hilfe von DATA abzuspeichern und darauf zuzugreifen? WIe genau müsste das aussehen.

    Ich hab einfach keine andere Idee wie das sonst zu realisieren wäre ohne die 144 If abfragen.

    Danke für eure Hilfe!

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Es gibt Leute, die würden die Pattern für 0-9 speichern und die dann nach Bedarf zusammensetzen.
    Aber ich kenn diese "Qlocktwo" nicht, vielleicht ist da alles anders. Ich werd' den Herrn Google fragen.

    Ahja. Da muss man über die Zahlen in einer Tabelle zu den Worten finden, und dann normal die erforderlichen Buchstaben als Pattern abarbeiten.
    Ist halt ein paar mal um die Ecke
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    Hallo,

    ich kenn jetzt die Uhr nicht - hab ebenfalls nur kurz gegoogled und gesehen, dass die Anzeige dem "sprachgebrauch" entspricht.
    Wenn es pro Stunde 12 verschiedene Anzeigen gibt (ich stell mir jetzt so etwas wie 10_nach oder 10_vor oder viertel_nach oder einfach viertel und dreiviertel) dann ist das ja rein minutenabhängig und wird wohl durch 12 if's oder besser 12 case-Zeilen erfasst.
    Das stundenabhängige sind einfach betrachtet auch 12 Fälle...aber die entsprechen ja lediglich dem Bitmuster was der Stundenvariable zugeordnet wird, oder eben dem Bitmuster von Stundenvariable+1.

    ich würde also

    select case Minutenvariable
    case is <7 :
    MinutenBitmuster für 5-nach
    Stundenbitmuster für Stunde
    case is<12:
    MinutenBitmuster für 10-nach
    Stundenbitmuster für Stunde
    case is<17:
    MinutenBitmuster für viertel
    Stundenbitmuster für Stunde
    ...
    case is<57:
    MinutenBitmuster für 5-vor
    Stundenbitmuster für Stunde+1
    end select

    Das ist jetzt nicht getestet, nur so aus dem Kopf hingeschrieben - und sieht auch ziemlich anders als deine Lösung aus - mehr Bascom-ähnlich

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    ich habe das in Bascom so gemacht, dass ich das Muster in einem Array abgespeichert habe, getrennt für Stunden und Minuten.
    Der Index ins Array geht für die Minuten einfach über Minuten/5.

    Für die Stunden ist es etwas aufwändiger, da du schon vor der Stunde mit ihr arbeitest. Dies ist ab fünf_vor_halb_<stunde> (z.B. 4.25 Uhr) der Fall (in einigen Gebieten auch schon bei 10_vor_halb_fünf). Also musst du unterscheiden, ob die Minuten <25 (bzw. <20) sind, dann einfach die Stunde. Ansonsten Stunde+1.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    30
    Beiträge
    379
    Ja also die Uhr ist wie gesagt einfach per google zu finden an die Jungs die das Ding noch nie gesehen haben.
    @BoGe-Ro: Deine Lösung ist vom Prinzip her ja funktionisfähig aber das Problem ist die Zeile "Ausgabe des Bitmusters für die Stunde". Da gibt es ja wieder 12 verschiedene Möglichkeiten, sodass ich dort wieder 12 If abfragen machen müsste um das passende Bitmuster auszugeben. Dazu kommt noch das wenn ich zuerst das Bitmuster für die Minuten in die Schieberegister taktet und anschließend das Bitmuster für die Stunde eintakte, das dann zuerst die Minuten aufleuchten würden ohne stunden angabe und danach die Stunde ohne die Minuten. Der Controller ist zwar locker schnell genug das man das mit bloßem auge nicht sehen würde aber trotzdem nicht grade ideal.


    @for_ro: Das würde ja vorraussetzen, das ich 2 verschiedene Schieberegister Kaskaden für Minuten und Stunden hätte. Bei mir ist es eine große Schieberegisterkette für Stunden UND Minuten.
    Trotzdem hast du mich auf eine Idee gebracht. Ich könnte es so machen wie du vorgeschlagen hast und die Minuten Bitmuster und Stunden Bitmuster in Arrays zu schreiben und bei der Ausgabe diese beiden Arrays zu kombinieren. Keine schlechte Idee denke ich. Danke für diesen wirklich hilfreichen Hinweis

    Trotzdem bin ich gerne für weitere Vorschläge offen! Ich finds übrigens nach wie vor super das einem hier so gut geholfen wird bei der Realisierung eines solchen Projekts. Ich versuche natürlich auch etwas zurück zu geben soweit mir das Möglich ist. Das ist aber meist in der Hardware Ecke

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von oZe
    Das würde ja vorraussetzen, das ich 2 verschiedene Schieberegister Kaskaden für Minuten und Stunden hätte.
    ... und bei der Ausgabe diese beiden Arrays zu kombinieren. Keine schlechte Idee denke ich. Danke für diesen wirklich hilfreichen Hinweis
    Ich würde halt nicht die Arrays kombinieren, sondern einfach die gefundenen bitmuster hintereinanderhängen.
    Außerdem könntest du die Bitmuster auch in zwei separaten Befehlen an deine Schieberegister Kette ausgeben.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    Hallo,

    wie wäre doch der Weg über Data und LookUp?

    du würdest zwei Datafelder anlegen, eins für die Stundenbitmuster und eins für die Minutenbitmuster.

    Du gibst einer Stundenbitmusterhilfsvariablen den Wert der aktuellen Stunde.

    danach schiebst du dann deinen Minutenzähler über eine Case-Auswahl und weist einer Variable die Werte 1 bis 12 zu, je nachdem welches Bitmuster dran wäre für die aktuelle Minute.
    innerhalb dieser Minuten-Case-Auswahl, an den Stellen, wo die Stunde nicht mehr auf die aktuelle Stunde sondern auf die nachfolgende bezogen wird, erhöhst du die Stundenbitmusterhilfsvariablen um eins.

    Also beispielsweise in ostdeutsch: bei 09:10 Uhr kannst du schreiben "zehn nach neun", 5 Minuten später "viertel zehn", und nochmals 5 Minuten später "20 nach 9".
    Du hättest also die völlige Freiheit, nur abhängig von der aktuellen Minute auszuwählen, auf welche Stunde die zeitangabe bezogen wird.

    Nach diesen 12 Case-Auswahlmöglichkeiten führst du die LookUp's in den beiden Data-Feldern durch und hast jeweils 2 Bitmuster, die deiner Ausgabe entsprechen.


    Gruß BoGe-Ro

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    30
    Beiträge
    379
    Ja das klingt für mich auch nach ner guten Idee wobei ich mir nicht sicher bin was Platzsparender ist. Die Arrays haben den Nachteil das es in Bascom ja keine Bit Arrays gibt (wobei das glaub ich nichtmal an Bascom sondern ehr an den AVR`s liegt) und ich somit einen anderen Datentyp nehmen muss was Platz verschwendet.
    Die Data Lookup Methode habe ich noch nie angewendet und steig nicht ganz hinter die Syntax der Befehle. Ich hab in der Bascomhilfe nachgesehen und ein bischen google bemüht. Ich kann ja sowas ähnliches wie das hier machen:

    Datenfeld:
    DATA Wert1,Wert2,Wert3
    DATA Wert1,Wert2,Wert3
    ...
    ...


    Jetzt weiß ich aber nicht wie ich diese Datenfelder genau anspreche weil ich ja nur einen Namen des Feldes habe (Datenfeld) aber mehrere Zeilen.


    Trotzdem wie ich bereits sagte: Alles gute Ansätze und ihr habt mich schonmal dahin geführt nur noch 2x 12 Abfragen zu brauchen anstatt von 144.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo oZe,
    du brauchst dazu überhaupt keine Abfragen. Egal ob du die Werte in ein Array packst oder dir jedesmal über Lookup aus dem Data Bereich ausliest. Wie du das "ausrechnen" kannst, habe ich dir oben beschrieben.
    Bei der Qlocktwo hast du ja die Wörter
    FÜNF ZEHN VOR NACH VIERTEL HALB VOR NACH
    für die Minuten und
    EINS ZWEI DREI VIER FÜNF SECHS SIEBEN ACHT NEUN ZEHN ELF ZWÖLF
    für die Stunden.
    Den 8 Wörtern der Minute ordnest du 8 Bit, also 1 Byte zu.

    FÜNF ZEHN VOR NACH VIERTEL HALB VOR NACH
    Fünf_nach = 10010000
    Zehn_nach = 01010000
    Viertel_nach = 00001001
    usw. insgesamt 12 Werte. Du musst dazu also 12 Byte abspeichern.
    Das gleiche Prinzip könntest du für die Stunden machen.

    EINS ZWEI DREI VIER FÜNF SECHS SIEBEN ACHT NEUN ZEHN ELF
    Eins = 100000000000
    Zwei = 010000000000
    Drei = 001000000000
    usw. insgesamt 12 Werte. Du müsstest dazu also 12 Word (16 Bit) abspeichern.
    Dies wäre aber eigentlich zu aufwändig, da immer nur eine Position den Wert 1 haben kann. Auch das könnte man wieder ausrechnen.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    30
    Beiträge
    379
    Ok ich schau mir das nochmal in Ruhe an. Ich hab mometan leider nicht soviel Zeit wg. Uni etc. aber ich danke dir schonmal für deine Hilfe! Ich denke nächste Woche sollte ich dazu kommen das alles mal zu testen.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •