Forum: Projekte & Code Bricks - BreakOut Game für ATmega168 / 328p


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Nachdem ich dabei bin, alle meine Softwaresourcen so weit es geht an die 
von mir verwendeten Controllerfamilien anzupassen habe ich ein Spiel von 
mir, das ich für den STM32F030 geschrieben hatte (und daraus sogar ein 
Gerätchen gemacht, weil es eines meiner Lieblingsspiele aus den 80er und 
90er war) nun mit ein paar Anpassungen auf dem ATmega zum laufen 
gebracht und ich war überrascht (ob der 8 Bit) dass das absolut genauso 
spielbar ist, wie auf dem STM32.

Das Spiel ist für eine Auflösung von 128x128 TFT mit SPI Schnittstelle 
geschrieben (auch wenn auf dem Screenshot ein 128x160 zu sehen ist).

Sollte halt sehr klein und sehr preiswert sein.

Es ist lauffähig auf einem ATmega328p und einem ATmega168 (hier dann 
allerdings aufgrund von nur 16kB Speicher mit sehr reduziertem 
Spielelogo... das Spiel selbst jedoch nicht).

Im Header tftdisplay.h kann der verwendete Controllertyp des Displays 
eingestellt werden (derzeit sind hier ILI9163 und ST7735 mit den 
Displays verbaut) sowie die Auflösung.

Die in Pindefs eingestellte aktuelle Verdrahtung ist Pindefs 1 und die 
hat die folgende Verbindung:
1
     Display    |   GPIO-ATmega
2
  --------------------------------
3
4
    DIN / MOSI  ->     PB3
5
    CLK / SCK   ->     PB5
6
       rst      ->     PB0
7
       D/C      ->     PB1
8
        CE      ->     PB2

Die Spieletasten sind folgendermaßen angeschlossen (Taster schalten 
gegen GND):
1
Taster nach links   ->    PD4
2
       nach rechts  ->    PD5
3
            Start   ->    PD6

Die Tastenbelegung kann mittels den defines in bricks.c geändert werden


Wer es ausprobieren will, viel Spaß dabei (ich habe jetzt sage und 
schreibe knapp über eine Stunde verdaddelt, nur weil ich den sechsten 
Level schaffen wollte... ich habs nicht geschafft).

Gruß Ralph

PS: je nach Resonanz portiere ich vielleicht auch noch das Tetris und 
das Snake (auf demselben Display) nach ATmega. Wobei ich glaube, dass 
der AVR mit dem Snake etwas überfordert ist, weil die Schlange aus 
vielen bewegten Pixeln besteht.

von Ralph S. (jjflash)


Lesenswert?

PS_PS: für jemand der es einfach nur zusammenbauen möchte sind die 
Hexfiles für ATmega328 und ATmega168 im Zip enthalten. Hier jedoch für 
ein 128x160 Display

von Dominik (Gast)


Lesenswert?

Sehr geil!
Daumen hoch!

Werde ich mir mal nachbauen wenn ich mir ein TFT besorgt habe.

von Ralph S. (jjflash)


Lesenswert?

Das Standarddisplay hierfür ist ein solchiges:

https://www.ebay.de/itm/1-44-Colorful-SPI-TFT-LCD-Display-ST7735-128X128-Replace-Nokia-5110-3310-AHS/302917174521?hash=item46874544f9:g:w14AAOSw5rdZeybk

Manche davon haben einen Adressraumfehler, sind intern verdrahtet als ob 
ein 160x128 angeschlossen wäre. Das ist mir jetzt eine weile lang nicht 
mehr passiert, aber dieser Fehler kann in der tftdisplay.h mittels einer 
einzelnen define-Änderung angepasst werden (Kommentare hierfür sind 
dokumentiert in der Header-Datei).

von Dominik (Gast)


Lesenswert?

Super, danke!!

von Peter S. (petersieg)


Lesenswert?

Hallo Ralph.

Das sieht ja mal KLASSE aus! Noch besser könnte man es in einem Youtube 
Video sehen ;-)

Schaue ich mir mal an.

Ansonsten Standard-AVR Beschaltung mit Quarz (16 MHz steht im Source)?

Danke!
Peter

: Bearbeitet durch User
von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Peter S. schrieb:
> Noch besser könnte man es in einem Youtube
> Video sehen ;-)

Filmen hab ich versucht, aaaaaaaber: ich habe mein Stativ nicht hier und 
auch niemanden der das filmen kann, zudem sind momentan die 
Lichtverhältnisse schwierig, aber ich werds nochmal versuchen. Momentan 
bspw. hab ich versucht den Tetrisport zum AVR zu fotographieren, das ist 
absolut blaustichig und entspricht nicht den Farben die man wirklich 
sehen kann. Für einen Eindruck werd ichs versuchen.

Ansonsten Standard-AVR Beschaltung mit Quarz (16 MHz steht im Source)?

Joh. Ich hab sogar versucht das mit 8MHz intern laufen zu lassen. 
Funktioniert auch noch, aber man merkt dann, dass der AVR etwas in die 
Knie geht. Fuses für 16MHz hab ich nicht im Source dokumentiert, 
deswegen hier (Fuseseinstellung für Mega328p und Mega168 sind 
identisch):
1
LO: CF    |    HI: D9    |    EXT:  F9

-----------------------------------------------

Den Port für das Tetris habe ich dann auch noch gemacht und es gab eine 
kleine nicht so schöne Überraschung beim Anpassen:

Die Grundeinstellung für "char" hatte ich, warum auch immer für 
arm-none-eabi-gcc und für avr-gcc  unterschiedlich gehabt und prompt gab 
es etwas Ärger. Hieran merkt man auch, dass ich das Tetris vor längerer 
Zeit gemacht hatte (auch am Programmierstil) und hab das geändert.

Im Anhang also die Source für das Tetris auf dem ATmega mit 128x128 SPI 
Display. Im Screenshot sieht man, wie die Farben wirklich auf dem 
Display aussehen (das war das, was ich am PC für das Display konvertiert 
hatte). Von meinem Monitor zum TFT Display gibts nur einen leichten 
kleinen Versatz (liegt auch am RGB: das TFT-Display kann "nur RGB565, 
also 16-Bit Farben, am PC hat man natürlich 32-Bit Color).

So, Anschluss für das Tetris ist derselbe wie für das Breakoutspiel. 
Eine Taste ist hinzugekommen (und Anschluss steht im Quellcode).

von Ralph S. (jjflash)


Lesenswert?

Smile, ein erstes Video (und dann auch noch gedreht), man merkt ich 
stelle nicht so oft etwas in Youtube ein. Außerdem sind auf Youtube die 
Funktionalitäten wieder anderst angeordnet als ich die beim letzten mal 
noch vorfand.

Filmchen zum Spiel (schlecht), aber man sieht den Spielfluss:

https://www.youtube.com/watch?v=M1sJ5Ou9k1Y

von Peter S. (petersieg)


Lesenswert?

Sehr schön. Danke!
Muss ich wohl mal Teile bestellen ;-)

Peter

von Peter S. (petersieg)


Lesenswert?


Beitrag #5853077 wurde von einem Moderator gelöscht.
von Ralph S. (jjflash)


Lesenswert?

Peter S. schrieb:
> Passt dieses Display (die Bezeichnungen der Pins sind etwas anders)?:
>
> Ebay-Artikel Nr. 302917174521

Es sollten derzeit alle preiswerten in China erhältlichen SPI-Displays 
mit einem der Controller:

 ili9163, ili9340, st7735r, s6d02a1, ili9225 oder st7789

funktionieren.

Für die beiden von dir verlinkten EBAY-Displays mußt du die tftdisplay.h 
anpassen (s6d02a1 zu 0 und st7735r zu 1 setzen):
1
  /* ------------------------------------------------------------------
2
                            Displayauswahl
3
4
       es kann (und muss) nur ein einziges Display ausgewaehlt sein.
5
     ------------------------------------------------------------------ */
6
7
  // ----------------------- SPI- Displays ----------------------------
8
9
  #define  ili9163                  0
10
  #define  ili9340                  0
11
  #define  st7735r                  1
12
  #define  s6d02a1                  0
13
  #define  ili9225                  0
14
  #define  st7789                   0
15
[code]
16
17
und die Auflösung des Displays anpassen:
18
19
[code]
20
  /*  ------------------------------------------------------------
21
                         Displayaufloesung
22
      ------------------------------------------------------------ */
23
24
  #define _xres                   128
25
  #define _yres                   128

Manche der älteren 128x128 Displays haben eine "falsch" verdrahteten 
Adressraum (und werden angesprochen wie ein 128x160 Display). Sollte die 
Anzeige um 32 Pixel verschoben sein (sieht man an einem verrauschten 
Streifen auf dem Display) mußt du diese Zeile hier anpassen:
1
    #define tft128                  2                 // 1: Display ohne Offset (aelter)
2
                                                      // 2: Display mit Offset (neuer)

Natürlich kann man auch einen Arduino hierfür verwenden, den Sinn darin 
allerdings verstehe ich nicht ganz (abgesehen davon, dass man wohl, wenn 
man sich mit AVR beschäftigt sowieso einen herumliegen haben sollte), 
denn außer den Blockkondensatoren für die Betriebsspannung, einen 16MHz 
Quarz und zwei Ziehkondensatoren (ich verwende 29pF) braucht es am 
Controller nichts mehr. Wenn du also bspw. einen Arduino Nano besorgen 
möchtest (den du wohl in einem Steckbrett oder einen Sockel betreibst), 
kann man ebenso gut einen "nackten" Chip verwenden (wenn ein 
ISP-Programmer vorhanden ist - wenn nicht: USBASP kaufen)

Wenn du das mit einem Arduino machen möchtest mußt du diesen nicht mit 
einem ISP-Tool flashen, der Bootloader kann das auch.
Wenn du einen Arduino-Nano kaufst solltest du aufpassen:

1. Mittlerweile sind die günstigsten Nanos mit einem ATmega168 bestückt. 
Hier kannst du den Bootloader NICHT verwenden, weil das Hexfile aufgrund 
der vom Bootloader reduzierten Größe nicht mehr hineinpasst

2. Leider kommt es sehr oft vor, dass der Bootloader im Nano mit 
falscher Baudrate geflasht ist. Meine Nano's hier haben den Bootloader 
vom UNO erhalten

Das Flashen über den Bootloader kannst du das Makefile erledigen lassen, 
wenn du im Makefile folgendes abänderst:

Von:
1
# fuer AVRDUDE
2
PROGRAMMER = usbasp
3
SERPORT    = /dev/ttyUSB0
4
BRATE      = 115200

nach:

[code]
# fuer AVRDUDE
PROGRAMMER = arduino
SERPORT    = /dev/ttyUSB0
BRATE      = 115200[
/code]

Hier ist für SERPORT der Port anzugeben, an dem er tatsächlich 
angeschlossen ist. Unter Windows ist hier der COM-Port anzugeben

Beitrag #5858720 wurde von einem Moderator gelöscht.
von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

... erstens kommt es anderst und zweitens als man denkt... leider !

Nachdem Peter S. dieses Display nachgefragt hatte:

Peter S. schrieb:
> Passt dieses Display (die Bezeichnungen der Pins sind etwas anders)?:
>
> Ebay-Artikel Nr. 302917174521

habe ich doch glatt ein genau solchiges angeschlossen (weil ich die erst 
Anfang des Jahres geoordert hatte, aber bisher noch nicht verwendet).

Zu meinem Erschrecken musste ich feststelle:

Das ist jetzt schon die vierte Variation im Verhalten dieser kleinen 
1.44" Display, leider.

Die ersten die ich besorgt hatte, waren mit einem ILI9163 Controller und 
die älteren davon haben reagiert wie ein 128x160 Display, die neueren 
nicht. Also gab es in meinen Grafikfunktionen Anpassungen dafür. Die 
nächsten die kamen, waren mit ST 7735, hier musste nur die 
Initialisierung geändert werden.

Dieses hier hat jetzt leider eine andere Start-Row und Start-Colum und 
deswegen musste die "Treiber-Software" abermals geändert werden. Die 
veränderten ROW und COL macht sich dadurch bemerkbar, dass der 
Bildschirminhalt in x- und y- Koordinate um je 3 Pixel verschiebt, 
sodass es einen unschönen verrauschten Rand gibt.

Die im Zip-File enthaltenen Hex-Files sind für ein solchiges Display aus 
EBAY compiliert worden, der Anschluß kann u.a. dem Schaltplan entnommen 
werden.

Die Reihenfolge der Einstellungen in tftdisplay.h habe ich der 
Übersichtlichkeit wegen neu angeordnet und es kam ein Schalter hinzu:
1
  #define  st7735r_g2             1                 // neuere TFT 128x128 mit ST7735 haben eine
2
                                                    // abweichende Colum-Start und Row-Start
3
                                                    // 0 : ohne Abweichung
4
                                                    // 1 : mit Abweichung

Dann habe ich dieses Display 3 Tage lang am Stück laufen lassen und so 
wie es scheint ist dieses an den Pins 5V tolerant.

Die Betriebsspannung scheint es nicht zu sein und ob die kleine 
Lötbrücke auf der Rückseite einen Spannungsregler aktiviert muß ich noch 
herausfinden.

Das Display selbst jedoch ist unempfindlich und werden 2 Stck. 1N4148 
Dioden seriell in die Spannungszufuhr geschaltet, so läuft das auch mit 
5V klaglos. Der besseren Helligkeit wegen kann die LED die das Display 
beleuchtet mit 5V betrieben werden.

Dann hatte Peter S. die Frage, das mit einem Arduino zu betreiben und 
mir widerstrebt das irgendwie, extra nur für die Spielerei einen Arduino 
zu verwenden (von der Größe mal ganz abgesehen).

Ein Arduino (Uno oder Nano) ist nichts anderes als ein ATmega mit 
installiertem Bootloader, der auf der Platine einen USB2UART Chip 
verbaut hat (im Falle der China-clones ist das ein CH340G).

Also habe ich auf dem Steckbrett das ganze mit einem 328p und 
installiertem OPTIBOOT Bootloader aufgebaut. Das funktioniert klaglos.

Die USB2UART Brücke benötigt, um einen Bootloader zu aktivieren, einen 
herausgeführten RTS oder DTR Anschluß. Die ganz preiswerten USB2UART 
Adapter für die Steckbretter haben diesen leider nicht herausgeführt, 
aaaaaaber:

Im Zuge eine Fehllieferung aus China habe ich einen

STC-Auto-Programmer

https://www.ebay.de/itm/STC-Auto-Programmer-Unit-mini-STM8-STM32-Emulator-Downloader-0cn/183636133570?hash=item2ac19106c2:g:bJoAAOSwJGlbTapG

was nichts anderes als eben den CH340G Chip enthält, allerdings mit 
herausgeführtem RTS Anschluss (am Adapter wird dieser jedoch als TCK 
bezeichnet).

Vereinfacht kann man sagen:

Steckbrett + ATmega + Bootloader + STC-Auto-Programmer = Arduino

Geschieht der Aufbau wie im Schaltplan, kann der 328p (bei installiertem 
Bootloader) wie ein Arduino UNO behandelt werden. Erwartungsgemäß hat 
auch ein Flashen des Chips aus der Arduino - IDE funktioniert.

Wer das dennoch unbedingt Arduino-Hardware aufbauen mag: Im Schaltplan 
sind rot die Pin-Nummern der Arduinoboards eingetragen, an denen das 
Display und die Taster angeschlossen werden müssen.

Dann habe ich das ganze nochmal gefilmt, mit besserem Licht:

https://www.youtube.com/watch?v=vusoUVdBADU&t=24s

------------------------------------------------------------

An sich denke ich, dass es jetzt keine größeren Fragen mehr geben sollte 
!

: - )

von Gustav G. (Gast)


Lesenswert?

Habt ihr gewusst dass Tetris gar nicht so simpel ist wie es auf den 
ersten Blick erscheint ?

Man muss für den optimalen Punktgewinn einen riesigen Stapel häufen und 
eine Spalte freilassen - die am besten von ganz unten bis sehr weit oben 
geht. Die füllt man am Ende kurz hintereinander mit langen schmalen 
Blöcken.

Ich vermute stark dass das Programm diesem Vorgehen entgegenkommt und 
die Blöcke so anbietet dass sie einem bestimmten Muster folgen und diese 
Spielweise ermöglichen.

Die besten Spieler sind dann diejenigen die das bis zum letzten Level 
auf der höchsten Geschwindigkeitsstufe durchziehen. Auf youtube sind 
Videos dazu, zB.

https://www.youtube.com/watch?v=7T7mg6JZZzg

von Ralph S. (jjflash)


Lesenswert?

... das hängt dann schlicht von der Implementation ab. Bei mir gibts 
einfach nur einen Punkt per abgetäumter Reihe. Allerdings kann das jeder 
so anpassen wie er mag...

von Stefan F. (Gast)


Lesenswert?

Dominik schrieb:
> Sehr geil!
> Daumen hoch!

Ja das finde ich auch. Tetris wäre genau so Klasse.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.