Forum: Projekte & Code Erstes Projekt: Snake


von Lars M. (desmulator)


Angehängte Dateien:

Lesenswert?

Guten Abend liebe µC-Gemeinde,
ich würde gerne mein erste Projekt vorstellen. Dabei handelt es sich um 
eine mögliche Umsetzung des klassischen Handyspiels Snake aus den 
neunziger Jahren.

Zunächst zu meine Person, ich bin 21 Jahre alt, studiere Mathematik in 
Bonn und habe das 4. Semester abgeschlossen. Da nun Semesterferien sind, 
hat man als Student viel Zeit übrig, wenn man nicht unbedingt arbeiten 
muss, außerdem kann man ja nicht den ganzen Tag Sport machen. Darum habe 
ich mich vor 4 Wochen das erste mal an den Rechner gesetzt, die ersten 
Bauteile bestellt und fing an etwas zu auf Steckbrettern zu bauen.

Da ich mich bereits außerhalb mit der x86-Architekture auseinander 
gesetzt hatte, dazu zählen auch einige erste Gehversuche in der 
OS-Entwicklung, gestaltete sich der Einstieg in den Umgang mit einem 
ATMega8 nicht allzu schwer. Jedoch habe ich dafür um so weniger Ahnung 
von elektrischen Schaltungen und versuchte mich mit meinem 12. Klasse 
Physikwissen irgendwie über Wasser zu halten. Letztendlich stehen aber 
in vielen Datenblättern passende Beschaltungen und aufmerksames Lesen im 
Wiki half auch. (Informationen teilweise versteckt, bzw. für mich als 
Anfänger wirkte das Wiki sehr undurchsichtig und komplex, was aber eher 
an einem fachlichen Defizit meinerseits lag, als an der Qualität der 
Texte)

Jetzt aber zum Projekt. Ein paar Bilder:
http://files.x-scripter.com/~lars/snake/IMG_20140822_014534_367.jpg
http://files.x-scripter.com/~lars/snake/IMG_20140822_014634_554.jpg
http://files.x-scripter.com/~lars/snake/IMG_20140822_014643_645.jpg


Wo fange ich bloß an, vielleicht mit der Bauteilliste:
ATMega8-L als µC (ich hab einen „normalen“ ATMega8 verwendet)
DogM128-W als LCD mit 128*64 Auflösung und SPI-Schnittstelle
http://www.lcd-module.de/pdf/grafik/dogm128.pdf
3,3V Spannungswandler (normaler Low-Drop-Wandler)
4 Taster
Keramikkondensatoren: 10µF, 100nF, 47nF, 220nF, 9 mal 1µF
Widerstände: 6 mal 10kΩ
2*3 Buchse für ISP (optional)

Schaltplan ist angehängt oder kann hier aufgerufen werden.
http://files.x-scripter.com/~lars/snake/schaltplan.png

Ich habe bereits etwas weiter geplant und wollte statt der Taster auf 
einen 4-Wege SMD Joystick umsteigen. Dafür habe ich mich etwas mit 
Platinendesign beschäftigt, Ergebnisse findet ihr hier:
http://files.x-scripter.com/~lars/snake/platine.png
http://files.x-scripter.com/~lars/snake/platine_top.png
http://files.x-scripter.com/~lars/snake/platine_btm.png
Gesamt ohne Massenflächen, Vorderseite und Rückseite. (Bitte auch 
bewerten)

Als Spannungsquelle habe ich für meinen Aufbau auf dem Steckbrett immer 
eine 9V Block vergewaltigt, zwar völlig überdimensioniert, aber am 
Anfang wollte ich mir nicht auch darüber noch Gedanken machen müssen und 
der LD3V3 scheint einiger maßen damit zurecht zu kommen.

Der LD3V3 und das DogM sind beschaltet wie es in den jeweiligen 
Datenblättern steht. Außerdem möge man mich dafür schlagen, dass ich die 
interne Clock des ATMega8 benutzt. Das Spiel ist für einen Takt von 1MHz 
ausgelegt, mehr macht keinen Sinn. (sonst delay erhöhen)


Soweit so gut, die Software war eigentlich die größte Arbeit, würde ich 
auf 40h schätzen, wenn man von Tests mit dem LCD absieht, Recherchezeit 
und Fehlerbehebung dazu zählt.

Quellcode und Daten im Anhang oder hier:
http://files.x-scripter.com/~lars/upload/snake.rar

Hier kurz etwas zu Steuerung: (Für Buttonnummern siehe Schaltplan)
1. Mit dem Reset sollte das Titelbild auf dem LCD erscheinen. Drücke 
Button 2 um das Spiel zu beginnen.
2. Im Spiel siehst du oben rechts einen aktuellen Punktestand. Mit 
Button 1 steuerst du in Kriechrichtung nach rechts, mit Button 3 nach 
links. Ziel ist es die zufällig erscheinenden Futterbrocken 
einzusammeln. Dabei darf man nicht über den Rand der Spielfelds hinaus 
oder sich selbst beißen.
3. Sollte dies doch passieren (wird irgendwann der Fall sein) bleibt das 
Spiel stehen.
4. Mit Button 2 kommst du nun zum Highscore-Bildschirm. Hier wird dein 
Punktestand und der aktuelle Highscore angezeigt. Falls du einen neuen 
Highscore aufgestellt hast, so erscheint „NEW!“ und dein Punktestand 
wird im EEPROM gespeichert.
5. Mit dem RESET-Button kannst du ein neues Spiel beginnen.

Wichtig zu wissen ist vielleicht, dass im EEPROM sowohl der Highscore 
als auch der nächste Seed für den Pseudozufallsgenerator gespeichert 
wird, sodass jedes Spiel fast einzigartig ist. (Periode von 16-Bit)

Das Spielfeld wird im SRAM gespeichert und die Bilderzeugung ist 
on-the-fly, es gibt also keinen Zwischenspeicher auf dem µC.
Da bei der Übertragung immer je ein Pixel für 8 Zeilen übertragen wird, 
müssen diese, da intern eine "Page" nochmal in zwei Zellen geteilt ist, 
erst zusammen gesetzt und schließlich gemeins übertragen werden.


Der PRNG ist eine Kombination eines 16-bit LCG mit ausgedachten Werten 
(Satz von Knuth) und xorshift in 32-bit. Kombination erfolgt über 
Addition der Werte mit Überlauf. Zufallszahlen in einem Bereich, siehe 
random.nextBetween, werden über einen Modulo gelöst um eine annähernde 
Gleichverteilung zu erreichen. PRNG besteht zwar keine umfangreichen 
stochastischen Tests aber für die Anwendung vollkommen ausreichend.

int2string arbeitet auch mit modulo, siehe divMod16_8.

Das war's soweit von mir, würde mich sehr über Rückmeldung freuen. Ich 
bin totaler Anfänger und für jeden Tipp oder Hinweis dankbar. Falls die 
Schaltung totaler Mist ist, könnt ihr das auch gerne sagen. Quellcode 
dürft ihr natürlich auch zerpflücken. Soweit ich weiß, sind die 
wichtigsten Sachen kommentiert.

Gute Nacht!
PS: Bei Fragen zum Code bin ich gerne bereit einzelne Stellen zu 
erklären.

: Bearbeitet durch User
von Jimbo36 (Gast)


Lesenswert?

Hallo,

ich kann nur grad was zu PCB-Layout sagen. Zunächst würde ich die 
Position des µC näher an die Spannungsversorgung packen. Die 
Stützkapazität ist etwas ungünstig plaziert, besser ganz nah an VCC 
positionieren, die andere Seite dann an der Massefläche.

Bezeichnung Top/Bot fehlt auf dem PCB, woher weist du welche Seite 
welche ist...???

Warum hast du 2 Masseflächen? Auf GND sollte die reichen, die 
Signalleitungen dann darüber führen, möglichst unterbreichungsfrei 
darunter die Plane ausführen. Ist gut für HF...

Die Stege der Massefläche definitiv noch entfernen, die wirken wie 
Antennen, das beeinträchtigt die Schaltung eventuell einwenig.

von Schlangenmensch (Gast)


Lesenswert?

Hi Lars,

sieht recht vielversprechend aus - die süßeste Schlange von allen ist 
die dürre rote gleich rechts neben dem Display ;-)
http://files.x-scripter.com/~lars/IMG_20140822_014634_554.jpg

Zur Sache kann ich jetzt in der Früh nicht viel sagen, weil ich das 
alles erst in Ruhe durchlesen müsste.

Apropos Bilder:
ich würde Dir empfehlen, die Bilder NICHT extern bei einem Filehoster 
einzulagern, weil der natürlich wie immer übermorgen pleite und dann der 
Thread kaum noch nachvollziehbar ist, weil ja alle Bilder und 
Schaltpläne etc. futsch sind.

Häng die Bilder stattdessen bitte lieber hier mit rein, dann bleibt die 
Sache auch in Zukunft nachvollziehbar. Wenn Du dabei auch noch die 
Bildformate beachtest, dann bleiben die Ladezeiten und der 
Speicherplatzbedarf angenehm - bei jpgs ist die Convenience-Grenze hier 
im Forum bei etwa 1 MB, es sei denn, aus Gründen der Darstellung wäre 
einfach mal mehr nötig.
(Ich schreibe das nur, um Dich vor etwaigem Gegrummel des einen oder 
anderen Misanthropen zu bewahren ;-)

Das Projekt ist IMHO richtig nett :-)

von Lars M. (desmulator)


Lesenswert?

Schlangenmensch schrieb:
> Apropos Bilder:
> ich würde Dir empfehlen, die Bilder NICHT extern bei einem Filehoster
> einzulagern, weil der natürlich wie immer übermorgen pleite und dann der
> Thread kaum noch nachvollziehbar ist, weil ja alle Bilder und
> Schaltpläne etc. futsch sind.

Das ist kein Problem, die Bilder liegen auf meinem privaten Server und 
sind so lange sicher, wie ich nicht pleite bin. xD

Jimbo36 schrieb:
> Hallo,
>
> ich kann nur grad was zu PCB-Layout sagen. Zunächst würde ich die
> Position des µC näher an die Spannungsversorgung packen. Die
> Stützkapazität ist etwas ungünstig plaziert, besser ganz nah an VCC
> positionieren, die andere Seite dann an der Massefläche.
µC näher ran, alles klar. Mit Stützkapazität meinst du jetzt C1 am 
Spannungswandler oder C13 am VCC vom µC.

Jimbo36 schrieb:
> Bezeichnung Top/Bot fehlt auf dem PCB, woher weist du welche Seite
> welche ist...???
Momentan ist die Platine noch in EAGLE drin. Die Farben habe ich einfach 
drin, Blau - Bottom,  rot - top. Sicher fehlen die Bezeichnungen später 
beim ausdrucken, aber davon bin ich noch weit entfernt.


Jimbo36 schrieb:
> Warum hast du 2 Masseflächen? Auf GND sollte die reichen, die
> Signalleitungen dann darüber führen, möglichst unterbreichungsfrei
> darunter die Plane ausführen. Ist gut für HF...

Die Idee mit den beidseitigen Masseflächen habe ich aus diesem 
Videotutorial für EAGLE:
https://www.youtube.com/watch?v=YoVen9os4Sk
(wohl wirlich nur ein EAGLE-Tutorial)

Wenn ich deine Antwort richtig verstehe, reicht eine Massefläche aus?
Auf der anderen Seite dann per Leiterbahnen mit dieser Massefläche 
verbinden? Am liebsten währe mir eh, dass sich alles auf einer Seite 
abspielen würde, aber ich glaube der Graph ist nicht planar. :/

Jimbo36 schrieb:
> Die Stege der Massefläche definitiv noch entfernen, die wirken wie
> Antennen, das beeinträchtigt die Schaltung eventuell einwenig.
Erahnter Kritikpunkt, wird auf jeden Fall korrigiert.

von Lars M. (desmulator)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe nochmal versucht die oben genannte Kritik an meinem 
Platinenlayout umzusetzen. Diesmal mit nur einer Massefläche und den µC 
nähre an die Spannungsquelle herran.
Ergebnis ist angehängt oder hier: 
http://files.x-scripter.com/~lars/snake/platine_2.png

Höffentlich interessieren sich noch ein paar mehr Leute für das Projekt, 
bzw. könnten mir Tipps zum Quellcode geben, wurde ja schon 8 mal 
kommentarlos runter geladen :(


Na dann noch einen guten Start in die Woche.

von Unbekannt (Gast)


Lesenswert?

Hi,

ich hätte noch ein paar Verbessungsvorschläge/Kritikpunkte zur Platine.
1)
Warum ist die AVR ISP-Buchse so weit wie es nur geht vom AVR weg??
Setze sie unten in die linke Ecke der Platine, nahe an den Atmega.
Die Leitungen des AVR ISP sollten nie länger als ca. 10cm vom Atmega 
entfernt sein, sonst fängst du dir Störungen ein!

2) Mache auf alle Fälle noch eine Diode in Serie zur Versorgungsleitung 
am Eingang nach Buchse J1 als Verpolungsschutz rein. Der nächste, der 
die Schaltung nachbaut nimmt im schlimmsten Fall ein Steckernetzteil mit 
anderer Polung und schon geht die gesamte Schaltung in Rauch auf...

3) Alle Leiterbahnen (ausgenommen die von der Versorgungsspannung) 
können noch deutlich breiter sein...die sehen mir sehr dünn aus...

von Thomas H. (eagle_layouter)


Lesenswert?

Stimme meinem Vorredner zu.

Eindeutig zu lange Leiterbahnen. Bauteile kann man besser platzieren.
Eine einseitig bestückte Platine ist hier auch möglich.

von andi (Gast)


Lesenswert?

... die ISP-Buchse hätte ich so wie hier:
http://www.mikrocontroller.net/articles/AVR_In_System_Programmer#Pinbelegung

beschaltet.

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.