SIMON SAYS Projekt i EITF11 Digitala Projekt

Relevanta dokument
LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Växtviskaren EITF11 Digitala projekt VT15, I12

Digitala Projekt(EITF40) - Larm

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

Projektrapport Målgång

The Phenomenal Doorbell Bilaga 2. Källkod

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

Digitala Projekt (EITF11) Hemlarm

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

DIGITALA PROJEKT (EITF40) Fartmätare

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Digitala Projekt(EITF40) - Larm

The Intelligent Timer

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

TEMPERATURMÄTARE MED GRAFRITARE

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

Rapportsammanfattning. Optima Sous Vide

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Bilen som inte kan krocka

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Rörelse- och temperaturkänsligt larmsystem

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Projektrapport - Roterande digital LED-klocka

Digitala projekt Linjeföljande bil

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

Pulsmätare med varningsindikatorer

Projektrapport - Feststation

Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

DIGITALA PROJEKT - EITF11

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

Whac A mole. Ett rektionstest i kursen Digitala Projekt EITF11 utfört av: Axel Spångberg I10 Marcus Witting I10. Handlett av: Bertil Lindvall

Thunder s Truck projektrapport

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

High Core Remote Car X8000 Cool

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

Pulsmätare Digitala Projekt EITF11

Digitala Projekt (EITF11)

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

Digitala Projekt (EITF11) Larmanläggning

Helena Harrysson och Linnéa Wickberg

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Effektpedal för elgitarr

Projektrapport i Digitala System

EITF11: Bandkanon Grp 05

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Digitala projekt VT Myran

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

THE VISUAL EGGTIMER. Skola: Lunds Tekniska Högskola Institution: Elektro- och informationsteknik Kurs: Digitala projekt (EITF11)

EITF11 - Digitala Projekt

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Digitala Projekt VT13. PING-Pong

DIGITALA PROJEKT Väderstation

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Digitalt Projekt: Radiostyrd Bil

Datorteknik 2 (AVR 2)

Projektrapport Digitala System

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Aml Abbas, Ali Darwish, Ehsanolah Hafezi, Fatima Zahra Doussi Grupp 15

Projektrapport - RoboWalter

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Datorteknik 1 (AVR 1)

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

Programmera i teknik - kreativa projekt med Arduino

Jan Babor och Oscar Ågren Handledare: Bertil Lindvall 5/16/2011

Innehåll. 1 Inledning 3

AVR 5. Styrning av trafikljus. Digitala system 15 p

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

Projektrapport i Digitala projekt EITF11. Institutionen för Elektro- och informationsteknik, Lunds tekniska högskola

Snake! !!!!!!!!!!!!!!!!!!!!

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Kontrollskrivning Mikrodatorteknik CDT S2-704

Digitala projekt - Radiostyrd bil

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

Digitala Projekt, EITF40

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

Guitar Tuner EITF11 Digitala Projekt, Projektrapport Elektro- och informationsteknik

Projekt Digitala system. Rörelsekänsligt Larmsystem

Department of Information Technology Digitala Projekt Frysboxregulator. 10 december 2007

Transkript:

SIMON SAYS Projekt i EITF11 Digitala Projekt Oskar Strömberg I13 & Olof Svanemur I13 Lunds Tekniska Högskola Institutionen för elektro- och informationsteknik Handledare: Bertil Lindvall

Sammanfattning Rapporten beskriver genomförandet av ett projekt i kursen digitala projekt på LTH. Projektet består av monteringen och programmeringen av ett spel Simon Says. Spelet går ut på att memorera ordningen i vilken fyra dioder har blinkat, för att sedan upprepa denna ordning i knapptryckningar. Rapporten beskriver vilken hårdvara som använts, samt den övergripande arbetsprocessen under monteringen av komponenterna och kodningen av mjukvaran. Rapporten innehåller även ett kopplingsschema och källkod i bilagor samt de lärdomar gruppen dragit av projektet. 1

Innehållsförteckning Sammanfattning... 1 Innehållsförteckning... 2 1. Inledning... 3 1.1 Bakgrund... 3 1.2 Problemformulering... 3 2. Kravspecifikation... 3 2.1 Funktionella krav... 3 2.2 Kvalitetskrav... 3 3. Hårdvara... 4 3.1 Processor... 4 3.2 Display... 4 3.3 Dioder... 4 3.4 Knappar... 4 3.5 OR-grind... 4 4. Mjukvara... 4 5. Genomförande... 5 5.1 Planering... 5 5.2 Montering... 5 5.3 Programmering... 5 5.4 Motgångar... 6 6. Diskussion och slutsats... 6 6.1 Lärdomar... 6 Bilagor... 7 Bilaga 1 - Kopplingsschema... 7 Bilaga 2 - Källkod... 7 2

1. Inledning 1.1 Bakgrund Efter viss eftertanke valde gruppen att göra ett Simon Says spel, ett spel där dioder lyser i en viss kombination och spelaren skall trycka ner knappar i den ordningen dioderna lös. Efter konsultation med handledare fastslogs en lämplig svårighetsgrad på projektet och genomförandet inleddes. 1.2 Problemformulering Projektet skall skapa ett mindre spel där lysdioder lyser i en slumpmässig kombination och efter dioderna lyst skall spelaren trycka ner knapparna i den ordningen dioderna lös. Om spelaren trycker ner fel knapp förlorar spelaren och då skall dioderna blinka rött. För att starta upp ett nytt spel ska spelaren kunna trycka på en knapp brevid displayen och när väl ett nytt spel inletts står det skrivet på skärmen vilken nivå spelet är på. För varje omgång spelaren klarar ökar antalet dioder som lyser med ett och snabbt blir spelet förvånansvärt svårt. Om man slår det tidigare rekordet, räknat som högsta påbörjade nivån, ska det nya rekordet synas på displayen. 2. Kravspecifikation Kravspecifikationen ställdes upp innan projektet påbörjades för att utgöra ett ramverk för hur stort projektet skulle vara. Den har sedan anpassats under projektets gång när nya val har gjorts. 2.1 Funktionella krav Systemet ska ha en alfanumerisk display. Displayen visar nuvarande nivå, högsta rekordet samt en meny. Systemet ska ha en meny-knapp som antingen startar spelet eller går tillbaka till menyn beroende på om spelet är igång eller ej. Systemet ska ha fyra dioder. Varje diod har en motsvarande knapp. 2.2 Kvalitetskrav Spelet ska fungera enligt följande: Vid nivå 1 ska 2 blinkningar memoreras av spelaren. Antalet blinkningar ökar med 1 för varje avklarad nivå. Dioderna blinkar i slumpmässig ordning i början av varje nivå. 3

Spelaren ska upprepa ordningen genom att trycka ner respektive diods knapp i samma ordning som dioderna blinkade. Dioderna ska blinka med ett lämpligt tidsintervall. 3. Hårdvara I bilaga 1 finns ett kopplingsschema som beskriver hur komponenterna har kopplats. 3.1 Processor Processorn som användes är av modellen ATmega16 som har sammanlagt 40 stycken pinnar. Fyra av dessa är reserverade för koppling till JTAG. Processorn är kompatibel med JTAG och har även ett EEPROM minne där information kan lagras. 3.2 Display En SHARP Dot-Matrix eller Alfanumerisk teckendisplay användes i projektet för att skriva ut tecken och information til spelaren. 3.3 Dioder Fyra stycken dioder användes som kunde lysa med färgerna rött, grönt, blått eller vitt. Där vitt innebär att rött, blått och grönt lyser samtidigt. 3.4 Knappar I projektet användes 4 stycken större röda knappar för att spelaren enkelt skulle kunna ange vilken av de fyra dioderna som blinkat. En mindre grå knapp användes för att spelaren skulle kunna starta ett nytt spel och avbryta ett pågående spel. 3.5 OR-grind För att hantera knapptrycken användes OR-grindar för att notera när en knapp trycktes ned, som initierar en interrupt i mjukvaran. 4. Mjukvara Programmeringen av spelet gjordes i programmeringsspråket C, drivet av programmet Atmel Studio 6.2. Detta program användes för att kunna utföra debug av koden och tillsammans med JTAG se vad som skedde i hårdvaran. JTAG användes för att ladda över koden till processorn och även exekvera den, detta möjliggjorde felsökningar och stegvisa tester. 4

Koden består av flertalet metoder för att utföra blinkningar av de olika dioderna i olika färger samt diverse kombinationer av blinkningar. Det finns även hantering av det pågående spelet, knapptryckningar och skärmen. Koden i sin helhet finns i bilaga 2. 5. Genomförande 5.1 Planering I projektets förstadie krävdes en planering för att avgöra vad som skulle göras. Val av projekt funderades över under flera veckor för att slutligen falla på detta spel lagom till att projektet skulle starta. För att sedan skapa en stadig bas att utgå ifrån gjordes en kravspecifikation som beskrev systemet, en lista över de komponenter som skulle användas samt en ritning över hur de skulle kopplas. 5.2 Montering Under monteringen skapades först en approximativ bild av var samtliga komponenter skulle placeras för att spelet skulle bli praktiskt att spela och samtidigt se estetiskt bra ut. När det fastslagits var alla komponenter skulle sitta lödades de viktigaste komponenterna fast. Sedan lödades stift fast på plattan och dessa kopplades senare under projektet till jord eller spänning för att på så sätt underlätta tråddragningen. Stiften användes även som knytpunkter i de fall när flera komponenter behövde kopplas samman. Monteringen fortsatte med att koppla in dioderna och tillhörande resistorer för att försöka få dessa att fungera. Sedan kopplades knapparna in och den tillhörande logiken till knapparna trådades till processorn. Parallellt med inkopplingen av dioderna programmerades flera av de kombinationer som dioderna skulle kunna blinka i. Slutligen kopplades display ihop med processorn, när det framstod som att alla trådar var korrekt dragna påbörjades programmeringen av displayen. 5.3 Programmering Programmeringen var en successiv process av lärande hur C-programmering och processorn fungerade. Den första metoden blev framslumpningen av vilken ordning dioderna skulle lysa, vilket kunde ha sparats till senare eftersom att metoden inte kunde testas med dioderna. Därefter programmerades metoder för att blinka dioderna i olika färger och i olika ordningar. Detta var ett viktigt steg för att det möjliggjorde test som visade att dioderna fungerade. Även metoder för knapphantering skapades och varje knapp fick output i form av att motsvarande diod blinkade för att visa att trycket hade registrerats. Detta följdes av koden för att hantera spelet, hantera displayen och till sist att spara det högsta rekordet på processorns långa minne. 5

5.4 Motgångar Under monteringen av komponenten behövdes den ursprungliga ritningen omformas flera gånger allt eftersom ändringar genomfördes. Den största motgången under monteringen var när gruppen konstaterade att med de dåvarande komponenterna behövdes fler pinnar på processorn än vad fanns tillgängligt. Efter konsultation med handledare byttes displayen ut till en alfanumeriska teckendisplay, vilket krävde åtskillig omdragning av trådar. Under projektets gång stötte gruppen på fler motgångar. Bland annat körde projektet fast upprepade gånger och felsökningen kunde vara en omfattande process, då det ibland var svårt att identifiera vad som var problemet, kodens syntax eller logiken i koden. Det största problemet under kodningen var programmeringen av den alfanumeriska teckendisplayen, då behövde displayen ställas in på att ta emot 4 bitar åt gången istället för 8 bitar åt gången. Det tog en tid innan den alfanumeriska teckendisplayen började fungera och skriva ut de bokstäver som skulle skrivas ut. Till stor del berodde detta på ett missförstånd i hur kommandon till displayen skulle exekveras, men efter extra läsning i databladet löstes detta. 6. Diskussion och slutsats Under projektets gång har gruppen fått ett helhetstänk kring hur man kan bygga upp ett fungerande spel från ide till slutprodukt. Det har varit mycket lärorikt att arbeta metodiskt med elektroniska komponenter och få en liten bild av hur man kan bygga en prototyp. Gruppen känner sig nöjd med spelet och tycker att det fungerar som förväntat. 6.1 Lärdomar Det är väldigt viktigt att ha en klar och tydlig kommunikation, både inom gruppen och med handledaren, eftersom att det är lätt att man missförstår varandra. Missförstår man varandra kan det leda till att man får komponenter som inte är lämpliga i sammanhanget. Exempelvis kunde inte den första displayen skicka 4 bitar åt gången, vilket vårt projekt krävde för att antalet pinnar på processorn ej skulle ta slut. Hade gruppen varit tydligare i kommunikationen kring vad projektet skulle åstadkomma hade detta problemet kunnat undvikas. Den andra lärdomen är att man bör läsa instruktioner (databladen) väldigt noga och göra exakt som de säger. Det går inte att på ett ungefär följa instruktioner i databladen. Avslutningsvis bör man vara väldigt metodisk under genomförandet av arbetet för att på så sätt sakteligen utesluta felkällor. Det som framförallt tar tid och energi under arbetet är när man kör helt fast och inte vet vad som är fel. Om man kontinuerligt konstaterar vilka delar av komponenter som fungerar och vilken del av koden som fungerar kan man underlätta felsökningen markant. Under projektet försökte gruppen applicera denna principen och kunde på så sätt helt utesluta fel under monteringen och därav fokusera på vad som kunde potentiellt vara fel i programmeringen. Extra glad blir man när komponeneterna plötsligt fungerar efter lunchen. 6

Bilagor Bilaga 1 - Kopplingsschema Bilaga 2 - Källkod /* * Kod_0.c * * Created: 2016-04-05 09:22:33 * Author: Oskar Strömberg & Olof Svanemur */ #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/eeprom.h> //Permament datalagring 7

uint8_t highscore = 1; #define HIGHSCORE_ADDRESS 0x00 //Temporär datalagring int ordernbr = 0; int level = 0; int ordersize = 1; int order[100]; char success = 1; //Program char gamerunning = 0; int click = 0; int buttonclicks = 0; void SetEHigh(){ PORTC = PORTC 0b01000000; void SetELow(){ PORTC = PORTC & 0b10111111; void SetRSHigh(){ PORTC = PORTC 0b00000001; void SetRSLow(){ PORTC = PORTC & 0b11111110; void SetRWHigh(){ PORTC = PORTC 0b00000010; void SetRWLow(){ PORTC = PORTC & 0b11111101; void SetAllHigh(){ SetEHigh(); SetRSHigh(); SetRWHigh(); void SetAllLow(){ SetELow(); SetRSLow(); SetRWLow(); 8

//Set up för displayen void SetUpDisplay(){ char c = 0b00000010; _delay_ms(15); ExecuteCmd(c); c = 0b00101000; //0b00101000 _delay_ms(5); ExecuteCmd(c); //Tömmer skärmen void ClearDisplay(){ ExecuteCmd(0b00000001); _delay_ms(5); _delay_ms(5); //Startar skärmen, går till första menyn med visat start av spel och nuvarande rekord void StartDisplay(){ char c = 0b00001111; ExecuteCmd(c); ClearDisplay(); //Stänger av skärmen void StopDisplay(){ ClearDisplay(); ExecuteCmd(0b00001000); //Skicka in kommando som ska utföras void ExecuteCmd(char c){ char c1 = (PORTB & 0xF0) ((c>>4)&0x0f); //Övre fyra bitarna WriteCmd(c1); char c2 = (PORTB & 0xF0) (c&0x0f); //Nedre fyra bitarna WriteCmd(c2); //Skriv kommando för att ställa in displayen. void WriteCmd(char c){ SetRSHigh(); SetRWHigh(); SetELow(); _delay_ms(1); SetRSLow(); SetRWLow(); 9

_delay_ms(1); SetEHigh(); _delay_ms(1); PORTB = c; SetELow(); _delay_ms(1); SetRSHigh(); SetRWHigh(); _delay_ms(1); SetEHigh(); //Skriv data till RAM, för att skriva på displayen. void WriteRam(char c){ SetAllHigh(); PORTB = c; SetRWLow(); _delay_ms(1); SetELow(); _delay_ms(1); SetEHigh(); SetAllHigh(); //Skriv tecken på displayen. void WriteChar(char c){ char c1 = (PORTB & 0xF0) ((c>>4) & 0x0F); WriteRam(c1); char c2 = (PORTB & 0xF0) (c & 0x0F); WriteRam(c2); //Slumpar fram ordningen som dioderna ska blinka samt vilken färg som ska blinka void Randomize() { int place = 0; while(place < level){ order[place] = rand() % 16; place++; void FirstBlueBlink(){ PORTA = 0b00000001; 10

void FirstGreenBlink(){ PORTA = 0b00000010; void FirstRedBlink(){ PORTA = 0b00000100; void FirstWhiteBlink(){ PORTA = 0b00000111; void SecondBlueBlink(){ PORTA = 0b00001000; void SecondGreenBlink(){ PORTA = 0b00010000; void SecondRedBlink(){ PORTA = 0b00100000; void SecondWhiteBlink(){ PORTA = 0b00111000; void ThirdBlueBlink(){ 11

PORTA = 0b01000000; void ThirdGreenBlink(){ PORTA = 0b10000000; void ThirdRedBlink(){ PORTD = 0b01000000; void ThirdWhiteBlink(){ PORTA = 0b11000000; PORTD = 0b01000000; void FourthBlueBlink(){ PORTD = 0b00100000; void FourthGreenBlink(){ PORTB = 0b10000000; void FourthRedBlink(){ PORTB = 0b01000000; 12

void FourthWhiteBlink(){ PORTB = 0b11000000; PORTD = 0b00100000; void AllBlink(){ PORTA = 0b00010001; PORTB = 0b11000000; PORTD = 0b01100000; _delay_ms(100); PORTA = 0b11100010; PORTD = 0b01100000; _delay_ms(100); PORTA = 0b01111100; PORTB = 0b10000000; _delay_ms(100); PORTA = 0b10001111; PORTB = 0b01000000; _delay_ms(100); void AllBlueBlink(){ PORTA = 0b01001001; PORTD = 0b00100000; 13

_delay_ms(100); void AllGreenBlink(){ PORTA = 0b10010010; PORTB = 0b10000000; _delay_ms(100); void AllRedBlink(){ PORTA = 0b00100100; PORTB = 0b01000000; PORTD = 0b01000000; _delay_ms(100); //Blinkar alla dioder vitt en gång void AllWhiteBlink(){ PORTA = 0b11111111; PORTB = 0b11000000; PORTD = 0b01100000; _delay_ms(100); //Blinkar motsvarande diod grönt en gång void GreenBlink(int button){ switch(button){ case 0: FirstGreenBlink(); case 1: SecondGreenBlink(); 14

case 2: ThirdGreenBlink(); case 3: FourthGreenBlink(); case 4: AllGreenBlink(); //Blinkar motsvarande diod rött en gång void RedBlink(int button){ switch(button){ case 0: FirstRedBlink(); case 1: SecondRedBlink(); case 2: ThirdRedBlink(); case 3: FourthRedBlink(); case 4: AllRedBlink(); //5 röda blinkningar med alla dioder vid förlust void LoseBlink(){ int i = 0; while(i < 5){ AllRedBlink(); i++; //5 gröna blinkningar med alla dioder vid vunnen nivå void WinBlink(){ 15

int i = 0; while(i < 5){ AllGreenBlink(); i++; //Blinkar den framslumpade sekvensen void BlinkSequence(){ int i = 0; ordernbr = 0; while(i < ordersize){ i++; switch(order[ordernbr]){ case 0: FirstBlueBlink(); case 1: FirstGreenBlink(); case 2: FirstRedBlink(); case 3: FirstWhiteBlink(); case 4: SecondBlueBlink(); case 5: SecondGreenBlink(); case 6: SecondRedBlink(); case 7: SecondWhiteBlink(); case 8: ThirdBlueBlink(); 16

case 9: ThirdGreenBlink(); case 10: ThirdRedBlink(); case 11: ThirdWhiteBlink(); case 12: FourthBlueBlink(); case 13: FourthGreenBlink(); case 14: FourthRedBlink(); case 15: FourthWhiteBlink(); ordernbr++; //Jämför tryckt knapp med vilken diod som lystes upp på nuvarande plats. void ButtonCompare(int button){ buttonclicks++; int diodnbr = order[ordernbr] / 4; if(button!= diodnbr){ RedBlink(button); success = 0; LoseBlink(); else { GreenBlink(button); ordernbr++; //Nollställer nivån inför nytt spel. void SetUpGame(){ gamerunning = 1; success = 1; 17

ordernbr = 0; ordersize = 1; level = 0; //Loop som väntar medans spelaren trycker på knapparna, avbryter då fel knapp trycks // eller hela sekvensen har tryckts korrekt void CheckButtons(){ ordernbr = 0; buttonclicks = 0; while(success && (buttonclicks <= level)){ _delay_ms(10); //Startar en ny spelomgång void Play(){ SetUpGame(); AllBlink(); while(success){ ordernbr = 0; level++; ordersize++; SetPlayDisplay(); _delay_ms(2000); Randomize(); BlinkSequence(); CheckButtons(); if(success){ WinBlink(); gamerunning = 0; if(level > highscore){ highscore = level; eeprom_write_word((uint8_t*)highscore_address,highscore); level = 0; SetMenuDisplay(); //Går till menyn. void Menu(){ gamerunning = 0; SetMenuDisplay(); //Skriver ut Avsluta 18

void WriteAvsluta(char c){ ClearDisplay(); ExecuteCmd(c); //0b10000001 WriteChar('A'); //A WriteChar('v'); //v WriteChar('s'); //s WriteChar('l'); //l WriteChar('u'); //u WriteChar('t'); //t WriteChar('a'); //a //Skriver ut Start void WriteStart(){ ClearDisplay(); WriteChar('S'); WriteChar('t'); WriteChar('a'); WriteChar('r'); WriteChar('t'); //Skriver ut rekord void WriteHighscore(char k){ ExecuteCmd(k); //0b10000011, 0x94 WriteChar('R'); WriteChar('e'); WriteChar('k'); WriteChar('o'); WriteChar('r'); WriteChar('d'); WriteChar(':'); //Beräkning av ascii för rekord int i = highscore/10; char c; if(i > 0){ char b = 48 + i; WriteChar(b); int rest = highscore%10; c = 48 + rest; else { c = 48+highscore; WriteChar(c); //Skriver ut nivå void WriteLevel(char k){ 19

ExecuteCmd(k); //0b10000001, 0xD4 WriteChar('N'); WriteChar('i'); WriteChar('v'); WriteChar('a'); WriteChar(':'); //Beräkning av ascii för nivå int i = level/10; char c; if(i > 0){ char b = 48 + i; WriteChar(b); int rest = level%10; c = 48 + rest; else { c = 48+level; WriteChar(c); //Visar Display för spelomgång void SetPlayDisplay(){ WriteAvsluta(0x82); WriteHighscore(0x96); WriteLevel(0xD6); //Visar menyns display void SetMenuDisplay(){ WriteStart(); WriteHighscore(0x94); WriteLevel(0xD4); //Sparar highscore på processorns permanenta minne. //Överflödig, ta bort! void SaveHighscore(){ //Sida 20, datablad processor void SetDataDirection(){ DDRA = 0b11111111; DDRB = 0b11001111; DDRC = 0b01000011; DDRD = 0b01100000; int main(void) { 20

SetDataDirection(); SetUpDisplay(); ClearDisplay(); StartDisplay(); PIND = 0b00000000; DDRD = 0b01100000; GICR = 0b01000000; MCUCR = 0b00000011; sei(); highscore = eeprom_read_word((uint8_t*)highscore_address); if (highscore==0xffff){ highscore=0; Menu(); while(1) { ISR(INT0_vect){ if(click == 1){ return; click = 1; cli(); _delay_ms(50); switch(pind){ case 0b00010100: if(gamerunning){ ButtonCompare(0); case 0b00001100: if(gamerunning){ ButtonCompare(1); 21

case 0b00000110: if(gamerunning){ ButtonCompare(2); case 0b00000101: if(gamerunning){ ButtonCompare(3); case 0b10000100: AllBlueBlink(); if(gamerunning){ sei(); click = 0; success = 0; else { sei(); click = 0; Play(); sei(); click = 0; 22