Hallo, ich probier gerade ein wenig mit AVR-GCC rum. Vorher hab ich mit Bascom gespielt. Nun will ich mich an mein erstes Projekt machen. Es soll eine Binäruhr werden, die von einem AVR MEGA 8 gesteuert wird. Schaltplan siehe Anhang( bitte nicht böse nehmen ich hab ihn nicht fertig gemalt). Mit ihr will ich die Uhrzeit, das Datum und den Wochentag darstellen. Insgesamt komme ich so auf 46 LEDs(wenn ich die unnötigen rausschmeise)(HH:6 + MM:7 + SS:7 + DD:6 + MM:5 + YY:8 + Wotag:7 = 46 LEDs). Wenn ich das ganze nun in einer 4x7 Matrix aufbaue (siehe Anhang)müsste ich die LEDs Multiplexen. Die Vorwiderstände der Spalten werden gemäß der SpaltenLEDs angepasst. Spalte1 stellt die Stunden dar, Spalte2 die Minuten... . Der Mega8 soll mit Timer2 im RTC Modus betrieben werden. Ich nutze also PC[0..3] als Zeilen PB[0..5] + PD7 als Spalten dadurch habe ich beide externen Interrupts frei für Taster (und evtl. DCF), sowie I2C und RS232 zum "ausbauen". Nun zu meiner Fragen: - Schafft der Mega8 das alles zu multiplexen( hab das was von 40Hz blinkfrequenz gehört) - wie bestimmt ihr das? - Gibt es bessere Vorschläge - ich will eigentlich versuchen ohne viel extra-Bausteine auszukommen. - Wieviel Strom dürfen die LEDs benötigen(20mA)? Vorteile von dieser Schaltung, die ich sehe: - günstig - wenig Bauteile - ausbaufähig mfg Alex Danke
also diese Multiplexschaltung halte ich nicht für sinnvoll, da ja eigentlich jede led einzeln angesteuert werden muss...
Ich würde dir raten, die LEDs so anzuklemmen: port x0: sek(1) min(1) stunde(1) tag(1) ... port x1: sek(2) min(2) stunde(2) tag(2) ... port x2: sek(4) min(4) stunde(4) tag(4)... port x3: sek(8) min(8) ... port x4: ... Somit brauchst du nix umrechnen. EInfach die Information min/sek/std.. auf den port mit ner zuweisung ausgeben... Die Multiplexung kann über nen timer erfolgen mittel timer_overflow. das ist schnell genug fürs auge..
Danke, aber so will ichs ja anklemmen. Im Prinzip hab ich dann ein "gemultiplextes" BCD Signal. Wenn ich alle LEDs auf einmal schalte, überlaste ich dann nicht meinen Spaltenport ( z.B. Zahl 7 bei Jahr => 3LEDs => 3*x mA = 20mA ). Ich wollte eigentlich "helle" LEDs nehmen weil das ganze am Schluss hinter ne Milchige scheibe soll. mfg
Hallo! im Anhang mal eine andere Lösung, die ich gerade baue. Allerdings mit 20 LEDs. Angesteuert durch ein 20 Bit-Schieberegister aus 3x8 Bit Registern.
Hi, nimm Low-Current-LEDs, die brauchen nur etwa 2mA pro Stück und sind auch nicht viel teurer als Standard. Ansteuern würde ich über zwei Ports, einen zum durchschalten (Stunden, Minuten, Sekunden, Tag, Monat, Jahr, evtl Jahr2, Wochentag), der zweite Port gibt das jeweilige Bitmuster aus. Den zweiten Port kann man dann direkt mit den entsprechenden Bitwerten füttern, den ersten Port über einen Timer mit genügen großem Vorteiler laufen lassen. Ich würde eine Frequenz von etwa 50Hz anstreben, das wären 2,5ms pro Reihe. Da die LEDs nur kurze Zeit an sind, müssen die auch mit höherem Strom betrieben werden (sonst sieht sie keiner mehr), das müßte man vorher im Datenblatt checken was die aushalten. Wenn Du nicht noch mehr Bits in die Anzeige pressen willst, dann sollten zwei Ports des Mega8 ausreichen, den Rest kannste dann für Schalter, Taster oder was Dir grad einfällt verwenden. Bei der oben genannten Frequenz für die Anzeige sollte der µC auch noch genug Reserven haben, um alle Berechnungen, die Dir zur Zeit einfallen, ausführen zu können. Gruß Fred
@entity: Warum nimmst nicht die eingebaute SPI-Schnittstelle?? @Alex: Ja, das muss beachtet werden. Ich würde dir npn-Transistoren in Kollektorschaltung empfehlen, als Spaltenschalter. Aber du brauchst in jeder Zeile einen Vorwiderstand. PS: erfahrungsgemäß reichen meist 10mA pro LED. Da du multiplext, kannst du den Strom verfielfachen, dass der Mittelwert wieder 10..20mA wird...
Wenn ich das jetzt richtig verstanden habe Fred willst du "auch" alle LEDs auf einmal schalten. => Du würdest also in die Zeilen die Vorwiderstände einbauen? Wenn er auf der Spalte ist, sind die LEDs immer unterschiedlich hell oder evtl. gar nicht an. Mit "meiner Methode" würde das ganze so gehen C-Code: //Hier mal vorausgesetzt, dass nur eine Spalte angeschlossen wird. void ledout(uint8_h data){ PORTC = data & (1 << PC0); PORTC = data & (1 << PC1); PORTC = data & (1 << PC2); PORTC = data & (1 << PC3); } main (){ ... // erste Stelle schreiben // hier: Spalte 1 high ledout( ... ); // Parameter für erste Stelle // hier: Spalte 1 low // zweite Stelle schreiben ledout( ~... ); // Parameter für zweite Stelle invertiert übergeben Vorteil des Algorithmuses er dauert immer gleich lange
@Matthias Du meinst so hier?: http://www.mikrocontroller.net/articles/Porterweiterung_mit_SPI Davon wußte ich noch nichts, vielen Dank für den Tipp. Die Programmierung vereinfacht sich dadurch ja sicher erheblich!
bei mir es etwa so gehen: (pseudocode) { port_anderer = 1, 2, 4, 8, .. // ausgabe der aktiven spalte portc = data; // entweder min, sek oder std, oder.. } Das packst du in eine timer-overflow-ISR und tust bei jedem aufruf den port_anderer weiterschalten (1=>2=>4=>..) und die nächsten daten ausgeben.. Vorteil des Algorithmuses: er dauert immer gleich lange & ist ist einfacher.. und es sind ja nur paar widerstände und trans. notwendig... @entity: geht bis quartzfreq/2..., bitte schön
Hallo, nochmal. Den Pseudocode von Matthias hab ich verstanden, ist soweit auch kein Problem. Sowas in der Art hab ich das gestern Nachmittag auch mal geschrieben. Wenn ich euch alle richtig verstehe würdet ihr Low-Current LEDs nehmen. Und alle Ports auf einmal schalten. Aber was ist wenn ich "MEHR" Strom will? Nur darum bin ich ja auf die Idee mit dem getakteten Zeilensignal gekommen. Meine Problem momentan ist, dass ich nicht einfach einen Transistor zum Schalten der Spalten nehmen kann, da ja Strom in beide Richtungen fließen können muss. Zu meinem zweiten Problem gehört noch folgendes: Wenn ich z.B. folgendes Mache: PORTB = (1<<PB0); PORTB = (1<<PB1); und an PB0 und PB1 ne LED angeschlossen habe fließt dann überhaupt mal auf PB0 ein Strom? Wenn mein AVR mit 4Mhz läuft, kann dann das I/O Register überhaupt so schnell schalten? Oder ist dann die LED an PB0 "für wenige µs ein"? Ich denke nämlich nicht, dass das reichen wird. Oder müsste ich nach jedem schalten einige µs Delay geben? Mit der Timermethode von Matthias ist mir das erst richtig bewusst geworden. mfg
>also diese Multiplexschaltung halte ich nicht für sinnvoll, da ja >eigentlich jede led einzeln angesteuert werden muss... >4x7 Matrix Irgendwie erinnert mich der Aufbau an "Chalieplexing"*. >Wenn mein AVR mit 4Mhz läuft, kann dann das I/O >Register überhaupt so schnell schalten? Oder ist dann die LED an PB0 >"für wenige µs ein"? Die Register schaffen es auf jeden Fall. Die Frage ist eher: Schaffen es die LEDs in der kurzen Zeit hell genug zu leuchten? >Das packst du in eine timer-overflow-ISR und tust bei jedem aufruf den >port_anderer weiterschalten (1=>2=>4=>..) und die nächsten daten >ausgeben.. Naja, ob es unbedingt ein Overflow sein muß, sei dahingestellt. Schlisslich gibt es so Sachen wie CTC-Modus, womit man sich auch gleichzeitig noch eine Zeitbasis für die Uhr basteln kann. *http://www.maxim-ic.com/an1880 http://en.wikipedia.org/wiki/Charlieplexing
@Rahul, der Trollige (Gast) >Register überhaupt so schnell schalten? Oder ist dann die LED an PB0 >"für wenige µs ein"? >Die Register schaffen es auf jeden Fall. Die Frage ist eher: Schaffen es >die LEDs in der kurzen Zeit hell genug zu leuchten? Sicher. 0815 LEDs schalten in 50ns und weniger. MfG Falk
> Sicher. 0815 LEDs schalten in 50ns und weniger. Naja, schalten tun die LEDs schon, aber wirklich Ihre volle Leuchtstärke erreichen sie so nicht. Prinzipiell würde ich die Umschaltung der LED-Matrix immer nur so schnell machen, dass sich für die gesamte Anzeige eine Wiederholrate zwischen 60 .. 100Hz ergibt. Damit ist die Anzeige schnell genug um "für die meisten Betrachter" nicht zu flackern, aber die LEDs sind solange wie möglich an. Eventuell ist es auch sinnvoll den Strom für die LEDs etwas über den angegebenen Nennstrom festzulegen. Die LEDs vertragen im allgemeinen eine sehr viel höheren Peakstrom (Das Datenblatt der LEDs ist da immer hilfreich.). Allerdings muss bei dieser Ansteuerung sichergestellt sein, dass die Ansteuerungssoftware wirklich funktioniert. Denn wenn dann mal die SW stehen bleibt oder anstürzt, dann ist die aktuell angesteuerte LED-Spalte sicher hin... Ansonsten sollte man bei der Auswahl der LEDs nach Möglichkeit keine LowCurrent-Modelle für die Matrix-Ansteuerung verwenden, weil diese Typen generell nicht so hell sind und außerdem in der Ansteuerung auch relativ langsam. Dann lieber eine richtig schöne Leistungsstufe für die LEDs einplanen. Pläne für Matix-Treiber findet man den den unterschiedlichsten Varianten zu hauf im Internet. Eine Variante, so wie ich sie benutze findet man z.B. unter http://www.thomas-wedemeyer.de/elektronik/AVR/avr-dcf-clock.html So weit! Thomas
@twede >Naja, schalten tun die LEDs schon, aber wirklich Ihre volle Leuchtstärke >erreichen sie so nicht. ??? Woher weisst du das? Gemessen? >LED-Matrix immer nur so schnell machen, dass sich für die gesamte >Anzeige eine Wiederholrate zwischen 60 .. 100Hz ergibt. Damit ist die >Anzeige schnell genug um "für die meisten Betrachter" nicht zu flackern, >aber die LEDs sind solange wie möglich an. [ ] Du hast PWM verstanden. >Eventuell ist es auch sinnvoll den Strom für die LEDs etwas über den >angegebenen Nennstrom festzulegen. Die LEDs vertragen im allgemeinen Der Pulsstrom MUSS höher als der Nennstrom bei normaler Gelichstromansteuerung sein, mämlich um den Multiplexfaktor höher. Arithmetischer Mittelwert und so. >LowCurrent-Modelle für die Matrix-Ansteuerung verwenden, weil diese >Typen generell nicht so hell sind und außerdem in der Ansteuerung auch >relativ langsam. Dann lieber eine richtig schöne Leistungsstufe für die Langsam? Wie langsam denn? Die sind garantiert schneller als es für die schnellste PWM notwenig ist. Als "Leistungsendstufe" tuns ein paar 0815 Transistoren oder ein ULN2003. MFG Falk
twede wrote: > Anzeige eine Wiederholrate zwischen 60 .. 100Hz ergibt. Damit ist die > Anzeige schnell genug um "für die meisten Betrachter" nicht zu flackern, > aber die LEDs sind solange wie möglich an. Das ist Mumpitz mit Soße. Wenn Du ne 8*8 Matrix hast, ist jede LED genau 12,5% der Zeit an. Wie lange das ist, spielt keine Geige. Lediglich bei über 1MHz kann es leicht dunkler werden, durch die Befehlsausführungszeit (2 * OUT = 100ns). Dann bist Du aber nur noch am Interrupten. Ich hab auch mal 20kHz genommen, weil ich grad so nen Timerinterrupt brauchte. In der Regel nehme ich etwa 1,6kHz (1,6kHz / 8 = 200Hz Bildfrequenz). Peter P.S.: Bei hohen Frequenzen sollte man die Treiber in Kollektorschaltung benutzen, weil sonst die Miller-Kapazität stören kann (Nachleuchteffekt).
@falk >??? Woher weisst du das? Gemessen? Ne, habe ich nicht. Aber eine "normale" Diode schaltet ja irgendwann auch nicht mehr richtig durch, u.a. bedingt durch die Kapazität. Entsprechendes müsste auch für LEDs gelten. Ob das jetzt bei eine Ansteuerfrequenz von 1MHz oder 20MHz (->50ns) ist, keine Ahnung. Hängt sicher von der Bauform, der Kapazität und der Leuchtfarbe (-> unterschiedliche Halbleitermaterialien) der LED ab. > Der Pulsstrom MUSS höher als der Nennstrom bei normaler > Gelichstromansteuerung sein, mämlich um den Multiplexfaktor höher. Für die gleiche Leuchtstärke ist das auf jeden Fall. Der begrenzende Faktor ist dabei allerdings der im Datenblatt angegebene Pulsstrom und eventuell Pulsdauer. Wenn man allerdings als Anfänger gerade anfängt mit der Programmierung in C würde ich die Stromwerte so definieren, das auch bei einem SW Absturz alles heile bleibt. Dann ärgert man sich nicht so, wenn mal wieder die SW hängenbleibt. Zum Thema Low Current-LEDs: Das letzte Mal als ich ein paar LowCurrent-LEDs eingesetzt habe, waren sie bei hoher Frequenz definitiv dunkler als "normale" LEDs. Das ist aber auch sicher schon 15 Jahre her. Ich gehe deshalb davon aus, dass das tendenziell immer noch so ist. Vielleicht liegt dieses Verhalten einfach daran, dass man bei einem um Faktor 10 reduzierten Strom entsprechend 10 mal solange benötigt, um die in etwa gleiche Kapazität der LEDs umzuladen. @Peter Ob man jetzt mit 100Hz oder 200Hz Wiederholrate arbeitet ist wirklich total egal. Allerdings 20kHz würde ich wahrscheinlich nie benutzen. Was macht es für einen Sinn die Frequenz höher zu setzen als notwendig? Dadurch hat man doch nur unnötige Verluste in der Treiberstufe. Da würde ich, wenn es die SW zulässt in der TimerIRQ-Routine einen Zähler einbauen, der nur bei jedem x-ten Aufruf der ISR eine Umschaltung der LEDs durchführt. So dann! Thomas
@ twede >>??? Woher weisst du das? Gemessen? >Ne, habe ich nicht. Aber eine "normale" Diode schaltet ja irgendwann >auch nicht mehr richtig durch, u.a. bedingt durch die Kapazität. Also alles wieder mal nur Vermutingen, basierend auf bruchstückhaftem Wissen ohne Substanz. Ganz toll . . . >eventuell Pulsdauer. Wenn man allerdings als Anfänger gerade anfängt mit >der Programmierung in C würde ich die Stromwerte so definieren, das auch >bei einem SW Absturz alles heile bleibt. Dann ärgert man sich nicht so, >wenn mal wieder die SW hängenbleibt. Sicher, das ändert aber erstmal nix an dem grundsätzlichem Problem. Vor allem sollte amn icht zwei Sachen in einen topf werfen. a) LEDs sind im MUX -Betrieb genauso hell wie bei Gleichstrom (bei richtiger Dimensionierung) und b) abstürzende Software im Entwicklungsstadium >dunkler als "normale" LEDs. Das ist aber auch sicher schon 15 Jahre her. >Ich gehe deshalb davon aus, dass das tendenziell immer noch so ist. Du hast 15 Jahre sehr dynamische LED-Entwicklung verschlafen. Guten Morgen. Vor 15 Jahren wahren LEDs teure Halbleiterglimmlämpchen mit wenig Lichtausbeute. Schau dir mal normale LEDs an, vobn den ultrahellen und Power LEDs mal ganz zu schweigen. MfG Falk
Machs mit low-current LED's, PNP-Transistoren als Spaltentreiber (je einen für T,M,J, H,M,S) und einen Port als Zeilentreiber (damit du nur das entsprechende Byte raus schreiben musst und nicht umrechnen) Den Vorwiderstand der einzelnen Zeilen dimensionierst auf ca. 10 mA (das macht dann bei nem Multiple von 1:6 knapp 2 mA) Die 10 mA kann der Port auch leicht "sinken" (gegen GND ableidten). Dan PNP-Transistor kannst auch weg lassen, allerdings wirst dann nur noch auf 4-5 mA kommen, da ein AVR-Port meist nicht mehr Strom "sourcen" kann. Hab mal eine 7-Segement-MPX Anzeige (low-current) so angesteuert mit ca 400 Hz (macht dann bei 4 Segmentenn 100 "Frames" pro sekunde) Die Helligkeit könnte (ohne Transistor) zwar höher sein, zum Ablesen reicht es jedenfalls. Falls du vorhast die Uhr bei Nacht im Schlafzimmer oder dgl zu betreiben: Bau unbedingt ne Dimmfunktion ein, z.B. nach dem "Durchmultiplexen" ein Paar Takte Pause machen, der Multiplextimer sollte dann natürlich ausreichend schnell sein (z.B. 10000 Hz oder mehr) damit es beim Dimmen nicht flimmert. Bei 6 Spalten + 94 Pausen hast ca. 1% Helligkeit (dies ist bei Nacht ausreichend) und noch 100 Fps Gruß Roland
@falk >Also alles wieder mal nur Vermutingen, basierend auf bruchstückhaftem >Wissen ohne Substanz. Ganz toll . . . Naja, eine gesundes Halbwissen ist doch besser als nichts, oder?! Vielleicht kannst Du mir ja ein Paar schöne Links zu Applicationnotes oder Datenblättern von 0815-LEDs schicken, wo das Verhältnis zwischen Ansteuerfrequenz und Helligkeit aufgeführt wird und die Grenzfrequenz von LEDs dargestellt wird. >Sicher, das ändert aber erstmal nix an dem grundsätzlichem Problem. Vor >allem sollte amn icht zwei Sachen in einen topf werfen. a) LEDs sind im >MUX -Betrieb genauso hell wie bei Gleichstrom (bei richtiger >Dimensionierung) und b) abstürzende Software im Entwicklungsstadium Stimmt die beiden Punkte haben nichts miteinander zu tun, außer das sich meine Aussagen direkt auf die Fragestellung am Anfang des Threads beziehen. Ich würde immer einem Anfänger erst raten eine sicher funktionierende unkritische Schaltung aufzubauen. Optimieren kann man sie dann immer noch, wenn das alles sicher funktioniert. So weit. Thomas
@twede >Naja, eine gesundes Halbwissen ist doch besser als nichts, oder?! IRRTUM! Das ist gefährlicher als Unwissenheit. Und kann SEHR nervtötend und kontraproduktiv sein, wenn so einer in einem Team drinsteckt, vor allem wenn er gewisse Führungspositionen inehält. Been there, sufferd that. >Vielleicht kannst Du mir ja ein Paar schöne Links zu Applicationnotes >oder Datenblättern von 0815-LEDs schicken, wo das Verhältnis zwischen >Ansteuerfrequenz und Helligkeit aufgeführt wird und die Grenzfrequenz >von LEDs dargestellt wird. Kann ich. Siehe Anhang. MfG Falk
>Achtung Leute, Falk hat wieder schlechte Laune...
Das hat gar nichts mit schlechter oder guter Laune zu tun.
Halbwissen ist gefährlicher als Unwissen (wie Falk schon schrieb).
Halbwissen und andere sprituelle Sachen haben nicht, aber auch gar
nichts mit Sachen zu tun, die man sehr einfach beweisen kann, aufgrund
der Tatsache, dass Elektronik doch sehr deterministisch ist.
Sowas gehört in die Kirche (in andere Glaubenshäuser oder in die
Politik)...
>Ist schon richtig, nur der Ton machts halt!!
Da käme dann wieder nur padagogisches Geschwätz bei raus.
Und es würde wieder jemand mit seinem (gefährlichen) Halbwissen
"amoklaufen". ("Mein UART funktioniert auch mit dem integrierten
Quarzoszillator.")
> "Mein UART funktioniert auch mit dem integrierten Quarzoszillator."
Ohne genauen Bezug ist an diesem Satz nichts falsch.
Salmonellenbekämpfer wrote:
>> "Mein UART funktioniert auch mit dem integrierten Quarzoszillator."
Meine auch.
Die Oszillatorschaltung ist ja intern, bloß den Quarz muß man noch außen
ranpappen.
Allerdings setzen 99,99% der Leute, die den obigen Satz sagen, nicht den
Quarzoszillator sondern den RC-Oszillator. Sie lügen also.
Peter
>Ohne genauen Bezug ist an diesem Satz nichts falsch. Nenn mir bitte einen Mikrcontroller, der einen integrierten Quarz hat. >Die Oszillatorschaltung ist ja intern, bloß den Quarz muß man noch außen >ranpappen. Hmmm.... >Allerdings setzen 99,99% der Leute, die den obigen Satz sagen, nicht den >Quarzoszillator sondern den RC-Oszillator. Sie lügen also. Eben. Weiterhin ist nicht gesagt, dass der Oszillator bei jedem so funktioniert (Bauteilstreuung, unterschiedliche Umgebugen etc). Diese "Es gibt ..."-Definitionen sind nicht gleich zu setzen mit "Es gilt für alle...". Wird aber gerne so angenommen. (DSB-Informatiker mögen mir jetzt verzeihen, wenn ich die falsche Nomenklatur benutzt haben sollte).
> Nenn mir bitte einen Mikrcontroller, der einen integrierten Quarz hat.
Da jetzt ein Bezug da ist, natürlich kein µC hat ihn integriert. Du hast
halt den Satz so einfach in den Raum gestellt. Ich dachte, du meinst
einen speziellen UART-Controller, der seinen Takt von einem externen
Quarzoszillator bekommt. Dieses Oszillator hat, wenn man so will, einen
Quarz integriert. Aber ist antürlich alles auch Ansichtssache.
>Dieses Oszillator hat, wenn man so will, einen Quarz integriert.
Der wird aber auch extern angepappt.
Übrigens: Genug der Fred-Entführung. (Vorschlag meinerseits)
Hi, könnte Alex jetzt vielleicht kurz zusammenfassen wie er die Binäruhr jetzt aufbauen wird? Das macht es für den Anfänger leichter den Überblick zu behalten und ist ein guter Tip für den Anfang falls jemand sich entschließt das ganze nachzubauen.
@falk Tja, tut mir leid, aber scheinbar bin ich doch zu blöd die Applicationnote zu lesen. Jedenfalls habe ich in der Applicationnote nichts zum Thema Schaltzeiten in Bezug auf Helligkeit und Grenzfrequenzen von LEDs gefunden. Interessant fand ich allerdings Absatz auf der letzten Seite der Überschrieben ist, mit "DC Opertation is Better than Pulsed Operation for Light Output". Naja, wenn Du noch weitere spannende Applicationnotes hast immer man her damit. Vielleicht steht da ja was drin, was ich noch nicht weiß. Bis dann! Thomas
@twede >nichts zum Thema Schaltzeiten in Bezug auf Helligkeit und >Grenzfrequenzen von LEDs gefunden. Dazu steht nix drin. ICh finde auf die schnelle auch kein Datenblat, wo Schaltzeiten aufgeführ sind. Muss mal in meinen PDFs suchen. >Interessant fand ich allerdings Absatz auf der letzten Seite der >Überschrieben ist, mit "DC Opertation is Better than Pulsed Operation >for Light Output". Naja, wobei "Better" auch nur im Sinne einer maximalen Lichtausbeute in Bezug auf die maximale Verlustleistung zu sehen ist. MFG Falk
Servus, bin seit gestern wieder online scheiß Studiengebühren und habe die bewegung in diesem Beitrag gesehen. Momentaner Stand: Ich hab mal eine Spalte auf nem Steckbrett zusammengebastelt. Mit der Methode aus meinem ersten Beitrag funktioniert das ganze schon recht gut. Software im Anhang. Getestet hab ich es mit Low-Current LEDs 5mm von Reichelt. Strom auf 5mA DC berechnet und klappt recht gut. Das ganze Funktioniert auch mit ner blauen LOW-COST LED von Reichelt, allerdings komm ich nicht auf die normale Helligkeit selbst mit kleinem Vorwiderstand. Bei hellen LEDs bekomme ich nur ein Aufleuchten das nicht besonders hell ist. Ich benötige eigentlich helle bis ultrahelle LEDs da das ganze später hinter ner matten Plexiglasscheibe eingebaut werden soll(*als Schranktür*) G. OK, die Methode von Thomas Wedemeyer ist schon nicht schlecht, allerdings reichen bei mir die Ports nicht beim Mega8. Also bleibt für mich übrig: Methode 1: Anderer Controller z.B. Mega8535 Methode 2: PORTerweiterung durch nen 4auf16 decoder vgl. 74*4514 nur invertiert und dann mit pnp-Transistoren die Spalten treiben und mit nem ULN 2803 die Zeilen
@Alex >Habe noch ne andere Idee, so spare ich mir die Transistoren. Du tauschst IO-Ports, die locker 20mA schaffen gegen lausige OPVs, die weiger Strom liefern und langsamer sind? Schlechter Deal. Wie bereits jemand vorgeschlagen hat, sollte man die Daten als 6x7 Matrix aufbauen, da kannst du direkt die Daten ausgeben, ohne rumfummeln zu müssen (wobei nicht jede Spalte voll sein muss). Etwa so. Siehe Anhang. >Das ganze Funktioniert auch mit ner blauen LOW-COST LED von Reichelt, >allerdings komm ich nicht auf die normale Helligkeit selbst mit kleinem >Vorwiderstand. Mit welcher Spannung läuft dein uC? Die blauen LEDs brauchen ca. 3,5V Flusspannung, dein AVR muss also mit 5V laufen. >Ich benötige eigentlich helle bis ultrahelle LEDs da das ganze später >hinter ner matten Plexiglasscheibe eingebaut werden soll(*als >Schranktür*) G. Kein Problem, die meisten brauchen auch nur 20mA. >Methode 1: Anderer Controller z.B. Mega8535 >Methode 2: PORTerweiterung durch nen 4auf16 decoder vgl. 74*4514 nur >invertiert und dann mit pnp-Transistoren die Spalten treiben und mit nem >ULN 2803 die Zeilen Weder noch. Die Pins reichen. Siehe Anhang. Dein Program ist, naja, ausbaufähig und bedürftig. >ISR(TIMER1_COMPA_vect){ > static uint8_t i=(uint8_t)(-1); ??? Entweder signed oder unsigned. > > // TRI-STATE weiterschieben, bis letzte LED einmal an war > if (DDRC < (1 << PC3)){ > DDRC = (DDRC << 1); > } Ähhh, das scheint mir ein wenig seltsam. Wenn ich das richtig verstehe, willst du 12 BCD Zahlen MUXen (1:12). Das heisst doch aber, dass du bei jedem Interrupt eine neue Zahl ausgeben musst. Und nicht jede einzelne LED innerhalb der BCD Zahl nochmal MUXen, das wäre ja dann ein 1:48 MUX und damit äusserst kritisch (weil entweder lichtschwach oder zu hohe Pulsströme). MfG Falk
ISR(TIMER1_COMPA_vect){ static uint8_t i=(uint8_t)(-1); Ganz einfach, denk mal an den ersten aufruf des Programms. Durch i++ bin ich dann bei null. Ich hätte natürlich auch 255 schreiben können. Durch tatic bleibt mir die Variable über jeden Aufruf des Programms erhalten. Durch das weiterschieben des Tri-State liefert mir immer nur ein PIN Strom. http://www.mikrocontroller.net/attachment/20936/untitled.sch__1_.pdf Es ist richtig, ich muxe jede Ziffer der BCD-Zahl extra. mfg
@Alex >ISR(TIMER1_COMPA_vect){ > static uint8_t i=(uint8_t)(-1); >Ganz einfach, denk mal an den ersten aufruf des Programms. >Durch i++ bin ich dann bei null. Ich hätte natürlich auch 255 schreiben >können. Dann schreib auch 255. Ist solide und weniger Tipperei. >Durch tatic bleibt mir die Variable über jeden Aufruf des Programms >erhalten. Schon klar. >Durch das weiterschieben des Tri-State liefert mir immer nur ein PIN >Strom. Auch klar, aber dennoch baust du dir dadurch einen 48:1 MUX, obwohl du einen 12:1 Mux willst. Es ist doch recht einfach. Dein Zyklus soll so aussehen. 1.BCD an (postive Logik) 2.BCD an (negative Logik) 3.BCD an (postive Logik) 4.BCD an (negative Logik) 5.BCD an (postive Logik) 6.BCD an (negative Logik) 7.BCD an (postive Logik) 8.BCD an (negative Logik) 9.BCD an (postive Logik) 10.BCD an (negative Logik) 11.BCD an (postive Logik) 12.BCD an (negative Logik) Dazu musst du aber bei jedem Interrupt deine PC=..3 neu schreiben (und damit i erhöhen, um den Index auf die neuen Daten zu bekommen) und bei jeden 2. Interrupt PB0..PB7 um eine Stelle weiterschieben. Du machst aber was anderes. Du schiebst die Daten in DDRC solange nach links, bis das Egebnis grösser oder gleich 0x8 ist. Kann es ein, dass du ausserdem DDRC mit DDRB verwechselt hast? >http://www.mikrocontroller.net/attachment/20936/un... Der Widerstand ist an der falschen Stelle. Du musst den in deiner Schaltung in die Zeilen einfügen (PC0..3, je 1 Widerstand). MFG Falk
Du hast hier absolut recht. Durch das einzelne Einschalten der LEDs ist immer nur eine LED an. Wenn mehrere Anwähren würde sich ja bei der oben genannten Methode abhängig von der Anzahl der einzelnen LEDs unterschiedliche Helligkeiten ergeben. Die gepostete Software war ja auch nur ein Versuch "helle" LEDs direkt an den Ports zu betreiben. Wenn ich alle LEDs gleichzeitig schalten will (BCD-Signal direkt auf den PORT) ist mir schon klar, dass die Widerstände in den Zeilen sein müssen. Ich werde nun wohl auch die Methode mit den pnp Transistoren und dem ULN Baustein verwenden, weil damit viel höhere Ströme möglich sind. Danke nochmal. P.S. Die Software funktioniert übrigens schon, ob du es glaubst oder nicht. Funktionsweise: Pseudecode: - Spalte auswählen, alle andere Spalten auf TRI-State - Daten ins PORT-REGISTER - binäre 1er Stelle ein(auf Ausgang, andere auf Eingang TRI-STATE)*DDR* - binäre 2er Stelle ein(auf Ausgang, andere auf Eingang TRI-STATE)*DDR* - binäre 4er Stelle ein(auf Ausgang, andere auf Eingang TRI-STATE)*DDR* - binäre 8er Stelle ein(auf Ausgang, andere auf Eingang TRI-STATE)*DDR* - nächste Spalte auswählen ... mfg Alex
@Alex >P.S. Die Software funktioniert übrigens schon, ob du es glaubst oder >nicht. Das glaub ich schon, aber ein 48:1 MUX ist nun mal alles andere als praktikabel, vor allem wenns hell sein soll. MfG Falk
Das hab ich auch schon bemerkt, dass die Methode in Sachen Helligkeit nicht sehr "toll" ist. Ich lese mich gerade in die Arbeitspunkteinstellung von Transistoren ein, hab sowas ja noch nie gemacht!?! Warum habt ihr denn da nen Spannungsteiler an der Basis drin??? Bitte bitte vergebt mir, das ich solche Fragen stelle, hat sicher nen Hintergrund, dass ihr das macht. mfg
@Alex >ein, hab sowas ja noch nie gemacht!?! Warum habt ihr denn da nen >Spannungsteiler an der Basis drin??? Wenn du meine Schaltung meinst, das sind Konstantstromquellen. Der Spannngsteiler (1k/2.7K) schaltet die Basis auf eine halbwegs konstante Spannung (hier ca. 4V, die Spannung ist NICHT ganz so, wie es das Widerstandsverhältnis ergeben würde, weil der relativ hochohmige (=schwache) Spannungseiler durch die Basis belastet wird). Ca. 0,7V fallen zwischen Emitter und Basis ab, bleibt der Rest (ca. 0,3V) über dem Emitterwiderstand von 4.7 Ohm. Dadurch stellt sich ein Strom von ca. 0,3/4.7 ~65 mA. Durch Variation des Emitterwiderstands kannst du den Strom einstellen. >Bitte bitte vergebt mir, das ich solche Fragen stelle, hat sicher nen >Hintergrund, dass ihr das macht. Wie, Weshalb, Warum, wer nicht fragt bleibt dumm. (Sesamstrasse) Hey, dazu ist dieses Forum da. Der entscheidende Punkt ist immer, wie die Leute rüberkommen. Faul, "Macht mal meine Hausaufgaben", oder lernwillig. MFG Falk
OK, mit nem FET hatte ich die Konstantstromquelle schon verstanden, jetzt nach etwas suchen im Netz auch mit Bipolartransistor, juhu. Ist an sich keine schlechte Idee den Strom zu begrenzen, ich hätte halt die BAUERNMETHODE verwandt und den Transistor als Schalter eingesetzt. Dann werd ich die neuen Bauteile bestellen und mal schauen. mfg Alex P.S. Ich meld mich wenn ich die Sachen habe und das ganze mal läuft. warten
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.