Table of Contents

Introducere

Descriere generală

Schema bloc hardware

Utilizatorul interactioneaza cu microcontroller-ul prin butoane(da comenzi si introduce incercari de combinatii) si prin display (LCD de dimensiune 16×2). - Exista 3 butoane de comanda :

- Exista 6 butoane pentru selectia culorilor.

Schema bloc software

Modulele software sunt interfata de lucru cu lcd-ul si jocul .In cadrul jocului exista 3 functii principale : de selectie a nivelului jocului,de generare combinatie random , de asteptare a inputului utilizatorului , generare raspuns si afisare istoric.

Hardware Design

Pe cele doua placi de extensie exista:

  1. LCD 16×2
  2. 9 butoane(3 de control , 6 de selectie culori)
  1. Placa de baza
  2. Extensiile
  3. Poza placuta

Software Design

In introducere am motivat de ce este necesar un istoric al ultimelor combinatii introduse.De asemenea este nevoie de navigare printre acestea deoarece LCD-ul utilizat nu are decat doua linii pe care le-am folosit in felul urmator: prima linie afiseaza ultima combinatie introdusa , respectiv orice combinatie si rezultat anterior daca se navigheaza cu butoanele UP/DOWN , iar a doua linie este folosita pentru a afisa numarul de incercari ramase si inputul curent.Pentru a retine istoricul am folosit o structura definita astfel :

        /*Structura care retine in istoric incercarile anterioare*/
         typedef struct {
	uint8_t c[4];  // codurile celor 4 culori din combinatie
	uint8_t no1;   // numarul de culori ghicite pe pozitia corecta
	uint8_t no2;   // numarul de culori ghicite pe pozitia incorecta
        } TGuess;

.

Functii auxiliare :

  1. gameLevel() → seteaza nivelul de dificultate al jocului (din 3 nivele posibile , caracterizate printr-un numar maxim de incercari permise).Primeste input de la butoanele de comanda.
  2. printLevel() →afiseaza nivelul curent al jocului pe parcursul selectiei.
  3. randomGuess(int randomize) genereaza o combinatie random , folosind o valoare calculata pe baza timerului ( care retine milisecundele scurse de la inceputul jocului ).
  4. fillLine1(TGuess *guess,int8_t index) → pregateste continutul primei linii afisate in timpul jocului;Acesta reprezita un mesaj de intampinare - daca jocatorul este la prima incercare,ultima incercare,sau o incercare mai veche din istoric (daca se navigeaza cu butoanele up,down).
  5. verifyGuess(TGuess *guess,uint8_t index) → verifica incercarea curenta a jucatorului (guess[index]) si calculeaza cate culori au fost ghice pe pozitia corecta si cate ghicite in pozitia incorecta.Functia intoarce 1 daca a fost ghicita combinatia toGuess.
  6. wait_enter() → asteapta apasarea tastei ENTER pentru start joc .
  7. playGame() → jocul
void playGame(){
	//Alege o combinatie random care trebuie ghicita
	randomGuess();
	//Seteaza numarul de incercari in functie de nivelul ales la o constanta predefinita
	switch(nivel){
		case 1:
			noTrys = BEGGINER;
		case 2:
			noTrys = EASY;
		case 3:
			noTrys = DIFFICULT;
	}
	for ( i = 0 ; i < noTrys ; i++){	//pentru fiecare incercare permisa			
		LINE1 = actualizare_linie_1   // linie ce contine ultima incercare 
                LINE1 = actualizare_linie_2   //linie ce contine numai  numarul de incercari ramase
		LCD_print_guesses();          //reafiseaza
		for ( j = 0 ; j < 4 ; j++) {	//pentru fiecare culoare din cele 4 ghicite
			while(1){					//se asteapta pana la introducerea unei culori
				if (este apasat butonul UP){ 
					if ( historyIndex > 0){ // daca nu este prima comanda deja afisata in istoric
						historyIndex--;
						fillLine1(guess,historyIndex); // actualizeaza
						LCD_print_guesses(); //reafiseaza
					}
				}
				if (este apasat butonul DOWN){ // daca nu este ultima comanda deja afisata in istoric
					if ( historyIndex < i-1){
						historyIndex++;
						fillLine1(guess,historyIndex);// actualizeaza
						LCD_print_guesses();//reafiseaza
					}
				}
				if (este apasat butonul ALB){
					LINIA2[j+2] = 'A'; //adauga la incercarea curenta si culoarea nou introdusa
					guess[i].c[j] = 'A'; //adauga in istoric culoarea nou introdusa
					LCD_print_guesses(); //reafiseaza
					break;
				}
                                if (este apasat butonul NEGRU){...}
                                if (este apasat butonul ROSU){...}
                                if (este apasat butonul GALBEN){...}
                                if (este apasat butonul VERDE){...}
                                if (este apasat butonul BLEU){...}
                                }
		}//end for fiecare culoare din incercare
		if (verifyGuess()){	//a ghicit->sfarsit joc
			LCD_print("SUCCESS!");
			return;
		}
	}
	//se ajunge aici in caz de insucces
	LCD_print2("GAME OVER!",toGuess);
}

Rezultate Obţinute

Implementarea software a fost testata pe simulare(simulare.zip) si realizeaza toate functionalitatile specificate la alegerea temei de proiect.

Concluzii

In implementarea hardware am intampinat multe probleme din cauza lipsei de experienta si aceasta etapa a fost finalizata ultima. Din acest punct ce vedere am avut sansa sa am un proiect la care a fost posibil sa fac o simulare si sa testez programul pe aceasta ,proiectul fiind mai complicat software decat hardware.Fisierul cu simularea este inclus in arhiva cu sursele.

O nemultumire este estetica placutei din cauza firelor de legatura , dar am fost nevoita sa le folosesc deoarece utilizez multi din pinii microcontrollerului si spatiul a fost o problema.

Download

mastermind_final.zip

Bibliografie/Resurse

http://winavr.scienceprog.com/avr-gcc-tutorial/accessing-avr-microcontroller-ports-with-winavr-gcc.html