LED Cube 5x5x5

Unterbodenbeleuchtung, Pimp my room, usw.

Moderator: T.Hoffmann

Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Do, 27.05.10, 20:23

Tag... habs schon in nem anderen Thread versucht, aber keine Antwort bekommen... scheint irgendwie tot zu sein der Thread.

Ich hab mir einen 5x5x5 Würfel gebaut, Java Prog geschrieben zum entwerfen von Mustern mit graphischer Oberfläche und n Bascom Code auf den 5x5x5 "angepasst". Das Problem ist, das die merkwürdigsten Muster auf dem realen Cube dabei rauskommen.... im Simulator von BASCOM läuft es jedoch...

Hier der Code:

Code: Alles auswählen

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000



'-------------------------------------------------------------------------------------------------
' Ports auf Ausgang setzen
'-------------------------------------------------------------------------------------------------
Config Porta = Output
Config Portb = Output
Config Portc = Output
Ddrd = &B00111111

'-------------------------------------------------------------------------------------------------
' Variablen deklarieren
'-------------------------------------------------------------------------------------------------
Dim Bild As Word                                            ' Aktuelle Bildnummer
Dim Maxbild As Word                                         ' Nummer des letzten Bildes (=Zahl der Bilder in der Animation)
Dim Ebene As Byte                                           ' Ebenen-Zähler
Dim Dauer As Byte                                           ' Anzeigedauer des Bildes
Dim Temp As Byte                                            ' für Berechnungen
Dim Offset As Word                                          ' Position der zu holenden Daten

Dim A As String * 1
Dim B As String * 1
Dim C As String * 1
Dim D As String * 1

'-------------------------------------------------------------------------------------------------
' Hauptprogramm
'-------------------------------------------------------------------------------------------------
Do

Maxbild = Lookup(0 , Muster)                                ' Anzahl der gespeicherten Bilder holen

For Bild = 0 To Maxbild                                     ' Bilder durchzaehlen

  For Dauer = 0 To 27                                       ' Dauer des Bildes, pro Durchlauf ca. 15 ms

    For Ebene = 0 To 4                                      ' 5 Ebenen durchmultiplexen

      Offset = Bild * 20                                    ' Offset Berechnen, 6 Byte pro Bild
      Temp = Ebene * 4                                      ' 2 Byte pro Ebene
      Offset = Offset + Temp
      Offset = Offset + 2



      Porta = Lookup(offset , Muster)                       'PortA ausgeben
      Offset = Offset + 1                                   'in .txt eine Zeile weiter gehen
      Portb = Lookup(offset , Muster)                       'PortB ausgeben
      Offset = Offset + 1
      Portc = Lookup(offset , Muster)                       'PortC ausgeben
      Offset = Offset + 1
      Portd = Lookup(offset , Muster)                       'PortD ausgeben



      Waitms 500                                            ' diese Ebene fuer 5 ms anzeigen

    Next Ebene

  Next Dauer

Next Bild

Loop                                                        ' Programm von vorne beginnen

End
'-------------------------------------------------------------------------------------------------
Muster:
'-------------------------------------------------------------------------------------------------

$include "muster.txt"                                       ' Datei mit Mustern einbindenstern einbinden
und in der .txt steht folgendes:

Code: Alles auswählen

Data 1% ' 1 Bilder in der Animation

Data &B11111111, &B11111111, &B11111111, &B00000001
Data &B11111111, &B11111111, &B11111111, &B00000001	
Data &B11111111, &B11111111, &B11111111, &B00000001
Data &B11111111, &B11111111, &B11111111, &B00000001	
Data &B11111111, &B11111111, &B11111111, &B00000001
Er macht aber nur 21 Säulen an und 4 bleiben aus... naja und nach ca. 90 Sekunden fängt er an irgendwelche wilden Muster abzufahren....

Kann mir Bitte bitte einer helfen?
Danke schon mal

Achja ich hab das Atmel Evaluations-Board V2.0.1 Mit ATMega32 druff!
Gruß Punk
Zuletzt geändert von Punk3110 am So, 30.05.10, 20:53, insgesamt 1-mal geändert.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Do, 27.05.10, 21:45

Warum die 4 'Säulen' fehlen (nicht eingeschaltet werden), kann ich mit der wenigen Info auch nicht sagen... kann ja auch mit der Hardware zusammenhängen. Dass nach ca. 90 Sekunden 'Mist' rauskommt wundert mich aber eigentlich nicht:
Waitms 500 ' diese Ebene fuer 5 ms anzeigen
Nein, das sind 0.5 Sekunden.
For Dauer = 0 To 27 ' Dauer des Bildes, pro Durchlauf ca. 15 ms
For Ebene = 0 To 4 ' 5 Ebenen durchmultiplexen
28 x 5 x 0.5 Sekunden gibt Deine ca. 90 Sekunden. Danach wird versucht Bild 2 zu laden:
For Bild = 0 To Maxbild ' Bilder durchzaehlen
Maxbild=1 => Erstes Bild = Bild0, zweites Bild = Bild1 <- Existiert aber nicht.
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Fr, 28.05.10, 19:17

War der JTAG... :oops: Jetzt geht alles! :-)

Ähm ich überlege gerade ob es möglich ist, in BASCOM eine Schleife zu bauen alla:

Code: Alles auswählen

for 0 to lookup(2,Muster)
.
.
.
next
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Fr, 28.05.10, 19:41

Punk3110 hat geschrieben:
Ähm ich überlege gerade ob es möglich ist, in BASCOM eine Schleife zu bauen alla:
Ob es so direkt geht, weiß ich nicht, aber du kannst den Wert aus der Tabelle mit Lookup in eine Variable schreiben, also z.B.

Vari = Lookup (x,y)

und dann kannst schreiben:

For xxx = 0 to vari
...
next xxx
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Fr, 28.05.10, 19:42

Ach geht doch auch!^^ Wollte jetzt noch die Möglichkeit einbauen, angeben zu können wie lange die leds leuchten sollen!:-) Musste dafür aber ne neue txt einbinden! :idea:

Aber DANKE!!!:-)
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Fr, 28.05.10, 20:02

Punk3110 hat geschrieben:Ach geht doch auch!^^ Wollte jetzt noch die Möglichkeit einbauen, angeben zu können wie lange die leds leuchten sollen!:-) Musste dafür aber ne neue txt einbinden! :idea:

Aber DANKE!!!:-)
Hab ich auch gemacht... geht mit ner zweiten Tabelle, aber ich arbeite ohne die txt-datein, sondern programmiere direkt in die bytes mit 0 und 1 .. geht nach kurzer Einarbeitung bald genauso schnell, wie mit Editor.
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Fr, 28.05.10, 21:23

Naja ich steuer das Ding ja komplett mit nem Java Prog... da kann ich nur mit ner txt in bascom eingreifen!^^ Oder gleich alles als .bas abspeichern... das war mir aber zu viel des guten! :) So geht es auch wunderbar!
pantau
Ultra-User
Ultra-User
Beiträge: 979
Registriert: Do, 29.04.10, 21:58
Wohnort: Hannover

Fr, 28.05.10, 22:14

Die Cubes sind eine super Geschichte. Ich kann mich bei Youtube gar nicht satt sehen. Aber anfassen werde ich so etwas nie, dazu reichts bei mir einfach nicht.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 29.05.10, 07:07

Oh wir hatten mal ein sehr schönes Turtorial dazu, allerdings nur für 3x3x3, aber für den Anfang halt ideal.
Leider fehlen da mittlerweile ein paar Bilder.
Ich hab zu meinem Würfel auch mal ein Turtorial gemacht, da sind die Bilder noch da, ist aber 4x4x4:
viewtopic.php?p=103465#p103465

Und wie du auch im ersten Link lesen kannst, hatten wir viele Einsteiger dazwischen, die es am Ende doch zu einem leuchtenden Würfel geschafft haben. :wink:
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Sa, 29.05.10, 07:12

Also ich habe jetzt ca ne Woche gebraucht um den Cube zu Löten (Liefer schwierigkeiten mit den LEDs), java Programm und Bascom zu schreiben! wobei ich in der Woche mehr mit meinem Studium zu tun hatte!:-) Klar ging nich alles auf Anhieb... aber dann würde es ja auch keinen Spass machen! :lol:
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Sa, 29.05.10, 23:38

Sagt mal kann es angehen, das nach ca 50 lausigen bildern schon schluss is? Oder muss ich da noch in bascom was anpassen? die anzahl an bildern fährt er noch durch, aber nach ca. 50 bildern kommt nur noch völliger quatsch raus... also auf den ausgabe ports verschoben und verdreht...
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 30.05.10, 13:30

Das ist sehr schwer da ohne nähere Informationen sinnvoll weiter zu helfen. Kann an vielen Sachen liegen. Bascom code, Hardware (z.B. instabile Versorgung). Also mal ganzen Schaltplan und vollständiges Programm in ein Zip packen und hier posten. Ich kann zwar nicht versprechen, dass ich die nächsten Tage dazu komme mir das genau anzuschauen, aber so kann Dir wohl keiner helfen.
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

So, 30.05.10, 14:13

Hier n Bild wie es verkabelt is... sryy is nur n Schmierzettel!
Bild

Der Bascom-Code sieht so aus:

Code: Alles auswählen

$regfile = "m32def.dat"
$hwstack = 32
$swstack = 32
$framesize = 32
$crystal = 8000000

'-------------------------------------------------------------------------------------------------
' Ports auf Ausgang setzen
'-------------------------------------------------------------------------------------------------
Config Porta = Output
Config Portb = Output
Config Portc = Output
Ddrd = &B00111111

'-------------------------------------------------------------------------------------------------
' Variablen deklarieren
'-------------------------------------------------------------------------------------------------
Dim Bild As Integer                                         ' Aktuelle Bildnummer
Dim Maxbild As Integer                                      ' Nummer des letzten Bildes (=Zahl der Bilder in der Animation)
Dim Ebene As Byte                                           ' Ebenen-Zähler
Dim Dauer As Integer                                        ' Anzeigedauer des Bildes
Dim Temp As Byte                                            ' für Berechnungen
Dim Offset As Integer                                       ' Position der zu holenden Daten
Dim Laenge As Integer                                       ' Position der Zeit
 Dim Nextt As Integer
'-------------------------------------------------------------------------------------------------
' Hauptprogramm
'-------------------------------------------------------------------------------------------------
Do

Maxbild = Lookup(0 , Muster)                                ' Anzahl der gespeicherten Bilder holen
Maxbild = Maxbild - 1
Nextt = 0
For Bild = 0 To Maxbild                                     ' Bilder durchzaehlen
    Laenge = Lookup(nextt , Rtime)
  For Dauer = 0 To Laenge                                   ' Dauer des Bildes, pro Durchlauf ca. 15 ms

        For Ebene = 0 To 4                                  ' 5 Ebenen durchmultiplexen

            Offset = Bild * 20                              ' Offset Berechnen, 20 Byte pro Bild
            Temp = Ebene * 4                                ' 4 Byte pro Ebene
            Offset = Offset + Temp
            Offset = Offset + 2



            Porta = Lookup(offset , Muster)                 'PortA ausgeben
            Offset = Offset + 1                             'in .txt eine Anweisung weiter gehen
            Portb = Lookup(offset , Muster)                 'PortB ausgeben
            Offset = Offset + 1
            Portc = Lookup(offset , Muster)                 'PortC ausgeben
            Offset = Offset + 1
            Portd = Lookup(offset , Muster)                 'PortD ausgeben



           Waitms 5                                         ' diese Ebene fuer 5 ms anzeigen

         Next Ebene

      Next Dauer
          Nextt = Nextt + 1                              'in Zeit txt auf die Zeit des nächsten Bildes gehen

   Next Bild

Loop                                                        ' Programm von vorne beginnen

End
'-------------------------------------------------------------------------------------------------
Muster:
'-------------------------------------------------------------------------------------------------
$include "Muster.txt"                                       ' Datei mit Mustern einbindenstern einbinden

Rtime:
 $include "Time_Delay.txt"
Und hier n Video wegen Bilder und 1000 Worte und so!^^
Er sollte eigentlich jede einzelne LED von oben links nach unten rechts einmal an und wieder ausschalten... die ersten 2 Ebenen macht er auch gut durch... aber dann geht es in die Grütze...

http://yfrog.com/5ymvi0636z

Das passiert nach ca 50 Bildern... 50 x 20Byte = 1 kB (1kB = 1024 Byte ich weiss... :))... ich weiss nich ob es vielleicht damit zu tun hat... wäre schon n zufall wenn das bei so einer "schönen" Zahl passiert! :-) Vielleicht kann das ja mal jemand auf seinem 5x5x5 laufen lassen... geht ja nich drum ob das richtige Muster abläuft sondern das es 126 gleich aus sieht.

Danke schon mal für eure Hilfe!
txts.rar
Die txts
(547 Bytes) 360-mal heruntergeladen
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 31.05.10, 16:44

Kann jetzt auf den ersten Blick auch keinen Fehler finden. Schuss ins Blaue:
Probier mal Temp as Integer (anstatt Byte). Die Typisierung in Bascom ist manchmal etwas 'komisch'.
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Mo, 31.05.10, 21:40

Nee das war es auch nich.... hab das gefühl das er mit dem Stackpointer irgendwie "verrutscht" oder so... Wie gesagt die Anzahl der Bilder stimmt nur die Ausgänge werden vertauscht! Kann gut sein das ich da irgendwelche Einstellungen in BASCOM vergurkt habe! Hab ja keine Ahnung wie das da eingestellt sein muss. Hab mal den Bascom-Report angehängt... vielleicht hilft der ja jemanden
Dateianhänge
AVR-Report.rar
Report
(2.27 KiB) 325-mal heruntergeladen
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 31.05.10, 22:05

Da ja Speicher genug vorhanden ist, einfach alle Stack und Frame Sizes auf 64 hochsetzen. Also:

Code: Alles auswählen

$hwstack = 64
$swstack = 64
$framesize = 64
Schaden kann es nicht. Helfen wird es allerdings IMHO auch nicht. Es werden ja keine Unterprogramme gestartet.
Was Du auch noch mal versuchen könntest ist eine 'Umorganisation': Fang mit den Bildern an, die jetzt zu den seltsamen Verschiebungen führen (also mittlere Ebene). Wenn die dann sauber wiedergegeben werden und dafür die jetzt 'richtigen' verschoben, ist es wenigstens eindeutig ein Problem was unabhängig von den Bildern als solches besteht.
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Di, 01.06.10, 05:14

Das hilft leider auch nich... hatte auch schon alles auf 100 und das hat auch nix gebracht! An den Bildern liegt es auch nich. Egal welche Ebenen oder Bildkombinationen ich ausgeben lasse und in welcher Reihenfolge, ab 50 oder 55 Bildern so in dem dreh wirds Grütze vorher geht alles astrein...
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 01.06.10, 09:12

Trotzdem (versuchen) das weiter einzugrenzen:
ab 50 oder 55 Bildern
Genau feststellen ab wo!
Gibt es einen Unterschied je nach 'Laenge'?
Ggf. mal nur 3 Ebenen multiplexen=> Sind es dann mehr Bilder oder trotzdem nur 50?
Dito mal nur (z.B.) 16 'Säulen' verwenden...
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Di, 01.06.10, 13:42

kk das klappt aber erst am Wochenende denke ich mal! Jetzt fordert mich die Uni erstmal!^^ Aber danke!
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Sa, 05.06.10, 22:37

ok also egal wie ich es drehe und wende und egal wieviele Ebenen ich multiplexe, es sind genau 51 Bilder die er schafft. Bei 52. wird es Grütze! 51 Bilder * 20 Byte = 1020 ... also scheint das echt kein zufall zu sein.... aber welche 1024 Byte können das sein und warum?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 05.06.10, 23:08

An den Zufall glaube ich auch nicht. Ich hätte zunächst mal ein Typisierungsproblem in Kopf, weil 1024/4 ist 256 und ich vermute da irgendeinen Überlauf eines Bytes. Um das genauer raus zu kriegen, musst Du aber mal 'andere' (kleinere) Bilder verwenden, die weniger als 20 Byte haben und dann schauen ob es mehr als 51 werden...
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Sa, 05.06.10, 23:12

ok Mom mach ich mal ebend!^^
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

Sa, 05.06.10, 23:53

Ok wenn ich jetzt nur 2 Byte Muster ohne mutiplexing mache hat er keine Probleme!
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.06.10, 11:16

Was meinst Du mit 'ohne mutiplexing'? Ich würde vorschlagen, z.B. mal 'halben' Cube verwenden, also 4x4x4 (=2 Byte pro Ebene=16 LEDs). Ein 'Bild' wären dann 8 Bytes (4x2Bytes). Ein weiteres Byte für die Ebene ist nicht erforderlich, es wird einfach immer Ebene 1..4 angezeigt also bei Dir etwa so (Pseudocode)
do
Ebene = 1
Porta=Muster_byte0
Portb=Muster_byte1
Portd=ebene
Ebene=Ebene * 2
waitms 4
loop
Punk3110
User
User
Beiträge: 22
Registriert: Fr, 21.05.10, 17:21

So, 06.06.10, 12:17

Damit meinte ich , das ich einfach die Säulen an Port A hab an und ausgehen lassen. Ich hab irgendwie das Gefühl, dass das mit dem Offset zusammenhängt... ich guck mir beides heute mal an. Danke Dir!:)

Edit durch Sailor (bitte keine Monologe!):

HA! Also... sehr Merkwürdig... Wenn ich die Musterdatei in 2 Hälften aufteile, also in der Muster.txt nur 50 Bilder habe und die anderen Bilder in eine zweite Muster2.txt lege, dann gehts!^^ Aber das is ja nich Sinn und Zweck der Sache! Also Pro .txt Datei kann ich nur 51 Bilder verarbeiten. Wenn ich dann alles wieder auf 0 setze und mit einer 2. txt arbeite gehts... aber auch nur 51 Bilder lang!

Edit 2 durch Sailor:

ok es liegt definitiv am offset! In der Simulation macht er auch so ne faxen! Wenn der Offset größer als 1024 wird, dann schiebt er Port D auf Port A... hab auch schon Dim Offset As Word und As Long versucht... hilft aber auch nich!
Antworten