8x8-LED-Matrix
Aus BraLUG-Wiki
(→Game of life) |
(→Game of life) |
||
Zeile 34: | Zeile 34: | ||
==Game of life== | ==Game of life== | ||
− | In dieser [http://bralug.de/wiki-common/images/8/8e/Led_8x8_game_of_life.tar.gz Firmware] wurde das [http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens Game of Life] implementiert. Dabei wurde die Conways | + | In dieser [http://bralug.de/wiki-common/images/8/8e/Led_8x8_game_of_life.tar.gz Firmware] wurde das [http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens Game of Life] implementiert. Dabei wurde die Conways originale Spielregeln umgesetzt. Es existieren zwei Spielmodi: |
* einige bekannte Anfangspopulationen, welche mehr oder weniger interessante Effekte erzeugen; der Quelltext kann leicht durch weitere Bilder erweitert werden | * einige bekannte Anfangspopulationen, welche mehr oder weniger interessante Effekte erzeugen; der Quelltext kann leicht durch weitere Bilder erweitert werden | ||
* Zufallsmodus, bei dem die Anfangspopulation mittels eines Zufallsgenerator erzeugt werden | * Zufallsmodus, bei dem die Anfangspopulation mittels eines Zufallsgenerator erzeugt werden |
Version vom 29. August 2009, 17:47 Uhr
Inhaltsverzeichnis |
Motivation
Vor einiger Zeit kaufte ich bei Pollin ein 8x8-LED-Modul als Muster für ein geplantes Projekt. Als ich mich dann entschieden hatte, dieses Projekt wirklich in Angriff zu nehmen, war ausgerechnet dieses LED-Modul ausverkauft. Um das Muster nicht sinnlos rumliegen zu lassen, habe ich es jetzt als Ausgangspunkt für ein paar Spielereien mit einem ATMega8 und einer 8x8-Anzeige genommen, eine entsprechende Schaltung entworfen/aufgebaut sowie eine Art Applikationstemplate geschrieben...
Hardware
Die Hardware besteht aus:
- einem ATMega8 in seiner einfachsten Grundschaltung
- drei Tastern
- und dem erwähnten 8x8-LED-Matrix-Modul (da ich kein Datenblatt hatte, musste ich die Anschlußbelegung selbst "durchklingeln"...)
Besonderheiten der Schaltung:
- Es wurden keine Treiber für die LEDs vorgesehen und davon ausgegangen, dass im Multiplexbetrieb die Ströme an den Ausgängen des ATMega8 nicht das Maximum überschreiten (siehe Datenblatt). Die verwendeten Vorwiderstände von 68 Ohm sind etwas sehr pessimistisch gewählt worden. Dieser Wert könnte noch etwas verringert werden, um die LEDs heller leuchten zu lassen.
- Der, für das Ein-/Ausschalten vorgesehene Taster muss mit einem der Controller-Pins für INT0 oder INT1 verbunden sein, um die Schaltung wieder aus dem Sleep-Zustand holen zu können. Deshalb gibt es keine "programmtechnisch günstige Verdrahtung", also alle 8 Spalten/Zeilen jeweils an einem Port. Dies ist bei der Programmierung der Firmware zu beachten, verkompliziert sie aber nicht wesendlich.
Software
Template
Als Ausgangspunkt für eine Reihe von möglichen Programmen mit dieser Hardware, wurde erstmal ein Applikations-Template geschrieben. Folgende Dinge wurden hier bereits implementiert und können 1:1 in weitere Anwendungen übernommen werden:
- Hardwaredefinitionen (Definition der Ports/Pins usw. für die Taster und jede einzelne Steuerleitung der LED-Matrix)
- Multiplex-Ansteuerung der LED-Matrix im Timer0-Overflow-Interrupt des ATMega8. Es werden die Zeilen der Matrix einzeln durchgeschaltet und jeweils die entsprechenden Spalteninformationen ausgegeben. Die "Bildinformationen" befinden sich im globalen Feld
led[]
, welches nur noch mehr oder weniger sinnvoll gesetzt werden muss. - Tasterabfrage mit Entprellung (Funktion
getkey()
), für jede betätigte Taste wird ein definierter Tastencode zurückgegeben. - der Ein-/Ausschalter ist bereits im Template realisiert. Bei Betätigung dieses Tasters fährt der Controller in den Sleep-Modus mit der geringsten Stromaufnahme. Nach nochmaliger Betätigung des Tasters, startet der Controller wieder.
Desweiteren wurden 2 Farbmodi im Template realisiert, welches mit dem Define TWO_BIT_DOTS
gesteuert werden kann und nach dem sich auch die Größe des Bildspeichers (Feld led[]
) richtet:
- 2-Farb-Modus:
led[]
ist 8 Byte groß, jeweils ein Byte für eine Zeile, jedes Bit im jeweiligen Byte korrespondiert mit der entsprechenden Spalte in der Zeile. Bit=0 --> LED aus; Bit=1 --> LED an - 4-Farb-Modus: es sind 4 Helligkeitsstufen pro LED definierbar. Dazu ist das Feld
led[]
16 Byte lang, 2 Byte (ein word) für eine Zeile, jeweils 2 Bit für eine Spalte. Damit sind 4 Zustände pro LED möglich: 00=LED aus... 11=LED ganz hell. Softwaretechnisch wurde dieser Modus über Austastlücken während des Multiplexbetriebes realisiert. D.h, die 2-Bit-Zahl für die entsprechende LED gibt an, wieviel mal die LED in 4 aufeinander folgenden Zyklen angeschaltet wird. Theoretisch ist es auch möglich, noch mehr Helligkeitsabstufungen zu realisieren. Dazu müsste aber die Multiplex-Frequenz weiter erhöht werden, damit die LEDs mit geringer Helligkeit nicht anfangen (sichtbar) zu flackern. Die Erhöhung der Frequenz würde aber auch eine geringere Gesamthelligkeit ergeben...
Game of life
In dieser Firmware wurde das Game of Life implementiert. Dabei wurde die Conways originale Spielregeln umgesetzt. Es existieren zwei Spielmodi:
- einige bekannte Anfangspopulationen, welche mehr oder weniger interessante Effekte erzeugen; der Quelltext kann leicht durch weitere Bilder erweitert werden
- Zufallsmodus, bei dem die Anfangspopulation mittels eines Zufallsgenerator erzeugt werden
Weitere Ideen
Mögliche Applikationen, die man mit dieser Hardware realisieren könnte:
- Darstellung von einfachen 8x8-Bildern, -Zeichen, -Animationen
- einfaches Pong-Spiel
- ...?