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.
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
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
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).
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
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):
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
... 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
!
: - )
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
... 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...