Bascom Pensionsuhr

gerd51

Mitglied
18. Jan. 2013
43
0
6
Sprachen
  1. BascomAVR
Hallo erstmal an all die vielen Helferlein.

Zum Problem: Ich würde gerne für einen lieben Kollegen, der in gut einem Jahr in Pension geht, eine "Pensionsuhr" bauen. Also einen Langzeittimer der über mehr als ein Jahr rückwärts zählt.
Meine Überlegungen sagen , dass man dafür einen sehr genauen Takt benötigt, damit der Kollege nicht nach der Uhr ein paar Tage zu früh, oder was noch schlimmer wäre ein paar Tage zu spät in den Ruhestand geht.;)
Den Takt könnte man eventuell mit der sectic-sub eines dcf77moduls erhalten, oder den Oszillatortakt der ds1307 abfragen. Das zeite Problem ist aber das Rückwärtszählen. Man muss dafür ständig den Monat im Auge behalten wegen der unterschiedlichen Tageszahl. :confused:

Hat jemand von euch einen Ansatz oder Idee, wie man das realisieren könnte und dennoch den Programmieraufwand einigermaßen im Rahmen hält. Sozusagen eine rückwärts laufende RTC oder sowas in der Art.

Gruß an alle

Gerd
 
Ich würde mit BCD arbeiten, ist für die Ausgabe auch häufig einfacher. Und da du eh mit DCF77 arbeiten möchtest brauchst du das eh :)

Das mit den Monaten ist ja relativ einfach.
Du zählst ja runter. Wenn Tag 0 ist wärs ungünstig :)
Also wieder neu laden. Und dann (wenn man ganz genau ist und Schaltjahre mit berücksichtigt):

Vorsicht, Pseudocode!
Code:
Sub TagVerringern()

  Tag = Tag - 1
  If Tag = 0x00 Then
    Select Case Monat
      Case 0x02 ' Februar
        If (Jahr And 0b00000011) = 0 Then
          Tag = 0x29 ' Schaltjahr
        Else
          Tag = 0x28 ' Normal
        End If
      Case 0x01, 0x03, 0x05, 0x07, 0x08, 0x10, 0x12
        Tag = 0x31
      Case Else
        Tag = 0x30
    End Select
  End If
End Sub
Das würde jetzt zwar nicht die speziellen Schaltjahre berücksichtigen die nur alle 100te Jahre auftreten, aber ich vermute mal so lange wird die Schaltung eh nicht in Benutzung sein ;)

Du musst beim runter zählen nur nicht vergessen dass du auch den "halben Überlauf" überprüfen musst.
Code:
Function BcdDecrenent(Value As Byte) As Byte
  Value = Value - 1 ' Wert verringern
  If (Value And 0x0F) = 0x0F Then ' Einer-Stelle = 15. Zu viel. Also:
    Value = Value - 6 ' ... 6 abziehen um auf (zehner+)9 zu kommen
  End If
  Return Value ' und den Wert zurückgeben
End Function

Code ist jetzt freihand getippselt, könnte also gut möglich sein dass der Fehler hat, aber das Prinzip sollte denk ich mal klar sein.
Ich weiß ja jetzt auch nicht in welcher Sprache du es gern umsetzen würdest.
 
Hallo Gerd!

Ich überlege nun gerade, ob deine Pensionsuhr nur die Tage rückwärts zählen soll, oder ob es auf die Sekunde (Minute, Stunde) genau sein muss? :hmmmm:

Da du mit BASCOM arbeitest......
und wenn dir der genaue Tag reichen würde,
dann würde ich dir den Befehl SYSDAY() ans Herz legen.

Damit kannst du den Systemtag seit dem 01.01.2000 ausrechnen.


Wenn dein Kollege also zum Beispiel am 31.03.2015 in den Ruhestand geht, dann ist das der Systemtag: 5568 !
Heute (15.02.2014) ist hingegen erst der 5159. Systemtag.

Du müsstes also nur jeden Tag die Differenz berechnen (in einen String formatieren) und auf 100mm Siebensegmentanzeigen aufleuchten lassen! :wink:


Viele Grüße,
Cassio
 
Hallo Leute,

erstmal vielen Dank für´s Mitdenken.
@Thomas
Programmiersprache ist Bascom (hatte ich irgendwo notiert)
Hatte ich mir das so auch schon mal überlegt, allerdings war mir nicht klar, wo ich erkennen kann ob das aktuelle Jahr, das gerade heruntergezählt wird, ein Schaltjahr ist. Ist natürlich nur theoretisch interssant, da man für einen Zeitraum von gut einem Jahr das natürlich weiß. Möchte der Sache allerdings auch theoretisch auf den Grund gehen, so dass die Uhr auch für einen beliebigen Zeitraum funktionieren würde.

@cassio
Daran habe ich noch gar nicht gedacht. Du willst also einfach den sysday runterzählen lassen. Für die zugegebenermaßen nicht zu genau zu nehmenden Stunden, Minuten, Sekunden (Bei der Vorwahl des Zeitraums werden die sowieso auf Null gesetzt und laufen nur, damit auch die ganze Zeit was zappelt) läßt man einfache runterzählen und syncronisiert bei Wechsel des sysdays auf Null. Habe ich das richtig verstanden? Werde das mal ausprobieren.
 
Hallo Gerd!

Das war natürlich nur eine Idee und ein grobes Beispiel.

Wenn sich permanent etwas "bewegen" soll und deine Anzeige "lang" genug ist, kannst du natürlich auch mit:
SYSSEC() oder SYSSECELAPSED() arbeiten.

Es steht dir natürlich frei, dein "Zählwerk" trotzdem mit dem DCF77-Signal zu synchronisieren. :wink:


Schau dir die drei Befehle doch alle mal in Ruhe an und spiele damit mal etwas im Simulator.
Könnte mir gut vorstellen, dass du damit recht komfortabel ans Ziel gelangen solltest. :)


Grüße,
Cassio
 
Hatte ich mir das so auch schon mal überlegt, allerdings war mir nicht klar, wo ich erkennen kann ob das aktuelle Jahr, das gerade heruntergezählt wird, ein Schaltjahr ist.
Das ist recht einfach, du brauchst nur die letzten 2 Bits des Jahres (als Integer / Word, nicht BCD) auf 0 zu prüfen.
2000 = 0000 0111 1101 0000 = Schaltjahr
2001 = 0000 0111 1101 0001 = Kein Schaltjahr
2002 = 0000 0111 1101 0010 = Kein Schaltjahr
2003 = 0000 0111 1101 0011 = Kein Schaltjahr
2004 = 0000 0111 1101 0100 = Schaltjahr
...
Es gab auch dazu noch spezielle Jahre (ich glaube das war alle 300 Jahre, nächste Mal irgendwann in 100 Jahren fällig, bin mir aber nicht sicher), darum habe ich mich nie bemüht.
Außerdem bekommst du das auch noch als Bit über DCF77 rein ;)
Ob und wie das aber über Bascom zugreifbar ist weiß ich nicht. Ich hatte mir damals die DCF Routinen selber programmiert.
 
Die Anzeige hat 12 Stellen. Die Segmente hängen über ULN2803 am D-Port eines Atmega8, die Display-Anoden werden über shiftout einer Word-Variable und 74HC595 selectiert.
Die Anzeige-Platine ist unten angehägt. Sie ist also "lang" genug.

Pensionsuhr.png
 
Hi
So ein Ding steht in meinem Büro auf dem SChreibtisch. Zählt im Zehntelsekundentakt rückwärts und hat eine 12 stellige 7Segmentanzeige. Drin werkelt ein Mega16, der in Assembler progrrammiert ist. Das Programm hat zwar noch ein paar kleine Fehler, die mich aber nicht stören, da vermutlich der letzte Tag früher als geplant kommt. Trotzdem ist es schon interessant, was die Besucher so dazu sagen, zumal die Uhr auch ein paar blöde Bemerkungen drauf hat. Text, der mit einer 7Segmentanzeige halt geht.... "Pause" "Feierabend" erc. Falls du daran Interesse hast, es ist nix geheimes. Lediglich die Fehler müsstest du selber eliminieren und halt Assembler können.
Gruß oldmax
 
@ oldmax
VielenDank für dein Angebot. Leider kann ich absout kein Assembler. Bascom und C, der Rest ist Schweigen. Schade.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)