Forum: Mikrocontroller und Digitale Elektronik Multiplexbetrieb, Hilfe


von Alexander Sewergin. (Gast)


Angehängte Dateien:

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.)

von johnny.m (Gast)


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...

von johnny.m (Gast)


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.

von Kri (Gast)


Lesenswert?

es geht um 2 Anzeigen nicht um 2Byte ...

von johnny.m (Gast)


Lesenswert?

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

von Kri (Gast)


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)

von johnny.m (Gast)


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...

von Philipp B. (philipp_burch)


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 :)

von johnny.m (Gast)


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.

von Philipp B. (philipp_burch)


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!

von johnny.m (Gast)


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...)

von Philipp B. (philipp_burch)


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...

von johnny.m (Gast)


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...

von Alexander Sewergin. (Gast)


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 ^^

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.