mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem LED-Matrix


Autor: Marcel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade an der Umsetzung einer 5x5 LED-Matrix. Dazu habe ich die 
Spalten per BC548 Transistor an 5V verbunden. Die Basen der 5 npn habe 
ich mit dem PORTD eines Atmega8 verbunden. Die Zeilen habe ich nun über 
je einen 82 Ohm Widerstand am PORTC des selbigen AVRs angeschlossen. Die 
LEDs (3,2V , 20mA) kann ich statisch alle samt ansteuern (einzeln), 
indem ich eben den jeweiligen Spaltentransistor durchschalte, und die 
Zeilen so maskiere, dass an den LEDs die leuchten sollen Masse liegt 
(logische 0). Sobald ich nun aber 2 LEDs abwechselnd leuchten lasse, 
also multiplexe, leuchten 2-3 LEDs ganz schwach mit. Ich habe die 
komplette Verschaltung noch mal überprüft und auch fremdkontrollieren 
lassen. Ich stehe nun vor dem Problem, dass ich warscheinlich eine 
tückische Sache übersehe. Auch hab ich die Leckströme der abgeschaltenen 
LEDs in betracht gezogen, aber kann das der Grund sein?

Vielen Dank vorab für eure Hilfe

Marcel P.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal ist dein Widerstand viel zu groß. In einer 5x5- Matrix leuchten 
von den 25 LEDs maximal 5 gleichzeitig, für 1/5 der Zeit. D.h. die LED 
muß mit dem fünffachen Strom geschaltet werden.
Dafür dürfte der Atmega-Port aber ein wenig zu schlapp sein. Also auch 
Masse über einen Treiber. ULN2003 z.B.

mfg.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann an der Reihenfolge deiner Aktionen liegen.
Bevor man ein neue Spalte einschaltet muss die
zuletzt eingeschaltete Spalte erst mal ausgeschaltet
werden. Dann erst die Zeilen ändern und die neue
Spalte einschalten.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Das kann an der Reihenfolge deiner Aktionen liegen.
>
> Bevor man ein neue Spalte einschaltet muss die
>
> zuletzt eingeschaltete Spalte erst mal ausgeschaltet
>
> werden. Dann erst die Zeilen ändern und die neue
>
> Spalte einschalten.

Genau! Hab ich noch vergessen.

mfg.

Autor: Marcel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, das dachte ich mir schon, nur sind die LEDs sowieso zu grell für 
die meine Bedürftnisse. Aber daran sollte es eigentlich ja auch nicht 
liegen, dass andere LEDs mitleuchten, oder doch?!

Autor: Marcel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch das mit der Reihenfolge habe ich bedacht. Ich setzte vor jeder 
Änderung der Zeilenmasken alle Spalten auf 0. Außerdem würden dann die 
falschen LEDs doch genauso hell leuchten oder nicht? Sind ja dann auch 
einen Taktzyklus lang an.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel P. schrieb:
> Auch das mit der Reihenfolge habe ich bedacht. Ich setzte vor jeder
>
> Änderung der Zeilenmasken alle Spalten auf 0. Außerdem würden dann die
>
> falschen LEDs doch genauso hell leuchten oder nicht? Sind ja dann auch
>
> einen Taktzyklus lang an.

Da muß noch eine kleine "Schutzzeit" rein. Wenn Du PortD auf 0 setzt, 
wird das Portregister auf 0 gesetzt und dann schaltet der Port. Das 
dauert eben auch ein wenig. Setz' da ein paar NOPs zwischen und mache 
das Umschalten nicht mit vollem Takt, sondern wesentlich langsamer, z.B 
1000x in der Sekunde.

mfg.

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

lies mal bitte den Artikel hier: 
http://www.mikrocontroller.net/articles/LED-Matrix

Autor: Marcel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

ich habe nun die Pausen eingefügt, dennoch zeigt die Matrix scheinbar 
zufällige Leuchtbilder. Dabei leuchtet bei folgender Einstellung eine 
LED am hellsten, 2 weitere leuchten schwach mit.
    PORTC = 0;
    PORTD = 1;
    _delay_loop_1(4);
    PORTD = 0;
    _delay_loop_1(4);
    
    PORTC = 0;
    PORTD = 2;
    _delay_loop_1(4);
    PORTD = 0;
    _delay_loop_1(4);
    
    PORTC = 0;
    PORTD = 4;
    _delay_loop_1(4);
    PORTD = 0;
    _delay_loop_1(4);
    
    PORTC = 0b00000001;
    PORTD = 8;
    _delay_loop_1(4);
    PORTD = 0;
    _delay_loop_1(4);
    
    PORTC = 0;
    PORTD = 16;
    _delay_loop_1(4);
    PORTD = 0;
    _delay_loop_1(4);

Im Vergleich zu vorher habe ich nun lediglich in die Masseleitungen je 
einen BC548 eingefügt und zur "erhöhten" Lichtausbeute einen 
zusätzlichen Widerstand parallel zum alten mit ebenfalls 82 Ohm gelötet.
Ist in diesem Abschnitt das Problem mit den Pausen soweit richtig 
umgesetzt?

Vielen Dank soweit für die bisherige Hilfe =)

Marcel P.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll der Quatsch mit den Delayloops.
Nimm _delay_ms(1), damit man auch weiß, wie groß die Delays sind.
Ich vermute mal Deine Delays sind viel zu kurz, 1kHz reicht dicke.

Beim Emitterfolger brauchst Du auch keine zusätzlichen Delays, der ist 
schnell genug.
  PORTD = 0;          // aus
  PORTC = BITMUSTER0; // neues Bitmuster
  PORTD = 1<<0;       // an
  _delay_ms( 1 );     // 1kHz

  PORTD = 0;          // aus
  PORTC = BITMUSTER1; // neues Bitmuster
  PORTD = 1<<1;       // an
  _delay_ms( 1 );     // 1kHz

  PORTD = 0;          // aus
  PORTC = BITMUSTER2; // neues Bitmuster
  PORTD = 1<<2;       // an
  _delay_ms( 1 );     // 1kHz

  // usw.


Peter

Autor: Thorsten S. (whitejack)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTC = 0;
    PORTD = 1;              //Spalte 1 an
    _delay_loop_1(40);
    PORTC = 0;
    PORTD = 0;
    _delay_loop_1(4);

    PORTC = 0;
    PORTD = 2;              //Spalte 2 an
    _delay_loop_1(40);
    PORTC = 0;
    PORTD = 0;
    _delay_loop_1(4);

    PORTC = 0;
    PORTD = 4;              //Spalte 3 an
    _delay_loop_1(40);
    PORTC = 0;
    PORTD = 0;
    _delay_loop_1(4);

    PORTC = 0b00000001;
    PORTD = 8;              //Spalte 4 an
    _delay_loop_1(40);
    PORTC = 0;
    PORTD = 0;
    _delay_loop_1(4);

    PORTC = 0;
    PORTD = 16;             //Spalte 5 an
    _delay_loop_1(40);
    PORTC = 0;
    PORTD = 0;
    _delay_loop_1(4);

Autor: Thorsten S. (whitejack)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...das Beispiel von Peter ist doch besser...

und am besten in eine Funktion verpacken die immer eine Spalte nach der 
anderen macht, also bei jedem Aufruf die nächste SPalte bearbeitet...


Ausführlich wäre das dann so ähnlich:

//Variablen für die 5 Zeile global für den ersten Versuch

void Matrix_Update (void)
{
  static uint8_t zaehler=0;
  switch (zaehler)
  {
    case 0:
    {
      PORTD = 0;          // aus
      PORTC = BITMUSTER0; // neues Bitmuster
      PORTD = 1<<0;       // an
      break;
    }
    case 1:
    {
      PORTD = 0;          // aus
      PORTC = BITMUSTER1; // neues Bitmuster
      PORTD = 1<<1;       // an
      break;
    }
   ...
  }
  zaehler++;
  if (zaehler>4)
  {
    zaehler=0;
  }
}

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.