PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Led Cube Ansteuern



kingmassivid
16.09.2007, 17:09
Hallo,

Ich hab mir gesetrn mal auß Spaß so einen kleinen 3x3x3 Led Würfel gebaut.
Der Würfel wir auf den 3 ebenen gemultiplext.
Ich bin ziehmlicher anfänger auf dem Gebiet der uC programmierung, hab nur am Pc in Basic was gemacht.
Ich würde den Würfel gerne über solche
Tabellen steuern in der Form:
&b000,&b000, &b000, &b000, &b000 ,&b000, &b000 ,&b000, 5000

Immer eine Zeile mit 3 leds wird angegebnen also ingesamt 27
und die 5000 ist die anzeigedauer in millisekunden. Die Anschlussbelegung wird aus dem Code ersichtlich. Mit dem Code gehen aber nur alle LED's an und es tut sich sonst nichts. Wie muss der Code aussehen damit das funktioniert?

Lukas



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Porta = Output
Config Portc = Output

Gnd1 Alias Portc.2
Gnd2 Alias Portc.1
Gnd3 Alias Portc.0

Ledvornlinks Alias Porta.0
Ledvornmitte Alias Porta.1
Ledvornrecht Alias Porta.2

Ledmittelinks Alias Porta.3
Ledmittemitte Alias Porta.4
Ledmitterecht Alias Porta.5

Ledhintenlinks Alias Portc.7
Ledhintenmitte Alias Portc.6
Ledhintenrecht Alias Portc.5
'ebene 0 ist an
'led 1 ist an
Porta = 0
Gnd1 = 1
Gnd2 = 1
Gnd3 = 1



Dim Temp As Word
Temp = 0

Do


' das ergebnis 1-16 ---> 0 - 15 (s.o.)
Temp = Temp * 9 ' wie gehabt
Porta = Lookup(temp , Daten) ; Lookup(temp -1 , Daten) ' die erste Spalte
Incr Temp

Incr Temp
Portc = Lookup(temp , Daten)
Incr Temp
Gnd1 = 0
Gnd2 = 1
Gnd3 = 1
Porta = Lookup(temp , Daten)
Incr Temp
Porta = Lookup(temp , Daten)
Incr Temp
Porta = Lookup(temp , Daten)
Incr Temp
Gnd1 = 1
Gnd2 = 0
Gnd3 = 1
Porta = Lookup(temp , Daten)
Incr Temp
Porta = Lookup(temp , Daten)
Incr Temp
Porta = Lookup(temp , Daten)
Incr Temp
Gnd1 = 1
Gnd2 = 1
Gnd3 = 0

Temp = Temp + 1


Loop



Daten:
Data &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , 1000
Data &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , 1000
Data &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , 1000
Data &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , 1000
Data &B000 , &B111 , &B000 , &B000 , &B111 , &B000 , &B000 , &B100 , &B000 , 1000

PicNick
16.09.2007, 18:53
Das mit den "1000" in jeder "data" Zeile is mir nicht klar, was das bewirken soll.
btw: für "1000" müßtest du 1000% schreiben, dann isses ein Word, braucht aber 2 byte, logo.

kingmassivid
16.09.2007, 18:57
also die 1000 soll die Anzeigedauer in millisekunden sein.
Ich hab keine Ahnung wie ich die notieren soll.
Jede DATA zeile soll ein Bild darstellen.

Lukas

stefan_Z
16.09.2007, 20:50
Schmeiß die anzeigedauer raus, die brauchste doch eh nicht - lass das Ding so schnell multiplexen, wie es kann, wen störts?
Die GNDs würd ich noch mit
FOR PortC = 1 TO 3
ansteuern, dann wechseln sie wirklich synchron.

Es kann auch sein, dass du noch zwischen die neuen Daten einmal alle LEDs ausmachen musst - also:
- PortC = 1
- Daten rein
- kurz warten (Konstante einbauen)
- PortC = 0
- neue Daten rein
- PortC 2
Ansonsten treten Geisterbilder auf!

kingmassivid
16.09.2007, 21:01
also gemultiplext wird so schnell es kann nur die Anzeigedauer soll für ein einzelnes Bild stehn.
Es sollen also Später für kleine Animationen sehr vile socher DATA reihen untereinander kommen.
Das mit den Geisterbildern krieg ich schon hin nur wie ich die Daten
aus der Tabelle korrekt ausgebn soll ist mir schleierhaft.

Lukas

stefan_Z
16.09.2007, 23:04
Es kann sein, dass du die Byte-Werte kompletto schreiben musst - also nicht "Data &B100" sondern "Data &B00000100" - ansonsten setzt er vielleicht die Bits auf der falschen Seite des Ports um.

Und schmeiß das 1000 am Ende der Datalines raus, das kannst du einfacher in ner Konstante speichern.
Und WENN du es in Data speichern willst, dann MUSST du ein "%" dahinter setzen!

Aus der Bascom-Hilfe (Seite 409):

Dta2:
Data 1000% , -1%
'Note that integer values (>255 or <0) must end with the %-sign
'also note that the data type must match the variable type that is
'used for the READ statement

Und daher KANN das so erstmal nicht klappen, denn:
A - ist dein Port in den du ausgibst nur 8 Bit breit und
B - Die "1000" in Data nicht richtig gekennzeichnet

Und lad mal ein Bild des Würfels hoch, würde mich mal interessieren!

kingmassivid
17.09.2007, 12:07
Ja also das programm war nur mal zum probieren. Ich hab ja eben keine Ahnung wie ich das ganze ausgeben soll.
6 led's sind an porta und 3Led's und 3x GND and portc.
Später soll ja eine SChleife laufen die die Daten aus der Tabelle als ein bild (frame einer animation) ausgibt
(also aus der tabelle immer 9 led's liest, ausgibt und die entsprechende Ebene einschaltet. Das ganze natürlich 3 mal) .
Dazu muss ja der zustand der 27 LED's irgendwie notiert werden und da bieten sich so dreiergruppen halt an weil man da auch übersichtlich bilder erstellen kann. Man könnte es natürlich auch irgendwie anders aufrufen.
Mein Problem ist das ich nicht weiß wie ich die daten aus der tabelle an den ports ausgeben soll. DAs mit der Dauer ist ja erstmal sekundär.

Lukas

Bild:
http://mchammer.kilu.de/cube1.jpg
vllt schleif ich die Led's noch matt.

PicNick
17.09.2007, 13:31
Also, um aus der Prog-memory Bytes hintereinander auszulesen, ist der Basic-Befehl "READ" gut genug.
Lookup bringt's dann, wenn der Index hin- und hersprint

Zu beginn der auslese-Sequenz:


RESTORE Daten 'Datenzeiger auf das erste Tabellenbyte


und dann nurmehr jedesmal


FOR counter= 1 to 27
READ temp-byte ' raufzählen tut er selber
next


Noch was:
Du mußt beim ausgeben von einem Byte immer erstmal das von vorher löschen, sonst leuchten irgendwann alle

kingmassivid
18.09.2007, 13:39
Hallo,
Ich bin inzwischen soweit:

$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Dim B As Integer , Count As Byte
Dim A1 As Byte
Dim A2 As Byte
Dim B3 As Byte
Dim B4 As Byte
Dim C5 As Byte
Dim C6 As Byte


Config Porta = Output
Config Portc = Output

Gnd1 Alias Portc.2
Gnd2 Alias Portc.1
Gnd3 Alias Portc.0

'ebene: 0 ist an
'led: 1 ist an
Porta = 0
Gnd1 = 1
Gnd2 = 1
Gnd3 = 1



Restore Daten 'Datenzeiger auf das erste Tabellenbyte



Do


Read A1
Read A2
Read B3
Read B4
Read C5
Read C6
Read B


For Count = 0 To B


Porta = &B00000000
Portc = &B00000111


Porta = A1

Portc = A2

Gnd1 = 0
Gnd2 = 1
Gnd3 = 1
Waitms 1
Porta = &B00000000
Portc = &B00000111

Porta = B3

Portc = B4

Gnd1 = 1
Gnd2 = 0
Gnd3 = 1
Waitms 1
Porta = &B00000000
Portc = &B00000111


Porta = C5

Portc = C6 ' die erste Spalte

Gnd1 = 1
Gnd2 = 1
Gnd3 = 0
Waitms 1

Next
Loop

Daten:
Data &B00101010 , &B00100111 , &B00101010 , &B00100111 , &B00101010 , &B00100111 , 1000%
Data &B00111111 , &B01010111 , &B00110011 , &B01000111 , &B00111111 , &B00000111 , 1000%
Nur wenn jetzt alle Zeilen zuende sind fangen die Led's wold zu blinken an!
Ich würde gerne am Schluss so eine Art Dummy-zeile hinzufügen:
Data &B0000000 , &B0000000 , &B00000000 , &B00000000 , &B00000000 , &B0000000 , 0%

Also wenn die zeit 0 ist soll das ganze aufhören oder wieder von vorne anfangen. Wenn ich aber schreibe: while B <> 0 passiert überhaupt nichts!
Wie soll ich das machen?

Lukas

PicNick
18.09.2007, 15:48
Schau mal, wie man es machen könnte: Ohne Gewähr, ich hab keine Cube zum testen

Vielleicht ist das eine Hilfe



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Dim Temp As Byte
Dim Wait_time As Word

Config Porta = Output
Config Portc = Output

Gnd1 Alias Portc.2
Gnd2 Alias Portc.1
Gnd3 Alias Portc.0

'ebene: 0 ist an
'led: 1 ist an

Porta = 0
Portc = 0
Gnd1 = 1
Gnd2 = 1
Gnd3 = 1


Do

Restore Daten 'Datenzeiger auf das erste Tabellenbyte

' ------------ ebene EINS -----------------
Gnd1 = 0
Gnd2 = 1
Gnd3 = 1
Gosub Eine_ebene


' ------------ ebene ZWEI -----------------
Gnd1 = 1
Gnd2 = 0
Gnd3 = 1
Gosub Eine_ebene


' ------------ ebene DREI -----------------
Gnd1 = 1
Gnd2 = 1
Gnd3 = 0
Gosub Eine_ebene

Loop ' und wieder

End

'================ subroutine für eine Ebene =================
Eine_ebene:
'-------- 1 reihe ---------
Read Temp
Porta = Temp ' bit 0, 1, 2
'-------- 2 reihe ---------
Read Temp
Shift Temp , Left , 3 ' 3 bits nach links
' bit 3, 4, 5
Porta = Porta Or Temp ' dazumischen
'-------- 3 reihe ---------
Read Temp
Shift Temp , Left , 5 ' 5 bits nach links
Portc = Portc Or Temp ' zu den GND's dazumischen

Read Wait_time ' wait-time
Waitms Wait_time ' warten nnn millisek
' Leds abdrehen
Porta = Porta And &B11000000 ' Bits 0,1,2,3,4,5
Portc = Portc And &B00011111 ' Bits 5,6,7
Return

' test daten: alle Leds leuchten
Daten:
' ------------- 1.ebene -------------------
Data &B00000111 ' Bit vorne
Data &B00000111 ' Bit mitte
Data &B00000111 ' Bit hinten
Data 1000% 'wait-time 1000 mS
' ------------- 2.ebene -------------------
Data &B00000111 ' Bit vorne
Data &B00000111 ' Bit mitte
Data &B00000111 ' Bit hinten
Data 1000% 'wait-time 1000 mS
' ------------- 3.ebene -------------------
Data &B00000111 ' Bit vorne
Data &B00000111 ' Bit mitte
Data &B00000111 ' Bit hinten
Data 1000% 'wait-time 1000 mS

whiterose83
23.09.2007, 13:36
Hi Leute

Also ich habe mir auch einen 3x3x3 LED Cube gebaut. Immer eine Ebene zusammen verbunten und immer eine Säule. Das ganze steuere ich über einen Atmel8. Das ganze geht auch super. Nur habe ich offt bei anderen gesehen das die Transistoren dazwischen hängen und nun ist meine Frage, wo der vorteil oder Nachteil liegt wen man die hat oder nicht? Ich selber betreib es ohne. Ich hoffe das mir von euch jemand weiter helfen kann bei dieser Frage!


MFG

stefan_Z
23.09.2007, 13:53
Also das Problem beim Multiplexen ist halt, dass der eine Port vom AVR dann immer LEDs einer Spalte parallel versorgen muss - also addieren sich die mA der einzelnen LEDs.
Bei drei LEDS pro Spalte is das noch verkraftbar, aber bei 8 oder mehr nicht mehr. Da muss dann also ein Transistor/Mosfet/Schieberegister als Treiber rein.
Grad bei großen Matrixen ist das sinnvoll, weil man da ja jede Spalte nur 1/n der Zeit an hat - n=Anzahl der Spalten.
Also ist es üblich, die LEDs nicht auf 20mA zu fahren, sondern z.B. auf 60mA oder sogar mehr. So wird der Helligkeitsverlust wieder ausgeglichen.

whiterose83
23.09.2007, 13:59
Hi

Danke für die schnelle Antwort! Aber wie ist das, werden die mA nicht nur dan addiert wen auch alle 3 LEDs pro Säule geschaltet werden? Wen ja nur 1 LED angesteuert wird bleibt der Strom doch gleich oder?

stefan_Z
23.09.2007, 14:08
jo klar.. da addiert sich nur das, was auch an ist...
Aber bei Elektronik geht man ja immer von der Maximalbelastung aus, oder?

whiterose83
23.09.2007, 14:12
Okey, bin eben noch recht neu in diesem Bereich. Ja das man immer von der Maximalbelastung ausgehen soll hat schon was, da man so dem durchbrennen von manchen sachen vorbeugen kann.
Ich arbeite einfach so mit diesem cube das ich wen ich eine Ebenen beleuchten will im Cube einfach alle LEDs kurz durchschalte einzeln so das es für das Auge nicht sichtbar ist!

Aber vielen dank für deine Antowort, so bin ich nun ein wneig schläuer!

stefan_Z
23.09.2007, 16:13
Ja, das nennt sich "Multiplexing" - darauf basieren ja auch normalerweise alle Matrix-Displays.