Forum: Mikrocontroller und Digitale Elektronik LED-Matrix ansteuern (je nur eine LED)


von Michael N. (garril)


Lesenswert?

Hallo,

ich möchte eine 7x5 LED-Matrix mit einem ATmega8 ansteuern.

Wie ich das grundsätzlich zu verkabeln habe, ist mir klar.

Allerdings habe ich mir überlegt, dass ich gleichzeitig immer nur eine 
einzige LED leuchten lassen möchte.

Meine erste Überlegung war, dass ich einfach alle Spalten und Zeilen 
z.B. auf Low schalte und dann nur eine Zeile auf High.
Allerdings kann ich ja nicht gleichzeitig auch die nicht benötigten 
Spalten auch auf High setzen (und selbst wenn das gehen würde, dann 
wären die anderen LEDs ja falsch beschaltet)

Bräuchte noch einen kleinen Dankanstoß, wie ich das hinbekommen könnte 
(oder kann ich einfach irgendwie die nicht benötigten Pins am Atmega 
"deaktivieren")?!

Vielen Dank schonmal
mfg
Michael

: Verschoben durch Moderator
von Peter II (Gast)


Lesenswert?

Wenn dir die Schaltung grundsätzlich klar ist, versteh ich die Frage 
nicht.

du musst nur jeweile 1 Spalte und 1 Zeile ansteuern und schon leuchtet 
die LED an dem Schnittpunkt.

von Uwe (de0508)


Lesenswert?

Hallo Michael,

dazu reichen 7 Leitungen.
Damit kann man Anzahl der LED = n * (n-1) ansteuern.

Lies dazu bitte diese beiden PDF

PIC microprocessor drives 20-LED dot- or bar-graph display:

http://www.edn.com/contents/images/6363906.pdf

und

AVR Microcontroller drives logarithmic/linear dot/bar 20-LED display

http://www.edn.com/contents/images/6406730.pdf

dort sind die Ideen und auch die Programmierung zu finden..

von Michael N. (garril)


Lesenswert?

Also die beiden Ideen aus den PDFs sind echt super.
Die helfen mir auf jeden Fall weiter

Zum ersten PDF fällt mir aber folgendes ein: Ich dachte immer, dass die 
maximale Sperrspannung einer LED meist knapp unter der Flussspannung 
liegt?!
Naja gut, der Strom kann ja durch die andersherumgeschaltete LED (sobald 
aber eine kaputt geht, ist die andere auch kaputt, oder?)


Vielleicht sollte ich mein eigentliches Problem etwas konkretisieren:

Und zwar hab ich keine Ahnung, wie ich einen Ausgang am ATmega einach 
auf "nix" (also halt keine 5V und kein GND) schalte.

Habe erst eine Schaltung mit nem Mikrocontroller gebaut, deshalb weiß 
ich leider selbst für diese einfache Problematik keine Lösung (wird aber 
ja relativ einfach zu machen sein oder?).
Habe mein erste Programm mit C programmiert und würde gerne dabei 
bleiben (aber dort kann ich ja normal nur die Ausgangspins auf high oder 
low setzen)

Vielen Dank für die guten Links, mit dem neuen Wissen werde ich meinen 
Plan noch etwas anpassen und verbessern. Jetzt muss ich nurnoch wissen 
wie ich den Pin auf "nix" schalte :)

Noch einen schönen Abend

von Oliver (Gast)


Lesenswert?

Hallo Michael,

wenn Du den Pin mittels DDRx als Eingang schaltest, dann wird er 
hochohmig. Da ist genau das, was Du als "nix" bezeichnet hast.

von Markus B. (mbp-bayern)


Lesenswert?

Oliver schrieb:
> Hallo Michael,
>
> wenn Du den Pin mittels DDRx als Eingang schaltest, dann wird er
> hochohmig. Da ist genau das, was Du als "nix" bezeichnet hast.

Hallo zusammen;

Da gibts aber noch ne kleine Falle:
"Eingang" ist nicht automatisch "nix".

Die meisten AVR haben die Möglichkeit interne PULL-UP's Bitweise zu 
aktiviern.
Diese werden dann über PORTx & DDRx in Kombination gesteuert:

---------------------------------------
Port als Ausgang - kräftige Treiber:
---------------------------------------
DDRx = 1  --> Port = AUSGANG
PORTx = 0 --> alle Pins = Low


DDRx = 1     --> Port = AUSGANG
PORTx = 0xFF --> alle Pins = High

----------------------------------------------
Port als Eingang - schwacher Pull-Up möglich:
----------------------------------------------
DDRx = 0     --> Port = EINGANG
PORTx = 0xFF --> alle PULL-UP = EIN

--> FALLE !
Hier sind ca 10-50 KOhm von VCC zum Pin aktiv,
das kann von Logik-Eingängen als High erkannt werden;
die Led's könnten leicht glimmen.


DDRx = 0  --> Port = EINGANG
PORTx = 0 --> alle PULL-UP = AUS, Port ist wirklich Tristate.

--> das ist das nötige "nix"


MFG:MBP
Markus

PS:
Noch ne Falle, was die IO's angeht:

Lesen von PORTx und DDRx liefert immer,
was an der entsprechenden Speicherstelle IM CONTROLLER steht.
Nur "PINx" gibt das her, was von AUSSEN kommt.

Das verwechselt man gerade am Anfang gerne mal und dann wundert man 
sich, warum sich an den Eingängen scheinbar nichts ändert...

von Lehrmann M. (ubimbo)


Lesenswert?

Michael N. schrieb:
> Meine erste Überlegung war, dass ich einfach alle Spalten und Zeilen
> z.B. auf Low schalte und dann nur eine Zeile auf High.
> Allerdings kann ich ja nicht gleichzeitig auch die nicht benötigten
> Spalten auch auf High setzen (und selbst wenn das gehen würde, dann
> wären die anderen LEDs ja falsch beschaltet)

Ich gehe nicht davon aus, dass du das Prinzip hinter einer LED-Matrix 
verstanden hast. http://www.mikrocontroller.net/articles/LED-Matrix
Da ist alles beschrieben ...

mfG

von Thorsten S. (whitejack)


Lesenswert?

...den Eindruck habe ich auch.

Wenn du wirklich zu einem Zeitpunkt immer nur eine LED einschalten 
möchtest, wofür auch immer man das brauchen kann, dann kann man eine 
Matrix aus LEDs natürlich dafür benutzen und muss den Muktiplexgedanken 
dann nicht zwingend softwaremässig implementieren, aber meistens möchte 
man ja etwas darstellen.

T.

von Michael N. (garril)


Lesenswert?

Markus B. p. schrieb:
> DDRx = 0  --> Port = EINGANG
> PORTx = 0 --> alle PULL-UP = AUS, Port ist wirklich Tristate.
>
> --> das ist das nötige "nix"

Genau das ist der nötige Teil der gefehlt hat.
Ok dann schalte ich einfach alle Bit auf 0, damit erstmal alles Eingänge 
sind und dann halt in jedem Durchlauf einen pro Seite auf 1 und eine 
Seite halt High und die andere Low. Dann sollte das ganze funktionieren.


Vielen Dank für die Hilfe, ich denke den Rest bekomme ich hin.

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.