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.
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
Code:$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
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
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!
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
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):
Und daher KANN das so erstmal nicht klappen, denn: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
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!
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:
Bild hier
vllt schleif ich die Led's noch matt.
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:
und dann nurmehr jedesmalCode:RESTORE Daten 'Datenzeiger auf das erste Tabellenbyte
Noch was:Code:FOR counter= 1 to 27 READ temp-byte ' raufzählen tut er selber next
Du mußt beim ausgeben von einem Byte immer erstmal das von vorher löschen, sonst leuchten irgendwann alle
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo,
Ich bin inzwischen soweit:
Nur wenn jetzt alle Zeilen zuende sind fangen die Led's wold zu blinken an!Code:$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%
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
Schau mal, wie man es machen könnte: Ohne Gewähr, ich hab keine Cube zum testen
Vielleicht ist das eine Hilfe
Code:$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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen