Digitala projekt – Tetris

Lukasz Serafin

d02ls@student.lth.se

Grupp 9

2006-12-04

Abstract

The goal of this project was to implement the game Tetris using an AVR 8-bit microcontroller and a 64x128 LCD-display. Five buttons were used to control the game. The software was written in the C programming language. The final result is a well-functioning Tetris game.

Innehåll

1 Inledning	4
2 Hårdvara	4
	2.1 Enchipsdatorn ATmega16	4
	2.2 64x128 Batron LCD-skärm	4
	2.3 Fem knappar	4
3 Mjukvara	4
	3.1 tetris.c	5
	3.2 map.c	5
	3.3 block.c	5
	3.4 graphics.c	5
	3.5 lcd.c	5
4 Genomförande	5
5 Resultat och reflektioner	6
A Kravspecifikation	7
B Kopplingsschema	7

1 Inledning

I detta projekt skulle jag bygga en konstruktion som erbjöd spelet Tetris. Under projektets gång har kravspecifikation skrivits, kopplingsschema ritats, komponenter valts ut och kopplats samman och mjukvara skrivits.

Tetris är ett spel där olika sorters block faller från ovan. Innan blocken är nere, så kan spelaren flytta dem åt vänster eller höger samt rotera dem. Om några av blocken som har fallit bildar en vågrät rad, så försvinner raden och alla block ovanför faller ett steg nedåt. Spelaren får poäng för detta.

I den version av spelet som jag implementerade så finns även en titelskärm. Där syns den högsta poäng som något har fått. Poängen kan raderas.

2 Hårdvara

Systemet byggdes kring enchipsdatorn ATmega16. En LCD-display och fem knappar fungerar som användargränssnitt. För kopplingsschema, se appendix B.

2.1 Enchipsdatorn ATmega16

Denna enchipsdator innehåller en 8 bitars processor på 8 MHz. Här finns även tre sorters minnen. Koden lagras i flashminnet som är på 16 kB. Arbetsminnet är 1 kB SRAM. Slutligen finns 512 B EEPROM, som jag använder till att spara den högsta poängen. En annan sak hos ATmega16 som jag använder är en inbyggd 8 bitars timer. Spelet använder denna till att initiera slumptalsgeneratorn.

2.2 64x128 Batron LCD-skärm

LCD-skärmen består av 64x128 pixlar. Man skickar antingen instruktioner eller data till skärmen. Skärmen tar emot informationen när signalen E går från 1 till 0. När jag ska skriva till skärmen så talar jag först om y-koordinaten, sedan x-koordinaten och slutligen pixelinformationen. En sak som gör det lite svårare är att man inte direkt kan sätta på eller av en enskild pixel, utan man skickar 8 pixlar åt gången. En annan sak som bör talas om är att skärmen egentligen består av två delskärmar på 64x64 pixlar. Signalerna CS1 och CS2 används till att välja vilken delskärm man ska tala med.

2.3 Fem knappar

Fyra av knapparna används till att styra de fallande blocken, och den femte knappen används till att växla mellan spelskärm och titelskärm. Ett av varje knapps ben är kopplat till ett av enchipsdatorns I/O-portar, medan ett annat ben är kopplat till jord.

3 Mjukvara

Programmet består av fem c-filer. Alla dessa filer har en tillhörande h-fil. Dessutom finns h-filen button.h där det finns kod för att se om en knapp är nedtryckt.

3.1 tetris.c

Denna fil innehåller main-metoden. Det första som görs är att timern sätts igång och I/O-portarna konfigureras. Därefter läses den sparade poängen in från EEPROM och titelskärmen ritas.

I denna fil finns också spelets huvudloop. Precis innan programmet kommer in i denna loop så skapas ett rutnät (funktionen new_map i map.c) och ett block (funktionen new_block i block.c). I själva loopen så anropas hela tiden funktionen action i block.c, som hanterar blockets uppförande. Om ett block har fallit klart, så returnerar denna funktion en nolla. Huvudloopen anropar då funktionen destroy_horizontal_lines i map.c, som kollar om det finns en vågrät rad och i så fall raderar den. I huvudloopen skapas därefter ett nytt block.

3.2 map.c

Här hanteras ett rutnät på 8x14 rutor. Varje ruta kan vara tom eller innehålla en kvadrat. Alla block som har fallit klart kopieras till rutnätet (detta sker i funktionen to_map i block.c).

3.3 block.c

Här finns olika funktioner som hanterar ett block, t ex roterar det. Själva blocket representeras av en 4x4 matris. En etta i matrisen innebär att här finns ett delblock, medan en nolla innebär att det inte finns något här.

3.4 graphics.c

Här finns funktioner för att rita linjer, kvadrater samt skriva text och tal. Allt detta sker med hjälp av funktionerna i lcd.c.

3.5 lcd.c

Funktionerna i denna fil hanterar LCD-skärmen.

4 Genomförande

Jag började med att skriva en kravspecifikation (se appendix A) och rita ett kopplingsschema (se appendix B). Därefter fick jag min verktygslåda. Komponenterna sattes fast på kopplingsplattan och kopplades samman med trådar. För att trådarna skulle sitta fast på komponenterna, så användes lödning och virning.

Spelet Tetris skrevs först för PC. På så sätt behövde jag till en början inte bry mig om LCD-skärmen. Programmeringsspråket som användes var C. Därefter portades mjukvaran till min hårdvara. En del tid fick läggas på att få LCD-skärmen att fungera. Spelet fungerade, men gick långsamt. Programmet ändrades därför från att tidigare hela tiden ha ritat om hela skärmen, till att enbart rita om de delar som ändrats. Nu gick det mycket snabbare. En annan sak som jag fick göra var att implementera funktioner för att skriva bokstäver och siffror på skärmen.

5 Resultat och reflektioner

Konstruktionen fungerar enligt kravspecifikationen, förutom det att kravet att en lysdiod ska lysa inte har implementerats. Detta beror på att jag tog bort kravet, eftersom det så småningom verkade ganska onödigt.

Spelet fungerar i stort sett utmärkt. Ett litet problem är dock att någon enstaka gång händer det att någon pixel inte raderas från skärmen när den ska det. Tydligen så lyssnar inte skärmen alltid på de instruktioner den får – möjligen för att den är upptagen. Jag har försökt lösa problemet, men inte lyckats helt och hållet.

Det har varit oerhört kul att syssla med detta projekt. Att koppla samman hårdvara och skriva mjukvara är helt olika saker, och ger därför variation. Detta är en kurs som jag varmt rekommenderar.

A Kravspecifikation

•	Konstruktionen ska erbjuda spelet Tetris
•	Enchipsdatorn ATmega16 ska användas
•	Grafiken ska visas på en 64x128 Batron LCD-skärm
•	Styrningen ska ske med hjälp av en knappsats, eller möjligen en TAC-2-joystick
•	Den högsta poäng någon har fått ska sparas
•	Man ska kunna radera poängen
•	En lysdiod ska lysa när spelet är på

B Kopplingsschema