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?
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)
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.
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 - 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.
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.
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.
*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:
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.
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.
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"
42 war richtig. Danke
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.
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.