www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multiplexbetrieb, Hilfe


Autor: Alexander Sewergin. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Da ich mich noch als Neuling in µCU nennen kann, wollte ich euch um
Hilfe bitten.

Also was ich bis jetzt kann, dass ist das korrekte aktivieren der Timer
und Counter für Interrupt Overflows, aktivieren von Ports etc. Also das,
wenn man das Datenblatt richtig gelesen hat ^^.

Jezt wollte ich mich mal an das Ansteuern von 7-Segment Anzeigen (gem.
Anode) herantasten, doch da weiß ich manchmal nicht, wie ich jetzt mein
Können richtig einsetzten kann.

Also ich hab z.B die Segment a-g an die Portpins 0-6 von PORTB am
ATmega8 gehängt und im Flash-Speicher leg ich die Zahlen als
Hexadezimal ab:
Segment:
 .db 0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
     =1   =2   =3   =4   =5   =6   =7   =8   =9

Jetzt lass ich per 16 bit timer1 und pescaller 8 den Overflow interrupt
alle 0.5 sek bei 1MHz auslösen und lassen das ZL register um  1 bit
jeweils bei einem interrupt erhöhen.

Die Programmadresse von Segment wurde in den ZL und ZH register
geladen:
ldi ZL, LOW(Segment*2)
ldi ZH, HIGH(Segment*2)

Was ist z.B hier nicht verstehe: WIESO *2 hinter dem Segment? (Habs so
im Tutorial gelesen.)

So hier klappt auch alles Richtig... naja nach der Zahl 9 kommt halt
nur mist, aber da hab ich noch nix gefunden um das zu verhindern.


Meine Frage jetzt... wie mache ich es um z.B 2 Anzeigen zu betreiben?
Nennt sich dann ja Multiplexing weil ich jeweils nur 1 Anode z.B durch
einen Transistor ansteuere. Ich glaub ich hab nach dem langen proggen
einfach keine ideen mehr. Könntet ihr mir Helfen? ( PS: Endziehl soll
ein Belichtungstimer mit 3x 7Segmentanzeigen werden.)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das '*2' bei der Adresse kommt daher, dass der Programmspeicher
Wortorganisiert ist, d.h. jede Adresse spricht 16 Bit an. Da der
lpm-Befehl, mit dem Du die Daten laden kannst, aber einzelne Bytes
anspricht, wird die eigentliche Adresse mit zwei Multipliziert. Je
nachdem, ob das LSB (also das Bit Nr. 0) 0 oder 1 ist, wird das erste
oder das zweite Byte in einem Wort angesprochen. Hier war letzte Woche
oder so ein Thread, in dem das ziemlich ausführlich breitgetreten
wurde. Ich such den mal raus...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hier isses:
http://www.mikrocontroller.net/forum/read-1-388467.html
Da ist das mit der indirekten Adressierung mit einer Lookup-Tabelle im
Flash ausführlich beschrieben.

Autor: Kri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht um 2 Anzeigen nicht um 2Byte ...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kri:
Ich glaub, Du hast die Frage (oder die Antwort) nicht ganz verstanden!
Es geht sehr wohl um zwei Bytes!

Autor: Kri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal mit einem 8-fach Schalter (74xxx oder kleines CPLD) und
einem anderen Pin als Adressleitung zum Auswählen.

(das mit *2 hab ich wohl überlesen - sorry)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kri:
Er braucht keine externen Elemente! Das ist Verschwendung...

Weiter gehts:
Das Multiplexen geht eigentlich recht einfach: Du hast Deine 7 Segmente
an 7 µC-Pins angeschlossen. Jetzt musst Du noch die gemeinsamen
Anschlüsse der Displays auf je einen Portpin legen. Wenn Du den
gemeinsamen Pin am µC als Ausgang schaltest und eine '1' ins
Portregister schreibst, kannst Du die Daten für das dazugehörige Digit
an den anderen 7 Pins ausgeben. Dann schaltest Du den gemeinsamen Pin
des ersten Digits auf Eingang um (im DDR..), damit er hochohmig
abgeschlossen ist und kein nennenswerter Strom mehr durch die LEDs
fließt. Bei Displays mit gemeinsamer Anode ist es u.U. sinnvoll, den
Pull-Up am Portpin auszuschalten, damit die Anzeige wirklich keinen
Saft mehr kriegt (also PORTX.n auf 0). Dann die Daten für das zweite
Digit ausgeben, den gemeinsamen Pin auf Ausgang und 1 im Portregister
stellen. Das ganze immer wieder hin und her, und zwar möglichst mit ein
paar hundert Hz, damits nicht flimmert...

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na und, er fragte ja nach dem "*2" ;)

@Alexander:
Beim Multiplexbetrieb musst du dein Programm einfach so anpassen, dass
nacheinander alle Anzeigen über die gemeinsame Anode aktiviert und mit
dem anzuzeigenden Zeichen belegt werden. Das Ganze dann so schnell,
dass ein kompletter Durchlauf max. etwa 20ms (entspricht 50Hz, mehr
wäre noch besser) dauert. Zuerst versorgst du also Digit 0 mit Strom
(Anode an die Versorgungsspannung, die anderen offen) und gibst für die
Segmente so wie oben dein Zeichen aus. Das lässt du dann ein Weilchen so
stehen und schaltest dann zur nächsten Anzeige, gibst wieder die
entsprechenden Segmente aus usw. Du hast also an den Anoden ein
"laufendes Bit", von Digit 0 bis Digit x.

Hoffe das war verständlich :)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, wenn Du sowieso schon Transistoren an den Anoden Deiner Displays
hast, brauchst Du natürlich den Pin nicht mit dem DDRX umzuschalten.
Dann kannst Du ihn als Ausgang lassen und brauchst nur im Portregister
umzuschalten.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@johnny.m:
Grmpf, warst schneller ;)
Erzähl ihm aber mal keinen Mist von wegen "Anode an den Portpin". Pro
Pin liegt der max. Strom bei etwa 20mA, im Falle einer 8 wird da aber
sicher einiges mehr fliessen (u.U. 8 * 10mA = 80mA = Port tot). Also
Treiber (Transistor) nicht vergessen!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Philipp:
Kommt drauf an, was er für Displays verwendet. Ansonsten haste völlig
recht (bis auf den max. Strom, der liegt bei den AVRs bei 40mA pro
Pin...)

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Waren's doch 40mA? Naja auch egal, jedenfalls würde ich in jedem Fall
einen Transistor verwenden. Achja, oben wären's natürlich 7 * 10mA,
den Punkt hat er ja eh net angeschlossen...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, er schreibt ja sowieso irgendwas von Transistoren.

Ich denke auch, dass 50Hz auf jeden Fall zu wenig sind. Habe das mal
ausprobiert und festgestellt, wenn wirklich kein Flimmern mehr sichtbar
sein soll, dann sollte man schon auf Frequenzen jenseits von 200Hz
gehen. OK, es gibt Leute, die beschweren sich bei 5kHz noch über das
Flackern. Die schicke ich aber dann meist direkt zum Augenarzt...

Autor: Alexander Sewergin. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke schonmal für die Infos... muss gleich in den Keller und dort
das zweite Display anschließen, dann gehts hier weiter.

Naja und zuvor Staubsaugen :D sonst macht Mutter stress ohne ende ^^

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.