Forum: Mikrocontroller und Digitale Elektronik Digitaluhr


von Skater (Gast)


Lesenswert?

:moin:

ich will mal ne digitaluhr bauen, mit 6 LED Anzeigen (stunden (2)
minuten (2) und sekunden (2))
ich hab den AT90S2313.
ich will das so realisieren:

da der AT90S2313 ja bloß 15 pins hat, und eine LED anzeige 7 LED hat,
will ich eine schieberegister verwenden, das folgendermaßen
funktionieren soll (BSP an der sekundenazeige):

der schiebregister bekommt über einen pin vom AVR jede sekunde ein
kurzes signal (binär 0 1 0) daruf soll der schieberegister pin0
einschalten, an dem dann die anschlüsse für die ziffer "0"
angeschlossen sind. wenn der schieberegister noch einmal das gleiche
signal bekommt, soll er pin0 aus und pin 1 einschalten (ziffer 1
leuchtet) [...] wenn pin 9 eingeschaltet ist, udn das signal vom AVR
kommt, dann soll der schieberegister allerding wieder pin0 einschalten.
gleichzeitig bekommt ein zweiter schieberegister ein signal, dass die
zehner stellen für die sekundenanzeige regelt... ud genauso
funktioniert das mit den minuten und stunden anzeigen.
meine frage: ist soetwas mit eienm schieberegister möglich und wie muss
ich das dann anschließen??

THX 4 HELP!!

von Markus Kaufmann (Gast)


Lesenswert?

Hi,

schau Dir lieber mal an, was "Multiplexen" ist.

Markus

von Malte (Gast)


Lesenswert?

@ skater

schliesse alle 6 LED Anzeigen parallel an 7 pins deines AVR (a bis g)
und schalte mit weiteren 6 Transistoren die einzelnen Common-Pins
(common anode oder common cathode, je nach bausteintyp) jeweils
zwischen den displays 1-6 durch... somit zeigt immer nur EIN display
das was an Signalen an a..g anliegt und wenn du das schnell genug
durchschaltest (=multiplexen) dann sieht es so aus als würden alle 6
gleichzeitig leuchten und immer was anderes anzeigen.

von Skater (Gast)


Lesenswert?

@malte: das kann ich net machen, weil ich den exakten sekundentakt (ca
0,5 - 1 sek abweichung pro monat) so mache, in dem ich den AVR
"schlafen" lasse und er in dieser zeit keine befehle ausführen
kann... das hab ich mir nämlich auch schon überlegt... gibts da keine
möglichkeiten mit nem schieberegister oder sonst einem billigen IC
baustein (ich könnt ja auch 2 weitere, etwas billigere AVR nehmen. z.b.
AT90S1200 oder ATiny26, beide für ca 4,50€)
abe rich will das halt möglichst billig gestalten, da ich noch schüler
bin und keine kohle hab... :-(

von Merle (Gast)


Lesenswert?

Machs doch wie ich. Ich hab mir nen ATmega8515 gekauft dann mit 4*7 I/O
Ports die 4 7-Segment Anzeigen angesteuert und die sekunden hab ich mit
2 LEDS angezeigt das sieht ungefär so aus.

= --> 7-Segment Anzeige
: --> 2 LED's

= = : = =

So hab ich meine Uhr gemacht.#

Gruß
Merle

von crazy horse (Gast)


Lesenswert?

verstehe nicht, was du meinst.
Hast du einen externen 1s-Takt (woher auch immer)? Dann leg den an den
MC an, kein Problem.
Wenn der MC den Sekundentakt erzeugt, ist es auch wurscht, ob der meist
schläft oder nicht. Und Stromersparnis dürfte bei LED anzeigen auch
kein Argument sein.

von Jens Renner (Gast)


Lesenswert?

@Skater:
Ich denke, Du solltest nicht nur die Bauteilkosten minimieren, sondern
auch auf eleganten Code achten. Den µC jeweils eine Sekunde nichts tun
zu lassen, ist Verschwendung ohne Ende.
Sofern Du keine externe Referenz hast, solltest Du den Sekundentakt mit
einem Timer realisieren.

von Skater (Gast)


Lesenswert?

also: ich ham momentan nur die schlatung, die im AVR toturial gezeigt
wird. und ich hab den AT90S2313. somit hab ich bloß 15 I/O ports zur
verfügung, und net 35 wie beim ATmega8515. und momentan blink nur jede
sekunde eine LED (zum testen der genauigkeit) somit wird PB0 immer von
0 auf 1 und wieder auf 0 geschaltet. der 1 sekunden takt erzugt der MC
(weil er immer 0,8 sek schläft, und 0,2 sek ne led anschaltet) somit
kann ich net multiplexen!!!!!! ich muss da smit weitern IC regeln...

von Skater (Gast)


Lesenswert?

hmmm... das ist mir auch schon in den sinn gekommen, aber wie geht der
befehl dazu?? (ich benutze den AVR Assembler von ATMEL (AVR Studio
3.56)

von Jens Renner (Gast)


Lesenswert?

Es gibt dafür keinen Befehl in dem Sinne. Schau mal im Datenblatt des µC
im Abschnitt "Timer". Dort steht beschrieben, wie man ihn
initialisiert. Oder such mal hier im Forum nach Code-Beispielen.

von Peter D. (peda)


Lesenswert?

Ich würde Dir auch dazu raten, Dich erstmal mit den Timern zu
beschäftigen.

Denn die sind nämlich genau dafür gedacht, auf den Takt genau
Zeitreferenzen zu programmieren und trotzdem noch nebenbei viele andere
Aufgaben zu erledigen.

Meistens wird aber beides kombiniert, d.h. als Takt zum Multiplexen
wird ein Vielfaches der Zeitbasis genommen.
Z.B. 100Hz und die werden dann mit einem Register runtergezählt und bei
0 wird wieder auf 100 gesetzt, d.h. genau zu jeder Sekunde.



Peter

von crazy horse (Gast)


Lesenswert?

stimmt zwar, aber für einen Anfänger wäre es vielleicht einfacher und
übersichtlicher, den 1s-Takt direkt mit Timer1 im CTC-Mode zu erzeugen,
das multiplexen der Anzeige mit dem Timer0.

von Malte (Gast)


Lesenswert?

@ skater

die wirklich beste möglichkeit ist wenn du ein altes 386er oder 486er
board ausschlachtest und die RTC verwendest (meistens eine von DALLAS)
Sieht entweder aus wie ein etwas grösserer rechteckiger schwarzer
Kasten oder die neueren Varianten in einem DIP Gehäuse.
Wenn du die verwendest, dann braucht sich dein AVR nicht ums genaue
Timing scheren und du hast gleichzeitig battery backup.
Nur so ein Vorschlag

von Jörg Maaßen (Gast)


Lesenswert?

Ich würde das per I2C-Bus lösen.

Für jeweils 2 LED-Anzeigen nimmst Du einen PCA8575 oder PCA9555 (16
Ausgänge) bzw. für je 1 LED-Anzeige eien PCA8574 oder PCA9557 (8
Ausgänge).

Für die Ziffern 1 bis 0 legst Du jeweils eine Variable an in der das
Bitmuster für a-g der LED hinterlegt ist.

Die Uhrzeit würde ich in 3 Variablen für Stunde, Minute und Sekunde im
BCD-Format ablegen.

Dann programmierst Du für den 2313 einen Timer der jede Sekunde einen
Interrupt auslöst (sollte man da besser Overflow oder Compare Match
nehmen?).

Und nun noch das Haupptprogramm, das die Sekunden hochzählt, bei 60 dei
Minuten und wieder bei 60 Minuten die Stunden bis 24 Uhr und dann auf
00:00:00 zurück.

Ist jetzt alles reine Theorie. Aber genau so habe ich das vor
allerdings noch mit 1/10 und 1/100 Sekunden als Stoppuhr.

Das ganze soll dann umschaltbar sein auf
1. Uhrzeit im Wechsel mit Temperatur und
2. Stoppuhr wobei bei Auslösung eines Interrupts die Anzeige dann 3 mal
blinken soll.

Ich hoffe, dass ich das irgendwann, vielleicht auch mit zusätzlicher
Hilfe aus diesem excelenten Forum schaffe.

Gruß Jörg

von Peter D. (peda)


Lesenswert?

@Malte,

er will ja einen 2313 verwenden !
Da kann er doch keine 11 Pins nur für die RTC verbraten.

Es ist auch nicht so sinnvoll sich mühsam durch das Datenblatt eines
Chips durchzukämpfen, von dem man nur ein einzelnes Exemplar hat und
der vielleicht garnicht mehr hergestellt wird.
Und wenn er Pech hat ist dann gerade die Batterie alle.


Peter

von Matthias (Gast)


Lesenswert?

Hi

Thema Multiplexen:

Man sollte dazu keine "geraden" Frequenzen verwenden die Vielfache
von 50Hz sind. Es kann sonst unter Kunstlicht (vor allem
Leuchtstoffröhren) zu unschönen Interferenzen kommen die man vor allem
beim Bewegen der Anzeige sieht. Bie 7-Segment fällt das noch nicht so
auf bei Punktmatrizen wirds aber deutlich.

Matthias

von Jörg Maaßen (Gast)


Lesenswert?

Ich bleib bei I2C.

Falls Du den Sekundentakt nicht im AVR programmieren willst kannst Du
den "DS1307 64 x 8 Serial Real-Time Clock" von Maxim nehmen. Mit
einer Batterie dran hat das auch noch den Vorteil, das du die Uhrzeit
nicht jedesmal neu stellen must wenn Du denn AVR vom Netzt nimmst.

Falls du nur eine Anzeige von Stunde und Minuten brauchst kannst du die
Anzeige auch mit einem "SAA1064 4-digit LED-driver with I2C-Bus
interface" von Phillips realisieren (oder halt 1,5 SAA1064 dann auch
mit Sekunden).

Bei http://www.e-lab.de gibt es fertige Module für Clock und I2C
Porterweiterung.

Gruß Jörg

von Maximan (Gast)


Lesenswert?

Mal eine Frage, wird durch das Multiplexen nicht die Leuchtkraft der
LEDs vermindert? Wenn immer nur kleine Stromstösse kommen, schaltet die
LED doch jedes mal ein und wieder aus, und wenn man das mit 6 LEDs
macht, dann leuchtet die nur noch mit einem 6tel der Kraft?

Ist das nicht so oder merkt man es einfach nicht ?

von Andreas Jäger (Gast)


Lesenswert?

Ja, das ist so. Die LEDs erscheinen dunkler. I. d. R. reichts aber! Man
kann auch den Strom drastisch erhöhen. Dann erscheinen sie wieder
heller. Da nur Impulse kommen, vermindert das die Lebensdauer nicht
sehr.

MfG
Andreas Jäger

von Peter D. (peda)


Lesenswert?

@Jörg,

"Bei http://www.e-lab.de gibt es fertige Module für Clock und I2C
Porterweiterung."

I2C = 38 Ocken, RTC = 25 Ocken, aber sonst gehts gut :-)

Ich glaube nicht, daß Skater unbedingt den Wettbewerb "Wer baut die
teuerste Uhr" gewinnen will.

Dann schon eher den MAX7219 und die LED-Sache ist optimal gegessen.


Peter

von Jörg Maaßen (Gast)


Lesenswert?

@Peter,

war ja nur als Denkanstoss, da die auch die nötigen Schaltpläne
veröffentlichen.

Gruß Jörg

von Wilfried Nesensohn (Gast)


Lesenswert?

Ueber die tatsaechliche Helligkeit einer gepulsten LED habe ich eine
Appnote gefunden ueber die ich zufaellig gestolpert bin (in Appnotes
rumzustoebern lohnt sich des oefteren).
Wie ich meine eine doch ganz nette und kurze Abhandlung ueber eben
dieses Thema. Zu finden unter
http://www.onsemi.com/pub/Collateral/AND8067-D.PDF

Passt vielleicht nicht perfekt zu diesem Thread, ist aber sicher
oefters von nutzen.

mfg

von Jens (Gast)


Lesenswert?

Hallo,

ich habe genau so eine Uhr gebaut, als Stoppuhr.

AT90S4434 (gibt es bei Ebay - 3 Euro)-- dieser hat RTC

Interrupt Timer -- als Sekundentakt -- alles andere läuft parallel

6 mal CMOS 4094 als Schieberegister -- bei Reichelt - Pfennigkram

6 mal ULN 2803 als Treiber (oder andere)

Damit brauche ich minimal 2 Anschlüsse !!!! (CLK und Daten)

Ich schiebe jede Sekunde einfach 6 Zahlen (6 Byte) nacheinander durch
per Interruptroutine

Mit Bitmustern zeigen diese auch noch das Richtige an

Gruß Jens-Erwin

von Michael Lehr (Gast)


Lesenswert?

Hallo, nimm doch einfach einen max7219. Der treibt bis zu 8 Digits
(7-Seg-Anzeigen ),inkl. Helligkeitssteuerung, multiplexen etc.
Wird über 3 Leitungen per SPI angesteuert. Da bauchst du nur jede
Sekunde die neuen Werte übertragen.

Gruß Michael

von Martin (Gast)


Lesenswert?

wieso nimmst du keinen 7447 bzw. 7448 als anzeigentreiber? an diese
musst du nur den bcd-code schicken, also 4 anstatt 7 leitungen pro
anzeige

von Skater (Gast)


Lesenswert?

das hat jörg geschrieben:

[QUOTE]
Ich würde das per I2C-Bus lösen.

Für jeweils 2 LED-Anzeigen nimmst Du einen PCA8575 oder PCA9555 (16
Ausgänge) bzw. für je 1 LED-Anzeige eien PCA8574 oder PCA9557 (8
Ausgänge).

Für die Ziffern 1 bis 0 legst Du jeweils eine Variable an in der das
Bitmuster für a-g der LED hinterlegt ist.

Die Uhrzeit würde ich in 3 Variablen für Stunde, Minute und Sekunde im
BCD-Format ablegen.

Dann programmierst Du für den 2313 einen Timer der jede Sekunde einen
Interrupt auslöst (sollte man da besser Overflow oder Compare Match
nehmen?).

Und nun noch das Haupptprogramm, das die Sekunden hochzählt, bei 60
dei
Minuten und wieder bei 60 Minuten die Stunden bis 24 Uhr und dann auf
00:00:00 zurück.

Ist jetzt alles reine Theorie. Aber genau so habe ich das vor
allerdings noch mit 1/10 und 1/100 Sekunden als Stoppuhr.

Das ganze soll dann umschaltbar sein auf
1. Uhrzeit im Wechsel mit Temperatur und
2. Stoppuhr wobei bei Auslösung eines Interrupts die Anzeige dann 3
mal
blinken soll.

Ich hoffe, dass ich das irgendwann, vielleicht auch mit zusätzlicher
Hilfe aus diesem excelenten Forum schaffe.

Gruß Jörg
[/QUOTE]

wie kann ich denn (für nen schieberegister, die ich jetzt hab) ne
variable anlgen??
wie im basc?? also z.b.: eins = sbi PORTD, 4
                                cbi PORTD, 4

oder wie sonst??
wie gesagt, ich verwende momentan den assembler von ATMEL (AVR studio
3.56) und ich hab jetzt (noch) 2 schieberegister...

von Dirk (Gast)


Lesenswert?

Hi,

sehr viele varianten sind sehr teuer und wie ich finde sehr unnuetz
geraten.


Du hast ein 4Mhz Avr (fast so schnell wie ein GameboY) . Schau dir die
Timer an... Da kann dein AVR sekunden genau zaehlen (per calibration
bit) und nebenbei noch Kaffee kochen und deine Siebensegmentanzeige
steuern.

Ein programmierer will so wenig hardware benutzen wie es geht.
Desweiteren solltest du dir ein Schieberegister anschaun.


@maxim
Mal eine Frage, wird durch das Multiplexen nicht die Leuchtkraft der
LEDs vermindert?

Ja, aber sowas kann man wieder rum sogar mit software ausgleichen.


Mfg

Dirk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.