mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Portzustand nicht halten


Autor: Lars Mense (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lars Mense (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.