Tetris auf dem Arduino

Hallo Zusammen,

Ich benötige mal wieder Hilfe :confused: .

Mein Problem ist ich habe auf einer 8x5 Matrix mit WS2812 LEDs und einem Arduino UNO Tetris programmiert. Es hat alles schön und toll funktioniert. Dann bin ich auf die glorreiche Idee gekommen eine 20x10 Matrix mit den WS2812 LEDs zu bauen. Das habe ich dann auch getan und danach habe ich jede LED einzeln getestet ob die LEDs überhaupt leuchten, dass hat auch noch funktionert. Dann habe ich die NeoMatrix und GFX Bibliotheke getestet und haben einen Text auf der Matrix ausgegeben, dies hat auch hervorragen funktioniert. Dann habe ich mein altes Programm (Das von der 8x5 Matrix) auf die neue Matrix umprogrammiert (paar Variabeln geändert usw.), dieses wollte ich nun einfach auf einen Arduino geladen und dass hat ebenfalls funktioniert.

Zum eigendlichen Problem kommen wir erst jetzt, die Geschichte oben hilft euch evt. euch zur Lösung meines Problems. Es hat mir Angezeigt das 77% des Arbeitsspeichers benutzt sind und es eventuell nicht sehr stabil laufen wird, bzw. es zu Problemen führen könnte.

Ich habe es aber trotzdem hochgeladen und es hat nichts mehr funktioniert ich habe extra mit dem Oszi gemessen ob die LEDs eine Dateneingang haben und die hatte keinerlei Impulse. Ich habe auch extra mit einer Seriellen Schnittstelle abgefragt ob der Text bzw. das Progamm läuft, das hat allerdings funktioniert. Und jetzt bin ich hilflos :confused:

Jetzt möchte ich gerne wissen ob der Arbeitsspeicher zu voll ist oder ob sonst ein Fehler aufgetreten ist.

Vielen Dank im Vorraus
bdorer

Der Programmcode ist 3500 Zeilen lang, ich denke nicht das ihr euch den durchlesen wollt.

bdorer:
...
Jetzt möchte ich gerne wissen ob der Arbeitsspeicher zu voll ist oder ob sonst ein Fehler aufgetreten ist.
...
Der Programmcode ist 3500 Zeilen lang, ich denke nicht das ihr euch den durchlesen wollt.

Ist außer der Meldung mit dem knappen Speicher sonst etwas gemeldet worden? Wenn ja, wäre der vollständige Text der Fehlermeldung(en) hilfreich. Das ist bestimmt auch keine 3500 Zeilen lang.

Gruß

Gregor

Wenn ich Hellsehen könnte würd ich etwas anderes machen; zB Lottospielen, oder vieleicht etwas anderes das weniger auffällt, wenn man dauernt gewinnt. :wink: :wink:
Grüße Uwe

10x20 WS2812 braucht für die LEDs 600Byte Ram. Die Wahrscheinlichkeit ist sehr hoch, dass du an die Grenzen des Rams stößt.

Versuch einen Arduino MEGA 2560
Grüße Uwe

Oder den ATMEGA1284, den gibt es auch als DIL 40 Pinner

seufz
Selbst wenn der WS2812 als Buffer die von Theseus besagten 600 Bytes für ein 10x20-Array mit je 3 Farbbytes benötigt - bin ich überzeugt, dass man für das Programm mit einem UNO gut auskommt. Wenn du allerdings auf deinem extrem unökonomisch programmierten "4D-Array" aus dem ersten Threat https://forum.arduino.cc/index.php?topic=498589.0 beharrst, dann bleibt dir in der Tat nur der Ausweg auf einen größeren Controller.

Du solltest noch mal meine Ausführen von Anfang September "genau" lesen und auch versuchen, das beigefügte Pascal-Programm ein wenig zu verstehen. Dann klappt es mit Sicherheit auch ohne RAM-Probleme.

Etwas intensiv nachgedacht und trickreicher programmiert (Stichwort: "Nibbles", "Farbindizes") - könnte man das einzig nötige "Arbeits-Array" m.E. theoretisch sogar auf 100 Bytes reduzieren. Aber eben nur theoretisch... ich habe leider kein WS2812 vorliegen um das ganze zu analysieren und zu testen.
LG, Rudi

Hi

Vll. bin ich einfach zu geizig - aber warum Bytes verprassen, wenn man auch mit Bits hinkommt?
4 Richtungen - 2 Bit
7 Steine (8 möglich) - 3 Bit
bleiben 3 Bit für eine Farbe

So geschwindigkeitsabhängig ist Tetris nun nicht, daß man dort nicht etwas rechnen kann, bevor die Ausgabe kommt.

Auch würde ich versuchen, die Steine nur 1x abzuspeichern und dieses Array, je nach Richtung, von oben/unten/links/rechts aus zu lesen.

Auch diese Rechnerei sollte in der verfügbaren Zeit ausführbar sein.

Das Setzen/Versetzen des Block würde ich aus diesem Array heraus machen - dort, wo ein Punkt gesetzt ist, wird Dieser angezeigt bzw. zum Versetzen halt im ersten Schritt gelöscht.
Wenn die Wartezeit zum nächsten Step abgelaufen ist, der Stein also eine Zeile runter fallen soll, lösche ich den Stein, zähle eine Linie dazu, prüfe, ob ich den Stein ohen Kollisionen setzen kann.
Wenn NICHT, Zeile -1, Stein Setzen, fertig - ab jetzt liegt dieser Stein nur noch als Hintergrund vor.

MfG

Geizkragen unter sich ... :wink:
Aber diese Ausführung entspricht fast genau meinen eigenen Gedanken. Nur gehe ich noch einen Schritt weiter - und ignoriere die Drehrichtung, weil ich die einzelnen Muster entsprechend der Drehrichtung aus einem Muster-Array im Flash auslesen. Die aktuelle Richtung braucht man nur 1x innerhalb der Funktionen, die fürs aktuelle Drehen/Löschen/Bewegen zuständig sind. Somit braucht man lediglich die Feld-Adressen im Arbeitsarray auf 0 (frei) oder X (belegt) vergleichen. X steht hierbei für irgend einen Farbindex von 1..15 - wodurch ich sogar das ganze auf Nibbles beschränken könnte und dadurch auf meine 100-Byte-Version komme. Mal abgesehen von der Nibble-Kompression funktioniert meine Pascal-Fassung nach diesem Verfahren.
LG, Rudi

Hey Leute,

Habe mich soeben ein bisschen im Betrieb rumgehört, und es hat geheißen ich soll den Kompiler mal auf Speichersparend umstellen und nicht auf Geschwindigkeit.

Weis jemand wie das geht?

Vielen Dank
bdorer

In der Arduino Wert ist -Os der Standard.

Einstellbar in der betreffenden boards.txt

nix_mehr_frei:
Oder den ATMEGA1284, den gibt es auch als DIL 40 Pinner

Kann man den relativ einfach mit der Arduino IDE progammieren oder muss man den erst irgendwie "freischalten" bzw. wie wenn man ein anderes Board einbindet?

Danke im Vorraus

bdorer

Hi

Google meint: Ja
Oder hat zumindest Leute gefundn, Die Das meinen.
https://maniacbug.wordpress.com/2011/11/27/arduino-on-atmega1284p-4/
https://nathan.chantrell.net/20120811/using-the-atmega1284p-with-the-arduino-ide-wiz820io/
http://openhardware.ro/using-atmega1284-arduino-ide/

Gesucht wurde nach 'arduino ATMEGA1284' mittels DuckDuckGo

MfG

bdorer:
Kann man den relativ einfach mit der Arduino IDE progammieren oder muss man den erst irgendwie "freischalten" bzw. wie wenn man ein anderes Board einbindet?

Ja, zum Beispiel damit: GitHub - MCUdude/MegaCore: Arduino hardware package for ATmega64, ATmega128, ATmega165, ATmega169, ATmega325, ATmega329, ATmega640, ATmega645, ATmega649, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega3250, ATmega3290, ATmega6450, ATmega6490, AT90CAN32, AT90CAN64 and AT90CAN128

Ja, das geht.
Selbst hier im Beitrag "Zeigt her eure geilen Projekte!" habe ich noch Anfang diesen Jahres eine funktionierende Platine mit einem 1284p gezeigt (3. Bild):

https://forum.arduino.cc/index.php?topic=372623.msg3220519#msg3220519

Nachteil "lediglich" ist, dass ich speziell für den 1284p parallel (noch) die alte IDE 1.06 nutze (schäm).
Sicherlich gibt es bereits neuere Cores ... aber ich habe dafür im Moment leider gar keine Zeit :frowning: