Hallo Mikrocontroller-Gemeinde! Ich bin neu in der AVR-Umgebung und arbeite an meinem ersten Projekt mit einem ATMega162. Soweit läuft alles, allerdings habe ich eine unschönheit (Designfehler?) im Projekt: Ich spreche über Ports per Multiplexing 7-Segmentanzeigen und LEDs an. Um die Anzeige darzustellen, lasse ich sie per Timer-Interrupt "flackern" um einerseits das Multiplexing zu realisiern und andererseits eine geringe Stromaufnahme zu haben. Damit die LED leuchtet, ziehe ich das Signal auf low. Gibt es die Möglichkeit, den ATMega162 per Register so einzustellen, dass Ports automatisch nach Beendigung des Ausgabebefehls wieder auf high springen? Ich habe nichts gefunden oder vielleicht auch nur nach den falschen Keywords gesucht. Also bei einem alten 8051-Board, auf dem ich mal gearbeitet habe, war das automatisch so. Bisher habe ich das so gelöst, dass ich das Signal danach wieder auf high stelle. Das kostet mich aber einen Takt und ist unschön. Danke Lars
Ist aber notwendig. Monoflop-Verhalten ist bei Controllerports unerwünscht, da man sich darauf verlassen können muss, das ein einmal gesetzter Pegel solange gehalten wird, bis der Port gezielt geändert wird. Ausserdem muss der Port für eine Multiplexanzeige für eine gewisse Zeit gehalten werden, sonst sieht man schlicht nichts. Man darf nicht vergessen, der Ausgabebefehl dauert einen Takt, der nächste Takt würde den Portpin wieder auf 1 ziehen. Dauer = 250nS. Das schafft keine SiebenSegment-LED. Man würde also nichts sehen, der Controller ist einfach zu schnell. Also müssen beide Schaltzustände per Programm gesteuert werden. Das Display sollte mit 100-250Hz refresht werden, schneller ist nicht notwendig und auch nicht sinnvoll Gruss Jadeclaw.
@Lars "Also bei einem alten 8051-Board, auf dem ich mal gearbeitet habe, war das automatisch so." Hää ? Wie soll das gehen ? Und vor allem was soll das bringen ? Bei einer Multiplexanzeige muß doch das LED-Muster bis zum nächsten Interrupt stehen bleiben, sonst siehst Du ja nichts. Wenn Du aber Memory Mapped IO meinst, das geht auch beim Mega8515/Mega162. Schau Dir mal die MCUCR / EMCUCR Register an. Peter
@Jadeclaw und Peter Danke für die Hinweise. Welche Einschaltzeit würdet ihre empfehlen? @Peter Mit Multiplex habe ich mich missverständlich ausgedrückt. Ich führe kein Zeitmultiplexing durch, sondern ich habe mehrere LED-Displays über einem Port angeschlossen und über weitere Leitungen wähle ich das Display aus. Mal schauen, wenn mein Projekt ausgereift ist, dann stelle ich es vielleicht ins Netz. Schöne Grüße Lars
Ich versteh dein Problem nicht ganz. Die Einschaltzeit ergibt sich doch ganz von alleine: Du hast einen Timer laufen. Jedes mal wenn deine Timer-Interrupt Routine aufgerufen wird, schaltest du das naechste Digit auf der 7-Segment-Anzeige mit den richtigen Werten ein (das vorhergehende wird dann natuerlich dunkel). D.h wahrend dein Program was anderes macht, brennt dieses eine Digit und zwar solange bis nach einer gewissen Zeit das naechste Digit aufflammt. Machst Du das schnell genug, sagen wir mal so, dass du 40 mal in der Sekunde einen kompletten Zyklus durch alle Anzeigen durch kriegst, dann merkt kein Mensch, dass da immer nur eine eingeschaltet ist. Je schneller desto besser, braucht dann natuerlich aber auch mehr Rechenzeit. Wie weit du runter gehen kannst (also weniger als 40 Zyklen), musst du ausprobieren Und ja, genau sowas nennt man Zeitmultiplex.
@Lars: Ich empfehle ungefähr 10msec / Stellenzahl. Das heisst, die Anzeige wird 100 mal pro Sekunde komplett abgearbeitet. Das ergibt dann eine nahezu flimmerfreie Anzeige. Mit den internen Zählern lässt sich das gut aus dem Prozessortakt generieren. Gruss Jadeclaw.
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.