Binäruhr

Moin Leute, ich möchte eine binäruhr mit schieberegistern bauen, jedoch komme ich bei der Darstellung der zahlen im 2-stelligen Bereich nicht weiter (softwaretechnisch).

Wie ist es möglich, die z.B. Zahl 58, so anzuzeigen, dass nach der Sekunde 9, die 10er Stelle weiter macht und die Sekunden wieder bei 0, bzw. 1 anfangen?

Kann man ein Byte teilen, sobald der gewünschte Wert erreicht ist, oder müsste ich da einen Port zusätzlich nehmen?

Sind da eher die schieberegister fehl am Platz?

Danke schonmal im Voraus.

Binär gibt es keine Zehnerstelle. Deswegen ist Deine Beschreibung etwas unverständlich.
Ansonsten zeige mal Deine Schaltung.

Gruß Tommy

kelloggsfrootloops:
Moin Leute, ich möchte eine binäruhr ... bauen ...

Woher nimmst Du die Uhrzeit und in welchem Format liegt diese vor?

Tommy:
Binär gibt es keine Zehnerstelle. Deswegen ist Deine Beschreibung etwas unverständlich

Hört sich nach BCD an. Da wird in 4 bit eine Ziffer 0..9 gespeichert. Und eine Zahl 0..59 passt locker in ein Byte. (Bleibt sogar noch ein Bit frei)

Wird übrigens so auch in einer RTC gespeichert.

ich möchte eine binäruhr mit schieberegistern bauen, jedoch komme ich bei der Darstellung der zahlen im 2-stelligen Bereich nicht weiter (softwaretechnisch)

Bitschiebereien kannst/wirst du dabei lernen.

Das könnte sein, wobei sich für mich Binäruhr nach rein binärer Darstellung anhört, nicht nach BCD.
Da muss der TO mal mehr Infos rüber reichen.
Wobei ich für BCD Schieberegister als ungünstig empfinden würde. Da würde ich eher Portextender nehmen.

Gruß Tommy

Dem Bild nach basiert die gewünschte Ausgabe auf einer Uhrzeit in BCD (eine Reihe Lämpchen pro Ziffer).

M.E. ist es letztlich egal ob Schieberegister oder Porterweiterung. Man darf nur nicht davon ausgehen, dass man mit einfachem "schieben" die Uhr weiterschalten kann.

Ist aber allemal eine schöne Fingerübung für etwas Bitgepfriemel :slight_smile: - Viel Erfolg!

Ein 8 Bit (1 Byte) breites Schieberegister in 2 Nibble zu zerlegen und damit die Einer und Zehner Stellen auszugeben ist schon möglich.

Also z.B. 58 Minuten, die Einer Bit 1-4, die Zehner Bit 5-8
Pseudocode:
Variablen Minute, MinutenZehner, MinuteEiner und AusgabeMinute als byte
MinuteZehner = Minute / 10
MinuteEiner = Minute - MinuteZehner
MinuteEiner = Minute % 10
AusgabeMinute = MinuteZehner << 4 // BitShift 4 Stellen nach links
AusgabeMinute = AusgabeMinute + MinuteEiner
ShiftOut AusgabeMinute

Damit sollten die Zehnerstellen an Ausgang 5-7 anliegen und die Einer an 1-4.
Geht vermutlich auch eleganter, aber ich stricke meine Programme auch nur hobbymäßig. :slight_smile:

Gruß, Jürgen

Katsumi_S:
MinuteZehner = Minute / 10
MinuteEiner = Minute - MinuteZehner

Kleiner Fehler: Beispiel 58 --> MinuteZehner=5 -->58-5 = 53
Also MinuteEiner = Minute - 10 * MinuteZehner

Besser: MinuteEiner = Minute % 10 --> 8

Ansonsten ist der Weg ok.

Gruß Tommy

Ups, du hast Recht. Da fehlt ein *10. Besser geht es aber mit dem Modulo Operator.

Danke!

Gruß, Jürgen

Danke für eure Antworten. Ich werde mich nachher mal nach dem Beispiel von Katsumi/Tommy orientieren.
Eine Schaltung habe ich noch nicht aufgebaut. Lediglich ein Schieberegister und 8 LEDs an den Ausgängen.
:slight_smile:

Katsumi_S:
Ein 8 Bit (1 Byte) breites Schieberegister in 2 Nibble zu zerlegen und damit die Einer und Zehner Stellen auszugeben ist schon möglich.

Also z.B. 58 Minuten, die Einer Bit 1-4, die Zehner Bit 5-8
Pseudocode:
Variablen Minute, MinutenZehner, MinuteEiner und AusgabeMinute als byte
MinuteZehner = Minute / 10
MinuteEiner = Minute - MinuteZehner
MinuteEiner = Minute % 10
AusgabeMinute = MinuteZehner << 4 // BitShift 4 Stellen nach links
AusgabeMinute = AusgabeMinute + MinuteEiner
ShiftOut AusgabeMinute

Damit sollten die Zehnerstellen an Ausgang 5-7 anliegen und die Einer an 1-4.
Geht vermutlich auch eleganter, aber ich stricke meine Programme auch nur hobbymäßig. :slight_smile:

Gruß, Jürgen

AusgabeMinute = MinuteZehner << 4 // BitShift 4 Stellen nach links
*AusgabeMinute = AusgabeMinute + MinuteEiner
ShiftOut AusgabeMinute

*Beim erneuten schreiben von AusgabeMinute meckert der Compiler.
Wenn ich beim ShiftOut: AusgabeMinute + MinuteEiner schreibe, erhalte ich das Ergenis aber angezeigt.
Vielen Dank dafür schonmal.

Gibt es sonst eine Möglichkeit, das ganze etwas schicker zu machen, indem man nicht zwangsweise bei Shiftout die Rechnung mit dem + schreiben muss?

Oder eine andere Ausführung, um die Nibbles einem Byte zuzuweisen?

MinuteZehner << 4, funktioniert bis hierhin super.

kelloggsfrootloops:
*Beim erneuten schreiben von AusgabeMinute meckert der Compiler.

Der Fehler befindet sich in Zeile 42!

@kelloggsfrootloops:
Weißt Du was agmue damit sagen möchte?
Du sagst nur das der Compiler meckert. Wir würden Dir ja gerne helfen, aber Du lässt uns ja nicht. Da wir von Dir weder den aktuellen fehlerhaften Sketch, noch die komplette Fehlermeldung haben.

Normalerweise sollte der da nämlich nicht meckern, zumindest tut er das bei meinem kurzen Sketch nicht.

Gruß, Jürgen

Werde ich heute Abend machen, da ich vormittags keine Zeit hatte.

Gruß

kelloggsfrootloops:
Werde ich heute Abend machen, da ich vormittags keine Zeit hatte.

Niemand hetzt Dich, außer Du selbst :slight_smile:

Das Thema einer binären Uhr hatten wir hier schon gelegendlich, so auch bei der Rheinturmuhr mit Arduino und RTC3231 oder ganz vielfältig im Uhren Sammelthread.

Leider hast Du meine Frage nach der Zeitquelle und dem damit vorhandenen Format aus #2 noch nicht beantwortet. Es wäre ja blöd, wenn man einen überflüssigen Kringel programmiert.

Noch lautet meine Antwort also "42" :smiley:

agmue:
Niemand hetzt Dich, außer Du selbst :slight_smile:

Das Thema einer binären Uhr hatten wir hier schon gelegendlich, so auch bei der Rheinturmuhr mit Arduino und RTC3231 oder ganz vielfältig im Uhren Sammelthread.

Leider hast Du meine Frage nach der Zeitquelle und dem damit vorhandenen Format aus #2 noch nicht beantwortet. Es wäre ja blöd, wenn man einen überflüssigen Kringel programmiert.

Noch lautet meine Antwort also "42" :smiley:

42 war richtig. Danke :slight_smile:

Ich werd vorerst nur mit nem 1Hz Takt für die Uhrzeit arbeiten, die man nach dem ausschalten neu Stellen muss. Eventuell den Takt von dem ds3231. Wenn das läuft, die Uhrzeit vom ds3231 einfach übernehmen. Oder hast du noch eine andere Idee? Millis soll ja nicht so optimal sein.

Lg

kelloggsfrootloops:
... ds3231 ... Millis soll ja nicht so optimal sein.

millis() ist meiner Erfahrung nach schwer suboptimal. Ich empfehle sehr, gleich mit der DS3231 anzufangen. Die ist ziemlich genau und von der Handhabung her komfortabel - ich benutze die uRTCLib.

Gruß

Gregor

gregorss:
Ich empfehle sehr, gleich mit der DS3231 anzufangen. Die ist ziemlich genau und ...

... verwendet intern BCD. Ich schließe mich daher dieser Empfehlung an.

verwendet intern BCD. Ich schließe mich daher dieser Empfehlung an.

Ich auch, und ergänze, gar keine lib (außer Wire.h) zu verwenden und die BCD codierte Zeit direkt aus der Uhr zu lesen.

michael_x:
Ich auch, und ergänze, gar keine lib (außer Wire.h) zu verwenden und die BCD codierte Zeit direkt aus der Uhr zu lesen.

Wie kann man die bcd codierte Zeit ohne lib. lesen?