: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!!
@ 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.
@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... :-(
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
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.
@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.
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...
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)
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.
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
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.
@ 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
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
@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
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
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
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 ?
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
@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
@Peter, war ja nur als Denkanstoss, da die auch die nötigen Schaltpläne veröffentlichen. Gruß Jörg
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
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
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
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.