PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Digital-Uhr/Wecker



Spongebob85
31.08.2007, 23:10
Moin!!!
Ich möchte gerne einen Digital-Uhr/Wecker bauen. Ich hab mir das so gedacht.

1. Möglichkeit: Ein ATMega (welchen weiß ich noch nicht) und 6 BCD-To-7-Seg-Decoder. Hab da aber leider noch keinen passenden gefunden. Und das problem ist das ich dann 24 Ausgänge wegen BCD für sec, min. und std. brauche. Das kommt mir ein bisschen unlogisch vor. Es muss doch irgendwas besseres geben.

2. Möglichkeit: Ganz ohne µC aber dann hab ich wieder extrem viel Arbeit mit dem Verdrahten bzw. Layout machen. Und ich bräuchte auch einen Tipp was ich da für ICs nehmen kann. (Hab nur das TTL-Taschenbuch Teil1 und finde mich darin irgendwie noch nicht so 100% zurecht :-))

Bin dankbar für jeden Tipp.

MfG Jan

kalledom
01.09.2007, 00:22
Ja, Du hast Recht, für 6 Anzeigen brauchst Du 6 x 4 = 24 Ausgänge.
Eine andere Möglichkeit ist I²C oder serieller Datenfluß in 3 x 8 Bit Bausteine; dafür brauchst Du ein Takt und ein Datensignal.
Nächste Möglichkeit: 6 x 8 Bit Schieberegister, Treiber (z.B. ULN2803) und ohne BCD zu 7SegmDekoder an die Anzeigen. Dann kannst Du zu den Zahlen auch einige Buchstaben anzeigen, also alles, was mit den 7 Segmenten möglich ist.
Nächste Möglichkeit (die favorisiere ich): einen 8 Bit Bus aufbauen und 6 x 8 Bit Latchs anschließen, Treiber, Segment-Anzeige.
An den Bus kannst Du noch andere Dinge anschließen: Eingangs-Buffer, LCD, DA-Wandler, ....
Zu den 8 Datenbits brauchst Du natürlich noch 3...4 Adressleitungen für 8...16 Chip-Selekts, Read und Write.
Es gibt noch mehr Möglichkeiten.
Uhrenbausteine für LED-Anzeigen sollte es auch geben; ob die aber Sekunden-Anzeige haben ?

Spongebob85
01.09.2007, 00:39
Ich hab noch nie was mit Datenbussen gemacht außer EIB :-) und einmal in der Berufsschule was mit Schieberegistern.
Ich werde mich mal mit dem ganzen kram ein bisschen auseinander setzen, und dann wieder anfragen, wenn ich mehr von dem verstehe was du vorgeschlagen hast.

MfG Jan

steep
01.09.2007, 07:22
... und 6 BCD-To-7-Seg-Decoder... Und das problem ist das ich dann 24 Ausgänge wegen BCD für sec, min. und std. brauche.
Ein BCD to 7-Segment-Decoder reicht. So brauchst du nur 4 Ausgänge ( A, B, C, D) für die Daten (BCD-Format) welche du jeweils abwechseld auf diesen Ausgang legst und 6 Ausgänge um diejenige 7-Segmentanzeige einzuschalten für welche die Daten jeweils gelten. Das ganze nennt sich Multiplex.

Schokohoernl
01.09.2007, 11:00
tach!

warum müssen es 7-segment anzeigen sein? gibt beim pollin z.b. nen 2x16 zeichen display mit hintergrundbeleuchtung für nur 5 euro... da spart man sich 1. jede menge programmierzeit und 2. hat jeder digitalwecker mehr oder weniger 7-segmentanzeigen... da käme sowas mit nem richtigen LCd schon besser... und man kann beleibigen text darstellen.

MfG

Schoko

Spongebob85
01.09.2007, 13:56
Ich weiß nicht ob ich das mit dem Multiplex richtig verstanden hab.
Läuft das so: z.B. bei der Anzeige 00:00:01 wird mittels BCD 0, dann 0, dann 0... und am ende 1 ausgegeben und die jeweilige Anzeige für die diese Zahl steht geht immer einmal kurz an? Dann braucht man ja ne ziemlich hohe frequenz, damit das nicht dunkler wirkt oder sogar flackert.

Das mit dem Display werde ich auf jeden fall auch mal in betracht ziehen, hab sowas nur noch nie gemacht, aber ich glaube um Bussysteme und LCDs komm ich wohl sowieso nicht mehr lange drumrum.

MfG Jan

Schokohoernl
01.09.2007, 15:06
hallo Spongebob85!

das mit dem multiplexen hast du schon richtig vestanden.

und das mit der frequenz... gar kein thema... hab auch mal ne 7-segment uhr gebaut mit nem AT90S2313 @ 10MHz und 5 stellen. Hab damals ne wiederholfrequenz von rund 1KHz hinbekommen. softwaremäßig war das ding auch dimmbar und helligkeitsunterschiede zu ner dauerbeleuchtung hat man eigentlich nicht gesehen. nachteil war halt das layout.... waren doch einige pins und bahnen zu ziehen und von demher waren die vielen brücken (die man auch auffm bild sieht) unvermeidlich (damals waren meine ätzfähigkeiten noch nicht so gut, dass ich leiterbahnen zwischen zwei pads durchbekommen hab). aber funktioniert super!
außerdem war das ne lösung ohne Decoder... die einzelnen anzeigen wurden mit transistoren über die gemeinsame kathode nacheinander ein und ausgeschaltet. sehr simpel alles

ach ja: das Bild (http://mitglied.lycos.de/master_niko/Dateien/Bilder/DSCN0855.JPG) (vorsicht: 2288 x 1712 Pixel)

und das mit LCD's:

gar kein problem... der HD44780 controller ist so weit verbreitet da findet man libs für alle sprachen... und bascom hat ja schon fertige, fast schon idiotensichere befehle.
ich hab z.b. Dieses Display (http://www.pollin.de/shop/detail.php?pg=OA==&a=Nzc1OTc4OTk=&w=OTg4OTk4&ts=20)... ist zwar 3 euro teurer als sein standard schwarz-auf-grün-kollege und hat eine etwas längere reaktionszeit, sieht aber einfach nur geil aus (sorry für den ausdruck).


MfG

Schoko

JonnyP
02.09.2007, 21:21
Wenn dir die Mutiplex Version nicht zusagt, gibt es noch eine andere Variante, die statisch funktioniert. Du brauchst dazu BCD zu 7-Segment Dekoder mit Latch wie z.B. den CD4543. Alle BCD-Eingaänge werden zu einem Bus verbunden, macht also 4 Leitungen. Die Latches werden einzeln oder über einen Decoder angesteuert, macht maximal weitere 6 Leitungen. Die Information liegt dabei per Bus an allen 6 Digits an. Die Info wird jedoch nur bei dem Dekoder wirksam, dessen Latch (Zwischenspeicher) du gerade frei gegeben hast.

AlKI
01.12.2007, 19:57
Hallo, ich versuche gerade selbiges mit datum und Wochentaganzeige, will aber die ausgabe vorerst über RS232 machen, später über ein LCD anzeigen und auch über I2C/TWI an einen anderen Microcontroller senden.

Habe mir dazu auch schon häftig was geschrieben, es wird mir auch über RS232 ausgegeben, aber das einstellen mit drei tastern (wofür etwa 3/4 des Codes zuständig ist) geht überhaupt nicht (keine reaktion) und nach einiger Zeit (6 Stunden, 52Minuten und nochmalwas sekunden) fängt er an, sich dauernd zu resetten.



EDIT: Ich habe nochmal neu angefangen, und mich Abschnittsweise an mein Ziel rangetastet. Jetzt geht es, ich muss nur noch die Passende Wartezeit finden, damit ich auch nach nem Jahr nicht um mehrere Minuten daneben lieg... (supergenau musses nicht sein/brauch ich es nicht)


$regfile = "m8515.dat"
$framesize = 50
$swstack = 50
$hwstack = 50
$crystal = 8000000

$baud = 9600


'config LCD

'LCD konfiguriert (optional)


Config Pina.0 = Input
Porta.0 = 1
Setztaster Alias Pina.0

Config Pina.1 = Input
Porta.1 = 1
Auftaster Alias Pina.1

Config Porta.2 = Input
Porta.2 = 1
Abtaster Alias Pina.2
'eingänge für die Taster zum stellen konfiguriert




Declare Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Monatstage As Byte , Hjahr As Byte , Htagname As Integer )
Declare Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer )



Dim Sekunde As Integer
Dim Minute As Integer
Dim Stunde As Integer
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Word
Dim Tagname As String * 2 'Hauptvariablen deklariert

Dim Monatstage As Byte 'zur ermittlung der Tage des Monats (30.2.2008 wäre schlecht)
Dim Hjahr As Byte 'zum zählen der Jahre um schaltjahre zu erkennen (das 2400 das Schaltjahr ausfällt, interessiert mich herzlich wenig)
Dim Htagname As Integer 'zum durchzaehlen der Wochentage

'Hilfsvariablen deklariert





Sekunde = 0
Minute = 0
Stunde = 0
Tag = 1
Monat = 1
Jahr = 2007 '1.1.2007

Hjahr = 3 '2008 kommt wieder ein Schaltjahr
Htagname = 1 'der 1.1.2007 war ein montag
'damit die Variablen schon zu anfang Werte haben

Wait 1 'wegen entprellter Taster mittels Kondensator zu GND

Do

Incr Sekunde 'Damit wird eine Sekunde weiter gezaehlt

If Sekunde = 60 Then
Sekunde = 0 '...nach 60 Sekunden ist ne minute rum..
Incr Minute
End If

If Minute = 60 Then '...nach 60 Minuten ne Stunde...
Minute = 0
Incr Stunde
End If


If Stunde = 24 Then '...und nach 24 Stunden ein Tag...
Stunde = 0
Incr Tag
Incr Htagname '...der natuerlich dann nicht mehr dersselbe Wochentag ist
End If


Select Case Monat ' erstmal muss ich wissen, wieviele Tage der Monat hat..

Case 1 :
Monatstage = 31
Case 2 :
If Hjahr = 4 Then
Monatstage = 29 ' (beim Schaltjahr)
Else
Monatstage = 28 ' (sonst)
End If
Case 3 :
Monatstage = 31
Case 4 :
Monatstage = 30
Case 5 :
Monatstage = 31
Case 6 :
Monatstage = 30
Case 7 :
Monatstage = 31
Case 8 :
Monatstage = 31
Case 9 :
Monatstage = 30
Case 10 :
Monatstage = 31
Case 11 :
Monatstage = 30
Case 12 :
Monatstage = 31

End Select



If Tag > Monatstage Then '...dann kann ich auch sagen, wann der Monat vorbei ist
Incr Monat
Tag = 1
End If

If Monat = 13 Then 'und nach 12 Monaten ist ein Jahr rum
Monat = 1
Incr Jahr
End If


Select Case Htagname 'dann guck ich noch, was fuern Wochentag ich hab...

Case 1 : Tagname = "Mo"
Case 2 : Tagname = "Di"
Case 3 : Tagname = "Mi"
Case 4 : Tagname = "Do"
Case 5 : Tagname = "Fr"
Case 6 : Tagname = "Sa"
Case 7 : Tagname = "So"
End Select

If Htagname = 8 Then 'mehr als 7 verschiedene Wochentage gib es aber nicht
Htagname = 1
End If






If Setztaster = 0 Then 'und wenn der Taster gedrueckt ist, will ich was einstellen
Call Einstellen(tag , Monat , Jahr , Monatstage , Hjahr , Htagname ) 'darum gehts jetzt in die Subs

Call Uhrzeiteinstellen(sekunde , Minute , Stunde ) 'ich hab zwei Subs weil ich sonst nen Rueffel vom Compiler bekomm, und ich besser Fehler finden kann
End If





Waitms 983 'n grober Schätzwert, dass ich die Loop-Schleife in einer Sekunde durchlaufe (dann kommt ja wieder "Incr Sekunde". Da kommt noch was genaueres hin. Irgendwann, vielleicht, unter Umstaenden


Print Tagname ; " " ; Tag ; ". " ; Monat ; ". " ; Jahr ; " " ; Stunde ; ":" ; Minute ; ":" ; Sekunde 'Und hier geb ich dann Wochentag, Datum und Uhrzeit aus


Loop 'der Loop zur ganzen Geschichte








Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Tagname As String * 2 , Monatstage As Byte , Hjahr As Byte , Htagname As Integer ) 'die Sub zum Einstellen des Datums (da noch Sekunde, Minute und Stunde dazu = Horror fuer den Compiler)

Wait 1

While Setztaster = 1 'soll laufen bis der Setztaster erneut betaetigt wird (ginge auch mit Do - Loop until)

If Auftaster = 0 Then 'wenn man incrementieren will, dann..
Incr Jahr '...ein Jahr weiterzaehlen...
Incr Hjahr '...den Zaehler fuer Schaltjahre mit weiterzaehlen
If Hjahr > 4 Then
Hjahr = 0 ' (n Schaltjahr kommt eben alle 4 Jahre vor)
End If
If Hjahr = 4 Then
Htagname = Htagname + 2 ' (faengt ein Jahr mit "Mo" an, und das naechste ist ein Schaltjahr, so faengt dieses mit "Mi" an)
Else
Incr Htagname ' (faengt ein Jahr mit nem "Mo" an, so faengt das naechste mit nem "Di" an)
End If
End If

If Abtaster = 0 Then 'the same procedure as beim indrementieren, nur diesmal decrementieren
Decr Jahr
Decr Hjahr
If Hjahr = 0 Then
Htagname = Htagname - 2
Else
Incr Htagname
End If
If Hjahr < 1 Then
Hjahr = 4
End If
End If

If Htagname < 1 Then 'Htagname kann negativ werden ("mo" entspricht 1, -2 wird daraus -1. es ist aber 6, naemlich "Sa"
Htagname = Htagname + 7
Elseif Htagname > 7 Then
Htagname = Htagname - 7 'selbiges kann bei + passieren
End If


Print "Jahr: " ; Jahr 'und AUSGABE! (den Rest mit auszugeben wird zu problematisch)

Waitms 200 'Warten, damit nicht zu schnell weiter-/zurueckgezaehlt wird (Reaktionstests und Geschicklichkeitsuebungen sind hier NICHT vorgesehen)

Wend


Wait 1


While Setztaster = 1

If Auftaster = 0 Then ' und das ganze fuern Monat
If Monat = 12 Then 'nicht weiterzaehlen, ist sonst zu schwer
Else 'sonst...

Incr Monat

Select Case Monat 'Jeh nach Monat beginnt der naeechste mit nem anderen Wochentag (pfffft, codecodecode)

Case 1 :
Htagname = Htagname + 3
Case 2 :
If Hjahr = 4 Then
Htagname = Htagname + 1
Else

End If
Case 3 :
Htagname = Htagname + 3
Case 4 :
Htagname = Htagname + 2
Case 5 :
Htagname = Htagname + 3
Case 6 :
Htagname = Htagname + 2
Case 7 :
Htagname = Htagname + 3
Case 8 :
Htagname = Htagname + 3
Case 9 :
Htagname = Htagname + 2
Case 10 :
Htagname = Htagname + 3
Case 11 :
Htagname = Htagname + 2
Case 12 :
Htagname = Htagname + 3

End Select

Waitms 200 'Wieder warten, damit wir nicht zu schnell sind

End If

End If


If Abtaster = 0 Then

If Monat = 1 Then 'nicht weiterzaehlen, sonst zu schwer
Else 'ansonsten...
Decr Monat


Select Case Monat

Case 1 :
Htagname = Htagname - 3
Case 2 :
If Hjahr = 4 Then
Htagname = Htagname - 1
Else

End If
Case 3 :
Htagname = Htagname - 3
Case 4 :
Htagname = Htagname - 2
Case 5 :
Htagname = Htagname - 3
Case 6 :
Htagname = Htagname - 2
Case 7 :
Htagname = Htagname - 3
Case 8 :
Htagname = Htagname - 3
Case 9 :
Htagname = Htagname - 2
Case 10 :
Htagname = Htagname - 3
Case 11 :
Htagname = Htagname - 2
Case 12 :
Htagname = Htagname - 3

End Select

End If

End If

If Htagname < 1 Then
Htagname = Htagname + 7
Elseif Htagname > 7 Then
Htagname = Htagname - 7
End If

If Monat = 0 Then
Monat = 12
Elseif Monat = 13 Then
Monat = 1
End If



Print "Monat: " ; Monat 'Ausgeben

Waitms 200

Wend



Wait 1



While Setztaster = 1 'Nun gehts noch an den Tag


Select Case Monat 'brauch ich gleich

Case 1 :
Monatstage = 31
Case 2 :
If Hjahr = 4 Then
Monatstage = 29
Else
Monatstage = 28
End If
Case 3 :
Monatstage = 31
Case 4 :
Monatstage = 30
Case 5 :
Monatstage = 31
Case 6 :
Monatstage = 30
Case 7 :
Monatstage = 31
Case 8 :
Monatstage = 31
Case 9 :
Monatstage = 30
Case 10 :
Monatstage = 31
Case 11 :
Monatstage = 30
Case 12 :
Monatstage = 31

End Select


If Auftaster = 0 Then
If Tag = Monatstage Then 'nicht weiterzaehlen
Else 'ansonsten..
Incr Tag
Incr Htagname 'der naechste Tag ist wohl auch der naechste Wochentag....
End If
End If

If Abtaster = 0 Then
If Tag = 1 Then 'nicht weiterzaehlen
Else 'ansonsten
Decr Tag
Decr Htagname
End If
End If





While Htagname < 1 'beidesmal While , wegen Dem "Htagname = Htagname + Monatstage" und dem "Htagname = Htagname - Monatstage"
Htagname = Htagname + 7
Wend
While Htagname > 7
Htagname = Htagname - 7
Wend


Print "Tag: " ; Tag 'und ausgeben

Waitms 200

Wend




End Sub




Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer ) 'Die Sub fuer die Uhrzeit

Wait 1

While Setztaster = 1

If Auftaster = 0 Then
Incr Sekunde
End If

If Abtaster = 0 Then
Decr Sekunde
End If

If Sekunde = 60 Then
Sekunde = 0
Elseif Sekunde < 0 Then
Sekunde = 59
End If


Print Stunde ; ":" ; Minute ; ":" ; Sekunde

Waitms 200

Wend


Wait 1

While Setztaster = 1

If Auftaster = 0 Then
Incr Minute
End If

If Abtaster = 0 Then
Decr Minute
End If

If Minute = 60 Then
Minute = 0
Elseif Minute < 0 Then
Minute = 59
End If


Print Stunde ; ":" ; Minute ; ":" ; Sekunde

Waitms 200

Wend


Wait 1



While Setztaster = 1

If Auftaster = 0 Then
Incr Stunde
End If

If Abtaster = 0 Then
Decr Stunde
End If

If Stunde = 24 Then
Stunde = 0
Elseif Stunde < 0 Then
Stunde = 23
End If


Print Stunde ; ":" ; Minute ; ":" ; Sekunde

Waitms 200

Wend

End Sub

evtuelle bugs sind nicht ausgeschlossen...

elayne
01.12.2007, 20:17
Hi,
Ich bevorzuge auch die Lösung mit µController und Multiplex-Ansteuerung. Aber ich denke es ist auf jeden Fall auch ohne Controller möglich. Du bräuchtest nur einen langsamen Taktgeber von einem Hertz (entweder NE555 oder Quarz mit Frequenzteiler) und einige Zählerbausteine und noch ein paar Digitalgatter. Ist bestimmt aufwändiger aber genausogut möglich.

Gruß
elayne