Forum: Mikrocontroller und Digitale Elektronik Wie programmiere ich einen 4x4x4 LED-Cube mit dem PIC18F4550?


von Majd A. (majd)


Lesenswert?

Hey,

wie der Titel schon sagt würde ich gerne wissen wie ich einen 4x4x4 
LED-Cube programmieren nicht alles, sondern einfach nur wie ich die 
einzelnen Ebenen anpeilen kann und das mit dem Schieberegister, wie das 
physisch klappt verstehe ich da ich es anhand eines 
Schieberegisterkoffers in der Schule ausprobiert habe, aber ich verstehe 
halt nicht wie ich das programmieren soll bzw. wie ich die einzelnen 
Ebenen anpeilen kann oder bis zu 16. LED shiften soll. Wir verwenden die 
PIC18F4550 und die Programmiersprache C im Programm MPLAB IDE (Sind 
Pflichtvorgaben).
Ich möchte hier keine Lösung für mein Projekt sondern lediglich nur eine 
Hilfestellung wie ich die einzelnen Ebenen anpeilen kann und wie ich 
mich zur 16. LED ranshiften kann oder welche Methode es noch gibt.

Mit freundlichen Grüßen,

Majd

EDIT: Habe auch bereits im Internet recherchiert seit ca. 4 Stunden aber 
leider erfolglos habe etwas über Multiplexing gelesen aber ganz 
verstanden wie ich es anwende trotzdem nicht.

: Verschoben durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Kommt ein bisschen darauf an, wie der Cube aufgebaut ist.

Der Überbegriff dazu ist "Multiplexing".

Die Zeilen/Spalten in den Ebenen werden sehr schnell hintereinander 
angesteuert, wobei maximal 4 LEDs gleichzeitig an sind. Den Rest 
erledigt die Trägheit des Auges.

Hast du einen Schaltplan?

Jede der 4 Ebenen sollte aus einer 4x4 Matrix bestehen. Diese Matrix ist 
in Zeilen und Spalten aufgeteilt.

Ganz grober Ablauf:

- Erste Ebene aktivieren
 - Erste Zeile aktivieren
  - Alle benötigten LEDs in dieser Zeile aktivieren
 - Erste Zeile deaktivieren, zweite Zeile aktivieren
  - Alle Alle benötigten LEDs in der 2. Zeile aktivieren
... für die anderen beiden Zeilen wiederholen
- Erste Ebene deaktiveren
- Zweite Ebene aktivieren
- Dann wieder nacheinander die Zeilen durchgehen...


Und das ganze so schnell, dass es für das Auge so aussieht, als seien 
mehrere LEDs gleichzeitig an.

von Majd A. (majd)


Lesenswert?

Sebastian R. schrieb:
> Kommt ein bisschen darauf an, wie der Cube aufgebaut ist.
>
> Der Überbegriff dazu ist "Multiplexing".
>
> Die Zeilen/Spalten in den Ebenen werden sehr schnell hintereinander
> angesteuert, wobei maximal 4 LEDs gleichzeitig an sind. Den Rest
> erledigt die Trägheit des Auges.
>
> Hast du einen Schaltplan?
>
> Jede der 4 Ebenen sollte aus einer 4x4 Matrix bestehen. Diese Matrix ist
> in Zeilen und Spalten aufgeteilt.
>
> Ganz grober Ablauf:
>
> - Erste Ebene aktivieren
>  - Erste Zeile aktivieren
>   - Alle benötigten LEDs in dieser Zeile aktivieren
>  - Erste Zeile deaktivieren, zweite Zeile aktivieren
>   - Alle Alle benötigten LEDs in der 2. Zeile aktivieren
> ... für die anderen beiden Zeilen wiederholen
> - Erste Ebene deaktiveren
> - Zweite Ebene aktivieren
> - Dann wieder nacheinander die Zeilen durchgehen...
>
> Und das ganze so schnell, dass es für das Auge so aussieht, als seien
> mehrere LEDs gleichzeitig an.


Erstmal danke für deine schnelle Antwort. Genau das habe ich mir auch 
gedacht bzw. so weit bin ich bereits schon der Schaltplan ist noch 
gerade in Bearbeitung (Ist ein Schulprojekt einer macht die Hardware und 
der andere den Programmcode, also ich).

Nun aber das Problem im theoretischen Teil. Was genau muss ich denn nun 
im Programmcode eingeben das ich gezielt die erste Ebene aktiviere oder 
halt die zweite/dritte. Und was genau meinst du mit Zeile? Eine ganz 
normale Programmierzeile oder eine Reihe im Cube?

von Sebastian R. (sebastian_r569)


Lesenswert?

Majd A. schrieb:
> Nun aber das Problem im theoretischen Teil. Was genau muss ich denn nun
> im Programmcode eingeben das ich gezielt die erste Ebene aktiviere oder
> halt die zweite/dritte.

Das hängt vom Schaltplan ab. Und mit welchen Anweisungen man Register 
und damit auch Ausgänge, beschreibt, solltest du in der Schule gelernt 
haben, wenn es ein Projekt im Rahmen des Unterrichts ist.

Ansoooonste wäre eine einzelne LED vielleicht erst einmal sinnvoller als 
ein gemultiplexter Würfel gewesen ;)

Für den Anfang solltest du dich dann erstmal auf das Multiplexen einer 
Ebene konzentrieren. Da dann eine Schleife für die anderen 3 drumrum zu 
setzen, ist dann das geringste Übel.

Also als erste Übung vielleicht ein langsames Lauflicht über die LEDs 
einer Zeile, dann einer Ebene und dann über alle Ebenen hintereinander. 
Wenn man das dann so schnell wie möglich laufen lässt, sieht es so aus, 
als seien alle LEDs gleichzeitig an.


Majd A. schrieb:
> Und was genau meinst du mit Zeile? Eine ganz
> normale Programmierzeile oder eine Reihe im Cube?

"Programmzeile" ergibt in keiner der Fälle einen Sinn ;)

von Peter D. (peda)


Lesenswert?

4x4x4 = 64, kann man z.B. mit einem MAX7219 ansteuern.
Man legt sich dazu einen Bildspeicher von 8 Byte an und gibt diese per 
SPI an den MAX7219 aus.

von Sebastian R. (sebastian_r569)


Lesenswert?

Peter D. schrieb:
> 4x4x4 = 64, kann man z.B. mit einem MAX7219 ansteuern.
> Man legt sich dazu einen Bildspeicher von 8 Byte an und gibt diese per
> SPI an den MAX7219 aus.

Man kann auch einen Controller nehmen, der genug IOs hat. Das ist aber 
nicht Sinn der Sache.

von Majd A. (majd)


Lesenswert?

Sebastian R. schrieb:
> Das hängt vom Schaltplan ab. Und mit welchen Anweisungen man Register
> und damit auch Ausgänge, beschreibt, solltest du in der Schule gelernt
> haben, wenn es ein Projekt im Rahmen des Unterrichts ist.

Wie man ein Register und die Ports beschreibt weiß ich, diese wären 
TRISB um erstmal Eingänge/Ausgänge zu definieren. Allerdings ist das 
Problem halt folgendes, es ist mein Abschlussprojekt und als ich den 
Lehrer gefragt habe meinte er ich soll es selber herausfinden (Bin 
eigentlich sehr gut in dem Fach stehe auf 1), habe auch bereits eine 
Ampelplatine programmiert etc. Aber sowas mit Multiplexen etc. Das mit 
dem schnellen durchlaufen habe ich bereits gemacht, da ich ja nichts 
anderes zu tun hatte als hier auf Antworten zu warten Ebenfalls weiß ich 
wie normale Lauflichter funktionieren mit dem Shift-Befehl(>>/<<) und 
ganz normal über PORTBbits.RB1 = 1 oder halt PORTB = 0x01. Kannst du mir 
vielleicht das multiplexen erklären bzw. welchen Code ich nutzen sollte 
dafür?

von Stefan (Gast)


Lesenswert?

7 Segment Anzeige schon mal
Programmiert?

von Bru (Gast)


Lesenswert?

Es geht auch komplett ohne Matrix. Alle LEDs (WS2812) werden dazu in 
einer Daisy-Chain gehängt und seriell angesteuert.

von Sebastian R. (sebastian_r569)


Lesenswert?

Wenn du das mit dem schnellen Durchlaufen hinbekommen hast, dann hast du 
es ja im Prinzip schon.

Das dann halt so schnell wie möglich und dazu eine Möglichkeit, Daten 
reinzubekommen.

Den Ablauf habe ich dir ja schon genannt:

Sebastian R. schrieb:
> Ganz grober Ablauf:
>
> - Erste Ebene aktivieren
>  - Erste Zeile aktivieren
>   - Alle benötigten LEDs in dieser Zeile aktivieren
>  - Erste Zeile deaktivieren, zweite Zeile aktivieren
>   - Alle Alle benötigten LEDs in der 2. Zeile aktivieren
> ... für die anderen beiden Zeilen wiederholen
> - Erste Ebene deaktiveren
> - Zweite Ebene aktivieren
> - Dann wieder nacheinander die Zeilen durchgehen...

Du kannst halt nicht alle LEDs gleichzeitig ansteuern, weil das ganze 
eine dreidimensionale Matrix ist.

Du musst eben nacheinander alle kleinstmöglichen Segmente, die du 
gleichzeitig bedienen kannst, ansteuern.

Eine Ebene besteht aus vier Zeilen und vier Spalten, die jeweils auf 
einen Pin vom Controller oder einem Schieberegister gehen.

Die Zeilen und Spalten der Ebenen liegen alle parallel. Wenn du nur 
Zeile und Spalte aktivierst, aktivierst du die entsprechende LED auf 
jeder Ebene. Dementwsprechend gibt es noch eine dritte Dimension, die 
Ebene um jede LED einzeln ansteuern zu können.


Also um eine bestimmte LED anzusteuern musst du in Koordinaten denken. 
Den Pin der richten Zeile aktivieren, dann den Pin der passenden Spalte 
aktivieren und dann die richtige Ebene über einen Pin auswählen.

Beim Multiplexing werden im Prinzip nacheinander alle Koordinaten 
angesprungen und jedes mal wird geschaut, ob die LED an dieser 
Koordinate nun aktiviert oder deaktiviert sein muss.

Eventuell solltest du dir dazu dann noch einmal ein paar Seiten im 
Internet angucken. Ich kann das nicht alles detailliert erklären, was 
schon x mal erklärt wurde ;)

von Majd A. (majd)


Lesenswert?

Sebastian R. schrieb:
> Das hängt vom Schaltplan ab. Und mit welchen Anweisungen man Register
> und damit auch Ausgänge, beschreibt, solltest du in der Schule gelernt
> haben, wenn es ein Projekt im Rahmen des Unterrichts ist.

Wie man ein Register und die Ports beschreibt weiß ich, diese wären 
TRISB um erstmal Eingänge/Ausgänge zu definieren. Allerdings ist das 
Problem halt folgendes, es ist mein Abschlussprojekt und als ich den 
Lehrer gefragt habe meinte er ich soll es selber herausfinden (Bin 
eigentlich sehr gut in dem Fach stehe auf 1), habe auch bereits eine 
Ampelplatine programmiert etc. Aber sowas mit Multiplexen etc. Das mit 
dem schnellen durchlaufen habe ich bereits gemacht, da ich ja nichts 
anderes zu tun hatte als hier auf Antworten zu warten Ebenfalls weiß ich 
wie normale Lauflichter funktionieren mit dem Shift-Befehl(>>/<<) und 
ganz normal über PORTBbits.RB1 = 1 oder halt PORTB = 0x01. Kannst du mir 
vielleicht das multiplexen erklären bzw. welchen Code ich nutzen sollte 
dafür?

Kleine Änderung: Habe mir gerade eine Skizze gemacht und bin zum Schluss 
gekommen das ich RB0 als Clock nutze und RB1 als Data das heißt der 
Clock läuft durchgehend und der Data jenachdem wie ich die LEDS haben 
möchte und es muss 17 mal durchlaufen werden um eine neue Ebene zu 
aktivieren werde es jetzt erstmal ausprobieren danke für die Hilfe! 
Haben Sie vllt eine E-Mail Adresse das ich mich bei Ihnen melden kann, 
falls ich weitere Fragen habe?

Mit freundlichen Grüßen

von Sebastian R. (sebastian_r569)


Lesenswert?

Bru schrieb:
> Es geht auch komplett ohne Matrix. Alle LEDs (WS2812) werden dazu in
> einer Daisy-Chain gehängt und seriell angesteuert.

Noch irgendwelche schlauen Ideen, die an der vorhandenen Hardware 
vorbeigehen?


Die spannende Frage: Ist dein Cube wirklich gemultiplext (mehrere LEDs 
parallel) oder hast du für jede einzelne LED einen Ausgang von einem 
Schieberegister?

von Stefan F. (Gast)


Lesenswert?

Majd A. schrieb:
> Das mit
> dem schnellen durchlaufen habe ich bereits gemacht, da ich ja nichts
> anderes zu tun hatte als hier auf Antworten zu warten

????

Ist das die Methode, wie man heute recherchiert und lernt?

Majd A. schrieb:
> Kannst du mir
> vielleicht das multiplexen erklären bzw. welchen Code ich nutzen sollte
> dafür?

Das hängt wie gesagt vom Schaltplan ab. Und zwar sehr.

Eine allgemeine Anleitung findest du (wie fast immer) bei Wikipedia: 
https://de.wikipedia.org/wiki/Multiplexverfahren

Schau hier: 
http://microcontrollerslab.com/led-matrix-interfacing-pic-microcontroller/

Mach das erstmal mit 4x4 LED's und erweitere es dann um eine weitere 
Dimension.

von Bru (Gast)


Lesenswert?

Sebastian R. schrieb:
> Noch irgendwelche schlauen Ideen, die an der vorhandenen Hardware
> vorbeigehen?

Wer schreibt etwas von vorhandener Hardware?
Es wurde nur gesagt, dass die Hardware jemand anderes macht.
Es ist nicht abwegig der Hardware-Crew entsprechende Ideen weiter zu 
geben.

von Majd A. (majd)


Lesenswert?

Stefanus F. schrieb:
> ????
>
> Ist das die Methode, wie man heute recherchiert und lernt?

Wie genau meinst du das? Haben halt 2 Wochen lang je 8 Stunden und habe 
in den ersten 4 Stunden darüber recherchiert aber keine Antworten 
gefunden, daher dachte ich mir mach ich mal hier den Beitrag auf und 
warte auf Antworten und bevor ich rumsitze und nichts mache habe ich 
mich schonmal daran drangesetzt, verstehe jetzt nicht wirklich wo das 
Problem ist

von Majd A. (majd)


Lesenswert?

Stefanus F. schrieb:
> Das hängt wie gesagt vom Schaltplan ab. Und zwar sehr.
>
> Eine allgemeine Anleitung findest du (wie fast immer) bei Wikipedia:
> https://de.wikipedia.org/wiki/Multiplexverfahren
>
> Schau hier:
> http://microcontrollerslab.com/led-matrix-interfacing-pic-microcontroller/
>
> Mach das erstmal mit 4x4 LED's und erweitere es dann um eine weitere
> Dimension.

Mach ich dankeschön :)

von MaWin (Gast)


Lesenswert?

Peter D. schrieb:
> 4x4x4 = 64, kann man z.B. mit einem MAX7219 ansteuern.

6, setzen, Aufgabe nicht verstanden.

Majd A. schrieb:
> ein Schulprojekt einer macht die Hardware und der andere den
> Programmcode,

Dann solltest du mal den Schaltplan anfordern. An welchen Pin liegt 
DATA, CLOCK, LOAD des Schieberegisters und sind die mit 0 oder 1 aktiv. 
An welchen Pin liegt die Zeilenansteuerung ZEILE0, ZEILE1, ZEILE2, 
ZEILE3 (vermutlich nicht decodiert) und aucb hier ob die aktive Zeile 
durch 0 oder 1 ausgelöst wird.

Wenn die darzustellenden Daten in 4 16 bit Werten unsigned int bits[4] 
vorliegen, ist das rausschieben sehr einfach in einer zeitlicb 
wiederholten Funktion:
1
static unsigned char zeile=0;
2
void refresh(void)
3
{
4
  unsigned char n;
5
  unsigned int s;
6
  // ZEILE<zeile> ausschalten
7
  zeile=(zeile+1)&3;
8
  s=bits[zeile];
9
  for(n=0;n<16;n++)
10
  {
11
    DATA=s&1;
12
    CLOCK=1;
13
    s>>=1;
14
    CLOCK=0;
15
  }
16
  LOAD=1;
17
  LOAD=0;
18
  // ZEILE<zeile> einschalten
19
}
Das Riesen-Problem bei den cubes sind dann nur die Daten, die Bilder die 
animiert dargestellt werden. Nach ein paar Demos hat nämlich niemand 
mehr Bock noch hübsche Animationen zu programmieren. Daher verstauben 
die cubes dann im Schrank.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Majd A. schrieb:
> Bin
> eigentlich sehr gut in dem Fach stehe auf 1

... näh echt, bei der qualität von fragen die ich hier von dir lese bist 
du eher eine ungefährdete 6 minus, aber da bist du im forum in guter 
gesellschaft und wirst nie einsam.

selbstständiges denken wäre bei einer 1 eher zu erwarten, plus infos 
suchen und zusammenhänge herstellen! oder bin ich zu streng? näh, eher 
noch zu nett!


mt

von Volker S. (vloki)


Lesenswert?

Majd A. schrieb:
> das mit dem Schieberegister, wie das
> physisch klappt verstehe ich da ich es anhand eines
> Schieberegisterkoffers in der Schule ausprobiert habe

Was kann man sich denn unter so einem Teil vorstellen?

Insgesamt hat so ein 4x4x4 Würfel ja 64 LEDs. Wenn der 4550 diese direkt 
ansteuern soll und nicht so viele I/O Pins hat, dann wären Matrizen 
2x32, 4x16, 8x8, 4x4x4, 2x4x8,... möglich.

Majd A. schrieb:
> aber ich verstehe
> halt nicht wie ich das programmieren soll bzw. wie ich die einzelnen
> Ebenen anpeilen kann oder bis zu 16. LED shiften soll.

Das heißt, ihr habt an eine 4x16 gedacht?

Ihr wollt doch kein externes Schieberegister ansteuern, oder?

: Bearbeitet durch User
von abc.def (Gast)


Lesenswert?

Apollo M. schrieb:
> qualität von fragen die ich

Deine Groß,- Kleinschreibung läßt auch sehr zu wünschen übrig. 30Fehler 
im Diktat.
Wer im Glashaus sitzt, soll nicht mit Steinen werfen.
Es sind Schüler, die dürfen fragen.

von Sebastian R. (sebastian_r569)


Lesenswert?

abc.def schrieb:
> Deine Groß,- Kleinschreibung läßt auch sehr zu wünschen übrig. 30Fehler
> im Diktat.
> Wer im Glashaus sitzt, soll nicht mit Steinen werfen.
> Es sind Schüler, die dürfen fragen.

Die Sache mit dem Stein und dem Glashaus...


Egal. Wir brauchen wirklich einen Schaltplan. Ohne den wissen wir nicht, 
was wie am Schrieberegister hängt und ob und wie der Cube gemultiplext 
ist.

von Majd A. (Gast)


Lesenswert?

Sebastian R. schrieb:
> Egal. Wir brauchen wirklich einen Schaltplan. Ohne den wissen wir nicht,
> was wie am Schrieberegister hängt und ob und wie der Cube gemultiplext
> ist.

Werde dann morgen den fertigen Schaltplan reinschicken, habe jetzt einen 
aber der ist noch nicht perfekt bzw. morgen wird er dann fertiggestellt.

Apollo M. schrieb:
> ... näh echt, bei der qualität von fragen die ich hier von dir lese bist
> du eher eine ungefährdete 6 minus, aber da bist du im forum in guter
> gesellschaft und wirst nie einsam.

Komisch aber habe in der Arbeit eine 1 und in der Ampelplatine ebenfalls 
:) Ich fragte ja nicht nach den Lösungen sondern lediglich um einen 
Ansatz das ich weiß wie ich anfangen kann, da es das erste mal ist wo 
wir mit Schieberegistern und Transistoren arbeiten und nie davon im 
Unterricht geredet haben.

Volker S. schrieb:
> Was kann man sich denn unter so einem Teil vorstellen?
>
> Insgesamt hat so ein 4x4x4 Würfel ja 64 LEDs. Wenn der 4550 diese direkt
> ansteuern soll und nicht so viele I/O Pins hat, dann wären Matrizen
> 2x32, 4x16, 8x8, 4x4x4, 2x4x8,... möglich.

Genau haben es auch vor mit der 4x4x4 Matrix zu macehn und schwierig zu 
erklären aber haben in der Schule so Koffer wo bereits Schieberegister 
drin sind dort kann man es dann anschließen jenachdem wie man es braucht 
und dann halt schieben. Daher habe ich auch die Logik hinter der Sache 
verstanden aber hatte einen falschen Denkansatz.

MaWin schrieb:
> Dann solltest du mal den Schaltplan anfordern. An welchen Pin liegt
> DATA, CLOCK, LOAD des Schieberegisters und sind die mit 0 oder 1 aktiv.
> An welchen Pin liegt die Zeilenansteuerung ZEILE0, ZEILE1, ZEILE2,
> ZEILE3 (vermutlich nicht decodiert) und aucb hier ob die aktive Zeile
> durch 0 oder 1 ausgelöst wird.

Danke denke das wird mich um vieles weiterbringen werde dann nochmal 
heute Abend wenn ich zuhause bin drüber schauen.

von Volker S. (vloki)


Lesenswert?

Majd A. schrieb:
> Genau haben es auch vor mit der 4x4x4 Matrix

Würde ich nicht tun. Im Speicher vom PIC ist eigentlich eh alles 
eindimensional und ihr müsst euch die Funktionen überlegen, wie das 
ganze abgebildet wird.
Eine zweidimensionale Matrix lässt sich meiner Meinung nach einfacher 
ansteuern. Am wenigsten Pins/Ports für eine direkte Ansteuerung bräuchte 
(zweidimensional) natürlich eine 8x8 (16 Pins). Das wären dann sozusagen 
8 halbe Ebenen.
4x16 (20 Pins) hätte den Vorteil, dass die LEDs jeweils doppelt so lange 
an sein könnten, was einer größeren max. Helligkeit gleich kommt. 2x32 
wäre aus dieser Sicht noch geschickter, aber das wird wohl etwas eng mit 
den Pins ;-)

von Majd A. (Gast)


Lesenswert?

Volker S. schrieb:
> Majd A. schrieb:
> Genau haben es auch vor mit der 4x4x4 Matrix
>
> Würde ich nicht tun. Im Speicher vom PIC ist eigentlich eh alles
> eindimensional und ihr müsst euch die Funktionen überlegen, wie das
> ganze abgebildet wird.
> Eine zweidimensionale Matrix lässt sich meiner Meinung nach einfacher
> ansteuern. Am wenigsten Pins/Ports für eine direkte Ansteuerung bräuchte
> (zweidimensional) natürlich eine 8x8 (16 Pins). Das wären dann sozusagen
> 8 halbe Ebenen.
> 4x16 (20 Pins) hätte den Vorteil, dass die LEDs jeweils doppelt so lange
> an sein könnten, was einer größeren max. Helligkeit gleich kommt. 2x32
> wäre aus dieser Sicht noch geschickter, aber das wird wohl etwas eng mit
> den Pins ;-)

Dafür ist es aber leider zu spät da die Projekte schon angefangen haben 
ich bezweifle das ich da noch irgendwas ändern kann^^ sind halt ein Teil 
für die Zulassung der Prüfung

von Volker S. (vloki)


Lesenswert?

Majd A. schrieb:
> ich bezweifle das ich da noch irgendwas ändern kann^^

Na dann, falls noch Fragen offen sind, besser die Hardware anhand eines 
Schaltplans beschreiben. Sonst gibt es nur unpassende Vorschläge...

von Majd A. (Gast)


Lesenswert?

Volker S. schrieb:
> Majd A. schrieb:
> ich bezweifle das ich da noch irgendwas ändern kann^^
>
> Na dann, falls noch Fragen offen sind, besser die Hardware anhand eines
> Schaltplans beschreiben. Sonst gibt es nur unpassende Vorschläge...

Ja schicke den gleich rein und dann meinen bisherigen Ansatz wie ich es 
vorhabe zu machen bzw wie ich es bis jetzt gemacht habe

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.