www.mikrocontroller.net

Forum: Compiler & IDEs Spi Multiplex


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend,
ich muesste ueber Spi an dem 4 Schieberegister haengen, 25 Led's 
multiplexen. Es geht nur ueber Spi, Controller ist ein ATmega32.
Ich hatte mir das so ueberlegt:
uint8_t digits[2][4] PROGMEM = {
    {0x00, 0x00, 0x92, 0x00},
    {0x00, 0x11, 0x11, 0x10}
}

void load_chain(void)
{
  SR_On;
  SR_Off;
}

void spi_senden(uint8_t cData)
{
  while(!(SPSR & (1<<SPIF)));
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)));
}

void spi_transmit(uint8_t buffer)
{
  uint8_t j, temp, digit;
  for(digit=0;digit<4;digit++)
  {
    for(j=0;j<8;j++)
    {
      if(j==0)
      {
        temp = pgm_read_byte(&digits[buffer][digit]) & 0x1;
      }else
      {
        temp = pgm_read_byte(&digits[buffer][digit]) & (j<<1);
      }
      if(digit == 0)
      {
        spi_senden(0x0);
        spi_senden(0x0);
        spi_senden(0x0);
        spi_senden(temp);
        load_chain();
      }
      if(digit == 1)
      {
        spi_senden(0x0);
        spi_senden(0x0);
        spi_senden(temp);
        spi_senden(0x0);
        load_chain();
      }
      if(digit == 2)
      {
        spi_senden(0x0);
        spi_senden(temp);
        spi_senden(0x0);
        spi_senden(0x0);
        load_chain();
      }
      if(digit == 3)
      {
        spi_senden(temp);
        spi_senden(0x0);
        spi_senden(0x0);
        spi_senden(0x0);
        load_chain();
      }
    }
  }
}
...
main()
...
spi_transmit(dbuffer);
...
Das Problem ist nur, dass das so nicht funktioniert, und ich hab auch 
keine Ahnung warum. Hab allerdings auch noch nicht soviel Ahnung von der 
ganzen Materie. Spi an sich funktioniert einwandfrei, wenn ich 
allerdings obigen Code verwende, gehen erstmal 1-2 Led's an und dann 
startet der Controller neu.
Wie koennte man das anders loesen, bin fuer jede Hilfe dankbar.
Gruß
Peter

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich muesste ueber Spi an dem 4 Schieberegister haengen, 25 Led's

Für 25LEDs reichen auch zwei Schieberegister.(eigentlich sogar 10Pins)


Dein COde ist unvollständig und der Schaltplan fehlt auch

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich hab da mal schnell was zusammen gebastel, das jetzt nicht perfekt, 
aber versinnlicht wahrscheinlich das was ich meine, gab es so aehnlich 
hier schon mal.
Wie soll denn das mit 2 Schieberegistern gehen?
Zum Code folgt gleich?
Gruß Peter

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Code

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mich raten, RGB LEDs mit gemeinsamer Anode? ;-)
Ja wo liegt jetzt das Problem?
Bitmuster reinschieben, entprechende Spalte aktivieren, nächster 
Durchlauf.

Siehe LED-Martix.

Ach ja, Multiplexen macht man IM Timerinterrupt. Und bevor du das nicht 
wirklich verstanden UND umgesetz hast, solltest du die Idee mit 
zusätzlicher PWM mal ganz fix vergessen. Mach erstmal das reine Muxen 
OHNE PWM.

MFG
Falk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht ganz gemeinsamer Kathode haben die RGB-Led`s.
Ja das mit dem Timer war mir eigentlich auch schon klar, das war im Code 
falsch umgesetzt.
Naja mein Problem jetzt ist eigentlich, es sind immer alle R, alle G und 
alle B verbunden, das kann ich auch nicht aendern, das hab ich so 
bekommen. Wenn ich jetzt als Beispiel 0x7C in die Schieberegister 
schiebe und R,G oder B setze, gehen 5 Led's an, sind aber nicht 
multiplext.
Das ist jetzt mein Anliegen rauszubekommen, wie das geht?
Gruß Peter

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Schaltung ist sinnlos kompliziert und geht trotzdem nicht.

Die unteren Schieberegister sind ja alle parallel geschaltet mit MOSI, 
SCK und RCK. Das bedeutet, alle werden immer denselben Inhalt haben.

Unsinn.

Machs dir nicht kompliziert und nimm zwei Schieberegister.
Siehe LED Matrix


PS: Vorwiderstände fehlen (zumindest im Schaltplan)

Der COde ist auch zu kompliziert.
Wie Falk sagte:
Nen Timerinterrupt, der immer nur eine Spalte ausgibt.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer den Hinweis, aber trotzdem geht das doch bei mir nicht, 
dadurch das hier alle R-Anoden, alle G-Anoden und alle B-Anoden 
verbunden sind, so funktioniert das Prinzip der Led-Matrix ja nicht.
Gruß Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias Lipinsky wrote:

> Machs dir nicht kompliziert und nimm zwei Schieberegister.
> Siehe LED Matrix

LED Matrix

(Diese Seite enthält momentan noch keinen Text)

Ach so, ein Leerzeichen statt eines Bindestrichs...

Nichts gegen Schieberegister am SPI (habe ich bei meiner Nixieuhr
auch gemacht), aber dafür, dass an den Schieberegistern gerade mal
4 Ausgänge benutzt sind und man für die Ansteuerung über SPI auch
bereits drei Pins braucht, hätte sich nicht das vierte Pin gleich
noch am Controller finden lassen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter (Gast)

>Nicht ganz gemeinsamer Kathode haben die RGB-Led`s.

Dann ist dein Schaltung aber sinnlos. Denn dort ist für die gemuxten 
Zeilen ein High Side Driver drin.

>Ja das mit dem Timer war mir eigentlich auch schon klar, das war im Code
>falsch umgesetzt.

Na dann setz mal richtig um.

>Naja mein Problem jetzt ist eigentlich, es sind immer alle R, alle G und
>alle B verbunden, das kann ich auch nicht aendern,

Wozu auch, so arbeitet eine LED-Matrix. Und das ist auch gar kein 
Problem.

> das hab ich so bekommen. Wenn ich jetzt als Beispiel 0x7C in die 
>Schieberegister schiebe und R,G oder B setze, gehen 5 Led's an, sind aber >nicht 
multiplext.

Das ist EIN Schritt im Multiplexen.

>Das ist jetzt mein Anliegen rauszubekommen, wie das geht?

Ist das sooooo schwer? Artikel gelesen?

Datenmuster für Zeile 1 (=Rot) ins Schieberegister eintakten
Zeile 1 aktivieren, Zeilen 2 und 3 deaktivieren
5ms warten (per Timer)
Datenmuster für Zeile 2 (=Grün) ins Schieberegister eintakten
Zeile 2 aktivieren, Zeilen 1 und 3 deaktivieren
5ms warten (per Timer)
Datenmuster für Zeile 3 (=Blau) ins Schieberegister eintakten
Zeile 3 aktivieren, Zeilen 1 und 2 deaktivieren
5ms warten (per Timer)
Sequenz beginnt von vorn

MFg
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite

>auch gemacht), aber dafür, dass an den Schieberegistern gerade mal
>4 Ausgänge benutzt sind und man für die Ansteuerung über SPI auch

Das soll glaub ich eine Prinzipskizze sein, kein echter Schaltplan. 
Allerding s ist auch die Skizze vollkommen falsch ;-)

MFG
Falk

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
^^hm kay, anders, ich mein das so, wuerde das funktionieren, wie dann 
mit 2 Schieberegistern?
Gruß Peter

Autor: Matthias Lipinsky (lippy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>wie dann mit 2 Schieberegistern?

Als ich sagte, 2 Register, wusste ich nicht, dass es RBG LEDs sind!
Somit brauchst du doch 4Register

Du musst das so tun: siehe Anhang.

(mit der PWM kannst du die komplette Matrix dimmen)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter (Gast)

>Dateianhang: ablage.png (45,4 KB, 6 Downloads)

Das ist keine echte Matrix. Denn in der wären Zeilen und Spalen jeweils 
verbunden, du hast aber fast alles einzeln angeklemmt, und besch***en 
gezeichnet obendrein.

>^^hm kay, anders, ich mein das so, wuerde das funktionieren, wie dann
>mit 2 Schieberegistern?

Nicht wirklich. Für 5x5 RGB LEDs mit gemeinsamer Kathode, siehe Anhang.

MFG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, kleine Korrektur. Es doch eine LED-matrix, wenn gleich eine 
unbrauchbare. Das ist ein 3Bit 25:1 Mux, das machen die wenigsten LEDs 
lange mit. Und unnötig aufwändig obendrein.

MFG
Falk

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das ihr euch solch eine Arbeit macht, aber das Ding ist, dass das 
so, siehe Anhang, neben mir steht, fertig geloetet, und ich die 
Ansteuerung realisieren soll und das dachte ich mir, mach ich wie ein 
bisschen weiter oben gesagt.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>neben mir steht, fertig geloetet,

Man ist das irgendein neuer Volkssport?

Irgendwas sinnlos zusammenbauen und dann auf Krampf versuchen, da ne 
sinnvolle Funktion zu erhalten??

Reiß es ausnander!
Oder lass es von dem in Ordnung bringen, der wollte, dass das so 
verdrahtet wird!



Merke:

Erst Denken, dann Bauen!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> Danke, das ihr euch solch eine Arbeit macht, aber das Ding ist, dass das
> so, siehe Anhang, neben mir steht, fertig geloetet

O.k. dann ist das wohl ein Fall für die Mülltonne.

Da fehlen nämlich die Vorwiderstände und die müssen je nach Farbe 
unterschiedlich sein.
Also das ganze nochmal, aber mit 75 Widerständen drin.

Und die alten Darlingtontreiber haben bei 3,6V (blaue LED) zuviel 
Spannungsabfall, dürften also nicht mehr funktionieren an 5V.

Daher sollte man etwas moderner sein und FETs nehmen.
Für die Katoden gibts sogar Schieberegister mit FETs fertig, z.B. 
TPIC6B595.


Ein Multiplex 1/25 dürfte kaum genügend Helligkeit bringen, daher 1/3 
nehmen.
Also die 3 Farben multiplexen und dazu die 25 Bits je Farbe 
reinschieben.


Peter

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.