Forum: Mikrocontroller und Digitale Elektronik Portzustand nicht halten


von Lars Mense (Gast)


Lesenswert?

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

von Jadeclaw (Gast)


Lesenswert?

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.

von Peter Dannegger (Gast)


Lesenswert?

@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

von Lars Mense (Gast)


Lesenswert?

@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

von Karl heinz B. (heinzi)


Lesenswert?

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.

von Jadeclaw (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.