Forum: Compiler & IDEs Spi Multiplex


von Peter (Gast)


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:
1
uint8_t digits[2][4] PROGMEM = {
2
    {0x00, 0x00, 0x92, 0x00},
3
    {0x00, 0x11, 0x11, 0x10}
4
}
5
6
void load_chain(void)
7
{
8
  SR_On;
9
  SR_Off;
10
}
11
12
void spi_senden(uint8_t cData)
13
{
14
  while(!(SPSR & (1<<SPIF)));
15
  SPDR = cData;
16
  while(!(SPSR & (1<<SPIF)));
17
}
18
19
void spi_transmit(uint8_t buffer)
20
{
21
  uint8_t j, temp, digit;
22
  for(digit=0;digit<4;digit++)
23
  {
24
    for(j=0;j<8;j++)
25
    {
26
      if(j==0)
27
      {
28
        temp = pgm_read_byte(&digits[buffer][digit]) & 0x1;
29
      }else
30
      {
31
        temp = pgm_read_byte(&digits[buffer][digit]) & (j<<1);
32
      }
33
      if(digit == 0)
34
      {
35
        spi_senden(0x0);
36
        spi_senden(0x0);
37
        spi_senden(0x0);
38
        spi_senden(temp);
39
        load_chain();
40
      }
41
      if(digit == 1)
42
      {
43
        spi_senden(0x0);
44
        spi_senden(0x0);
45
        spi_senden(temp);
46
        spi_senden(0x0);
47
        load_chain();
48
      }
49
      if(digit == 2)
50
      {
51
        spi_senden(0x0);
52
        spi_senden(temp);
53
        spi_senden(0x0);
54
        spi_senden(0x0);
55
        load_chain();
56
      }
57
      if(digit == 3)
58
      {
59
        spi_senden(temp);
60
        spi_senden(0x0);
61
        spi_senden(0x0);
62
        spi_senden(0x0);
63
        load_chain();
64
      }
65
    }
66
  }
67
}
68
...
69
main()
70
...
71
spi_transmit(dbuffer);
72
...
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

von Matthias L. (Gast)


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

von Peter (Gast)


Angehängte Dateien:

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

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Code

von Falk B. (falk)


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

von Peter (Gast)


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

von Matthias L. (Gast)


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.

von Peter (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von Falk B. (falk)


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

von Falk B. (falk)


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

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Matthias L. (Gast)


Angehängte Dateien:

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)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Falk B. (falk)


Angehängte Dateien:

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

von Falk B. (falk)


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

von Peter (Gast)


Angehängte Dateien:

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.

von Matthias L. (Gast)


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!

von Peter D. (peda)


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

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.