das reimt sich sogar!
angeregt durch Gefachsimpel in http://diesem Thread dachte ich mir, jetzt muss ich endlich auch mal so nen "Cube" bauen - da das aber ne Sache für einen Abend werden sollte, habe ich mal nur 3x3x3 gemacht... das Dings ist nur 4,5 cm Kantenlänge klein, soll aber ja auch eher was für den Schreibtisch werden o.ä.
Hier schon mal ein Video zum Appetit anregen:
Also angefangen, erst mal Löcher in ein Brett, damit das halbwegs sauber wird, darin die Ebenen zusammengelötet:
Diese dann zu dem Cube verbunden:
Cube auf Platine mit Kleinkram, angeschlossen an mein Tiny2313-Board:
Das ist vielleicht ein krummes Ding! - aber egal, soll ja nur als Ausgabehardware dienen, damit ich sehe, was die Software so macht. Im Prinzip gefällt mir das mit den klaren LEDs (hatte gerade keine anderen) auch besser, Nachteil: die unteren LEDs strahlen in die oberen rein, deswegen sieht das teilweise so aus, als würden die mitleuchten, obwohl sie eigentlich aus sind. Das ist in echt aber nicht so arg wie auf dem Video... trotzdem werde ich versuchen die LEDs unten noch schwarz zu lackieren, ausserdem kommt evtl. noch Frostspray über das Ganze...
Schaltplan für das Teil (Anoden an den Säulen, Kathoden an den Ebenen):
EDIT: Achtung! - der Schaltplan ist veraltet! - den neuen gibt es hier.
Die LEDs laufen rechnerisch mit diesen Vorwiderständen (390 Ohm) auf 5 mA, ausserdem im Taktverhältnis 1:2 (durch das Multiplexen), dafür sind sie schon ganz schön hell!
Zur Software (die ist unten verlinkt, ich habe .asm durch .txt ersetzt, weil die Forensoftware kein .asm nimmt):
EDIT: Software rausgenommen, da nicht mit der neuen Hardware kompatibel - hier gibt es eine passende Version in Bascom
Wie ein dem anderen Thread schon angesprochen, habe ich mir das ganz einfach gemacht, also nix mit Schieberegistern, direkt an den AVR.
Die "Bilder" sind im Flash abgelegt, immer 6 Byte für einen kompletten Cube - die Ebenen (je 2 Byte) werden in einer ISR durchgescannt...
hier war folgende Situation: ich brauche 9 Bit für die Säulen, also eh' schon 2 Byte pro Ebene im "Bildspeicher" - also habe ich gleich noch die nächsten 3 Bit für die Ebenen genommen, ich muss in der ISR also keine Bits rumschieben o.ä., nur die 2 Bytes an 2 Ports ausgeben, fertig!
Hier mal ein Beispiel:
.db 0b00001001, 0b11101111 ; Outline
.db 0b00000101, 0b01000101
.db 0b00000011, 0b11101111
EDIT: Diese Bitbelegung wurde geändert, Ebenen sind nun Port D 4-6!
... die grünen Bits sind für die 9 Säulen, die roten Bits bestimmen, welche Ebene grad dran ist. Da sind noch 4 Bit frei, man könnte also zu jedem Bild noch ne Dauer, Helligkeit o.ä. speichern...
da fällt mir grad ein: auch so eine Art "Overscan-Modus" wäre da möglich - z.B.:
.db 0b00001001, 0b11111111
.db 0b00001101, 0b11111111
.db 0b00001111, 0b11111111
würde bedeuten: die oberste Ebene ist beim kompletten Multiplex-Durchlauf an, die zweite nur bei 2/3 und die unterste nur bei 1/3 - sollte also nen Würfel geben, der von unten nach oben heller wird... mag jetzt aber nicht das Video nochmal machen.... kommt später, falls das funktioniert...
Das zamlöten und die Steuersoftware waren gestern nacht schon fertig, ich musste mir dann natürlich noch Bilder überlegen und in Bits übersetzen - das hat doppelt solange gedauert wie der Teil davor, aber das ist ja auch das, was Spaß macht -
btw.: da wäre es natürlich super, wenn man eine SW am PC hätte, in der man Animationen am Bildschirm entwerfen kann, und die SW macht dann die Bitmuster draus - gleich in einer .inc-Datei... aber PC programmieren kann ich nicht..
Mir würden noch 1.000 weitere Muster einfallen, leider ist erst mal der Speicher voll (bzw. mein Programmzähler erlaubt nur 256 Schritte...).
Die Steuer-SW selbst belegt nur 202 Byte, die restlichen 1.488 von insg. 1.690 sind die abgelegten Muster.
Was jetzt als nächstes kommt:
- Speicheroptimierung: diese Animationen bestehen ja aus immer wieder wiederholten Frames, d.H. von den 247 im Speicher sind etliche gleich - also werde ich gleich nen Speicher für die ganzen "Grundbilder" machen, der Programmzähler liest dann ne Tabelle aus, in der die Nummer des Frames steht
die mach' ich dann in 16 Bit, 1. damit ich mehr als 256 Schritte haben kann und 2. eben noch Dauer, Effekte etc. zu jedem Schritt speichern kann. Ausserdem gibt es dann ein "Ende"-Flag, damit man nicht immer oben die Zahl der Schritte im Speicher eintragen muss.
Ziel ist eine Animation von 10 Minuten, die sich in der Zeit nicht wiederholt
- im Zuge dessen wird der Speicher, aus dem die ISR liest, in's Ram verlegt - wäre also theoretisch möglich, dass man darin auch Bilder *irgendwie* rechnerisch per SW erzeugt - so wie auf jeder Grafikkarte auch...
- In die Multiplex-Routine kommt noch ne PWM mit rein - das ist ganz easy, momentan bekommt jede Ebene ja 1/3 der Zeit, per PWM dann halt z.B. nur noch 1/8, damit lässt sich der Cube insgesamt oder sogar extra pro Ebene dimmen...
na, da leg' ich mal los und schaue mal, wie weit ich heute komme...