Da hier im Forum schon öfter mal der Wunsch nach einer Beispiel-Software für einen kleinen RGB-Cube geäussert worden ist, habe ich mich dazu entschlossen, als kleine Fingerübung so eine Beispiel-Software in BASCOM für einen AVR-µC zu schreiben.
Ich bin eigentlich kein grosser Cube-Drahtverhau-Fan, deshalb werde ich mir so ein Ding jetzt nicht gleich selbst bauen, aber als Gedankenkonstrukt-Vorlage zum Programmieren ist so ein RGB-Cube noch ganz interessant .
Das Ziel war es, einen kleinen AVR (28 Pin DIP) verwenden zu klönnen und die ganze LED-Ansteuerung in eine flexibel aufrufbare Funktion zu verpacken, so dass man diese dann aus dem Hauptprogramm beliebig aufrufen kann. Dies sollte es den interessierten Mitgliedern dieses Forums ermöglichen, ihre eigenen Hauptprogramm-Teile und Animations-Daten ins Programmgerüst einzufügen. Als Ziel-µC sind die AVR-Typen ATmega88(p)/168(p)/328p möglich. Da die Pin-Zahl am AVR ja begrenzt ist, habe ich mich für die 27 RGB-LEDs (81 individuelle 256-Stufen-PWM-Kanäle) für eine 9x9-Matrix-Ansteuerung (18 Leitungen) anstatt der 'klassischen' 3x27-Matrix (30 Leitungen) entschieden. Dies bedingt allerdings eine etwas komplexere Matrix-Verschaltung beim Bau des Cubes (naja, ich muss ihn ja nicht bauen ). Die genaue Verschaltung kann man dem Beispiel-Schaltplan entnehmen.
Den Hauptschleifenteil der PWM-Steuerung in der Funktion habe ich aus Geschwindigkeitsgründen in Assembler geschrieben und einigermassen gut kommentiert, da Assembler ja nicht so selbsterklärend ist wie Basic. Dies ermöglicht mit einem 20 MHz Quarz eine Bildwiederholrate von ca. 150 Hz, wobei die PWM dann mit 9 x 150, also ca. 1350 Hz läuft.
Zwei Pins des AVR bleiben frei. Ich habe mich absichtlich dazu entschlossen, gerade die Pins 27 und 28 frei zu lassen, da diese bei den entsprechenden AVRs auch als Hardware-i2c-Anschlüsse (TWI; SCL und SDA) fungieren können. Wenn man das Hauptprogramm und etwaige Interrupt-Routinen entsprechend schreibt (AVR als i2c-Slave), könnte man den AVR bzw. die Animationen dann per i2c entsprechend steuern. Man könnte aber auch an die beiden Pins Tasten hängen und dann per PinChange-Interrupt die Animations-Programme etc. auswählen. WICHTIG bei jeglicher Steuerung von ganzen Animationsprogrammen von Aussen via Interrupts ist dabei die "Stopped"-Variable in der Software, deren genaue Funktion im Code erklärt wird.
Die Animationsfunktion unterstützt auch eine Einzelbild-Anzeige ausschliesslich aus dem RAM-Puffer (also ohne Einlesen von im Flash abgespeicherten Daten). Damit ist es dann auch möglich, zum Bsp. Einzelbild für Einzelbild per i2c zu bekommen (AVR als i2c-Slave) oder aus einem externen i2c-EEPROM auszulesen (AVR als i2c-Master), in den RAM-Puffer zu schreiben und anzuzeigen.
Alle Einzelheiten der Benutzung der Animationsfunktion sind im Code (in der Einleitung) beschrieben.
Vielleicht findet sich auch eine gute Seele hier in diesem Forum, welche eine entsprechende Applikation (VB, Excel ... wasauchimmer) zur visuellen Generierung der DATA-Zeilen (Bild-Daten) für die Animationen schreibt (analog zum auch hier im Forum vorgestellten 'normalen' 3x3x3-Cube).
Fragen bitte hier im Thread stellen.
Gruss
Neni