8×8 LED Matrix Display editiert am C64

20. Dezember 2020

Heutzutage wird sowas nicht mehr gemultiplext, oder wie auch immer – heute gibt es die WS2812 LED !
Diese LED ist ein geniales stück Technik mit eingebautem Chip.
Es handelt sich um eine RGB-LED wobei über ein Datenanschluß die Farbe bestimmt wird.
Packt man mehrere von den Dingern hintereinander hat man einen LED-Stripe, den wohl jeder schon mal irgendwo gesehen hat. Über den Datenport lässt sich jede LED einzeln ansteuern.
Die etwas abgewandelte Form ist eine LED-Matrix – im Prinzip nichts anderes als ein LED-Stripe in andere Form.

Ich wollte vor Jahren schon eine 8×8 LED Matrix an dem C64 betreiben, damals mit 64 gleichfarbigen LEDs über einen Zusätzlichen Portbaustein am Expansionsport.
Irgendwie hatte ich das Thema immer wieder verworfen – wahrscheinlich weil ich von Elektronik noch weniger Ahnung hatte als heute 😉

Das Thema hat mich schon länger fasziniert, aber wie umsetzen ?
Ursprünglich wollte ich mit einem LED-Stripe ein altes Flipperspielfeld illuminieren.
Ein Editor musste her.
Von PC Programmierung habe ich keine Ahnung – aber was den Commodore C64 angeht zumindest etwas 😛

Um den ganzen Aufwand nicht nur für das Flipperspielfeld zu veranstalten habe ich mir überlegt ein 16×16 Display zu gestalten – um in die Materie etwas reinzuschnuppern ist es halt vorerst „nur“ ein 8×8 Display geworden, was zumindest von der Programmierung des Editors aufwendig genug gewesen ist. Dazu hatte ich ständig neue Ideen was das ganze nicht gerade beschleunigte.

In Zukunft werde ich auch die 16×16 Variante umzusetzen – die „Flipperlampe“ aus dem alten Flipperspielfeld eher nicht – eignet sich nicht richtig. Dafür werde ich aber wahrscheinlich eine spezielle Matrix-Ausführung für meinen Kumpel DMC basteln 😉

Aber jetzt mal von Anfang an…
Ich habe mir einfach mal einen Stripe und ein 8×8 Display gekauft.
Da ich auf einem Atmega nur in Bascom programmieren kann hatte ich im Vorfeld mal gegoogelt ob es überhaupt möglich ist damit einen Stripe anzusteuern, bzw. ob die Geschwindigkeit für ein Bascom-Programm für den WS2812 LED Datenport ausreichen wird.
Es ist noch garnicht so lange her, da hat zum Glück ein schlauer Mensch ein passendes Plug-in programmiert damit normale Leute wie ich ohne grösseren Aufwand ein WS2812 LED-Stripe programmieren können. Dafür musste ich mir zwar die aktuelle Bascom Version installieren – egal.
Ich hatte zwar auch eine Alternative im Netz gefunden wo jemand ohne dem Plug-In was in Bascom auf die Beine gestellt hat – das war mir „etwas“ zu kompliziert.

„Hello World“ an einem Atmega8518 mit externen 32K Byte SRAM , wobei der externe Speicher hierfür noch nicht benutzt wird. Hardware läuft 🙂

DAS war ja einfach 😀
Fasziniert, dass es auf anhieb funktionierte schnell ein kleines Programm geschrieben:

Ich hab dann mal angefangen etwas mit den Farben zu spielen und versucht irgendwie die Farbpalette vom C64 hinzubekommen. Der erste Versuch war irgendwie nichts und ausserdem viel zu hell.

sehr viel später sah das ganze dann SO aus, mit Tönungsfolie, die ich mir besorgt hatte, sogar einigermassen für die Augen erträglich.

Weiß und die drei verschiedenen Grautöne sahen fast gleich auch, dazu ein braun, welches wohl eher ein anderes orange darstellt – aber man kann nicht alles haben 😉
Später im Editor sollte es daher auch nur weiß und einen Grauton zum editieren geben. Das andere machte keinen Sinn.
Ich hatte mich sehr lange mit der Farbgestaltung beschäftigt – völlig nervig, nicht nur für die Augen 🙁
Irgendwann reichte es dann auch mal. Daher gibt es im Editor anstelle der 16 C64 Farben nur 13 zu editieren. Zwei Grautöne und schwarz fehlen, wobei letzteres nichts anderes als „Pixel aus“ ist.

Bis ich die Farben endlich festgelegt hatte wurde zwischendurch alles mögliche ausprobiert.
Wie sieht es denn z.B. aus Bilder als Sequenz hintereinander abzuspielen ?


Was passiert wenn ich an Stelle der Data-Zeilen die Daten für die Bilder vorher auf das SRAM kopiere und die Daten von dort wieder lade um die LED Matrix zu füttern ?

Oh Wunder ! Es funktioniert !

Prima 🙂
Dann wollte ich es wagen anstelle eines SRAM die Daten vorher auf ein EEprom zu brennen um diese von dem auszulesen und an die Matrix weiterzugeben.

Auch DAS klappte wunderbar !
Wieso EEprom ? Nunja, ich hatte zuerst vor die Daten vom Editor über den C64 Userport über einen 8Bit-„Port“ direkt auf dem EEprom zu sichern welches in der Schaltung sitzt.
Da ich von den Datenaustausch über den Userport keine Ahnung habe, ich mich in die Thematik erst hätte einarbeiten müssen, entschied ich mich die Daten über den Umweg des EEprom brennens zu gehen.
Hmmm…. EEprom….
Ob die Schaltung denn wohl auch mit einem alten, langsamen 150ns Eprom funktioniert ?
Das wäre ja genial – Eproms gehören doch in jede Grabbelkiste 😉

Probiert, gemacht, getan…

Es funktioniert !!

Der Grundstein war gelegt – jetzt musste „nur“ noch ein Editor Programm her.

Um etwas zu editieren sollte natürlich eine Curser Funktion vorhanden sein, diese habe ich zuerst programmiert.

Als das in trockenen Tüchern gewesen ist habe ich die Editorseite gestaltet.

Cursersteuerung funktioniert 🙂

Farbwahl, Zeichensatz und Hintergrund färben funktioniert 🙂

Sequenz abspielen funktioniert 🙂

Es wurde programmiert….

…und editiert.

Nach ausgiebigen testen des Editors habe ich dann einen Titelscreen erstellt und die verschiedenen Funktionen wie „laden“, „speichern“ und „Directory aufrufen“ eingebaut.

So. Das Programm war jetzt fertig. Was nun ?
Ich hatte das Programm auf dem Atmega noch angepasst damit über einen Taster die einzelnen Blöcke weitergeschaltet werden können. Was mit am aufwendigsten gewesen ist, war es die Pausenzeiten zwischen den Bildern mit zu integrieren.

Aber was war auf einmal DAS ?!

heile:

kaputt:

Ich dachte ich werde wahnsinnig ! Das kann doch nicht sein.
Geprüft, ob die Epromdaten falsch gebrannt werden, getestet ob das Eprom eine Macke hat, DIES getestet und DAS probiert….

Als ich schon bald am Verstand am zweifeln gewesen bin hatte ich einfach mal die gleichen Farbmuster in jede Reihe der Matrix plaziert. Das Ergebnis:

Da hat es auf einmal sofort KLICK gemacht…
Ich hatte in der Zwischenzeit ein anderes, kleiners Display angeschlossen, bei dem sind die LEDs, bzw. der Datenport anders angeordnet. Quasi wie bei einem Zollstock wenn man die Matrix jetzt zu einem Stripe auseinanderklappen würde.. Da muss man auch erstmal drauf kommen !!
Da das erste Bild symetrisch aufgebaut ist und ich viel mit diesem Bild, bzw. der Sequenz getestet hatte fiel es eine ganze Zeit nicht auf.
So. und wieder 4 Std weiter….

Kurzerhand für DIESES Display das Programm auf dem Atmega angepasst…

…alles gut 😛

Nun konnte ich auch endlich die Weiterschaltung der Blöcke testen.

Unglaublich, es funktionierte alles so wie ich es mir vorgestellt habe.
Was ich gerne mal vernachlässige, das ist die Dokumentation und irgendwo liegen dann vollgekrickelte Zettel rum, die man nicht wieder findet wenn man sie braucht, oder nach einiger Zeit nicht mehr durchblickt.
Ich beschloss als nächstes dann lieber doch einen Schaltplan zu erstellen…

Ich hatte mir schon länger überlegt wo ich die Matrix reinbauen möchte. So hatte ich mir diese Holzkästen mit Glasscheibe besorgt.

Eine Schaltung, speziell für die Gehäuse musste her.
Da ich mir insgesamt 6 Displays gekauft hatte – vier davon in gleicher Grösse für eine 16×16 Matrix – habe ich ein „Universallayout“ entworfen, sodass ich alle meine gekauften Displays und Holzkästen mit der gleichen Schaltung nutzen kann.

Es dauerte nur drei Werktage – zack waren die Platinen da 🙂

sehr schön 🙂

Dann ging es dabei die Kiste zusammenzubauen:

Programm auf den Chip geflasht….

…(fast) fertig 🙂

noch bisl Tönungsfolie dran getackert…

…JETZT ists fertig 😉

um ein gescheites Video von diesem Projekt zu erstellen hab ich mir mal etwas Equipment gegönnt 🙂

hier ein paar Bilder zur Vorbereitung zum Videodreh 😛

und hier das fertige Video zu diesem Projekt:

Falls ihr Lust habt das ganze nachzubauen:

Schaltplan als GIF

Layout im Gerber-Format

Editor Programm als .d64 File

HEX Datei für den Atmega8515
(Achtung: LED Anordung auf der Matrix jede zweite Zeile von rechts nach links !!)





Schreibe einen Kommentar