Introducere

Proiectul meu consta in jocul clasic de X si 0, realizat pe o placuta ATMega16, folosind ca display un LCD de nokia 3310.

Se poate juca in unul sau doi jucatori si reprezinta o metoda foarte buna de antrenament pt acest joc dificil.

Descriere generală

Hardware Design

Lista de piese:

  • Ecran LCD Nokia 3310
  • 5 rezistente 3.3K
  • 5 rezistente 1.8K
  • 2 diode 1N4007
  • 1 condensator 10uF
  • 5 butoane

Simulare Proteus:

In afara de cele ce se pot vedea pe simularea Proteus, trebuie puse 2 diode intre pinul VCC al ATMega16 si pinul VDD al LCD-ului astfel incat tenisunea pe LCD sa fie ~3.3V

Pentru pinii RES, SCE, D/C, SDIN si SCLK trebuie realizat un divizor de tensiune astfel incat tensiunea pe acei pini sa fie ~3.3 V. Divizorul de tensiune se realizeaza punand o rezistenta de 1.8 K intre un pin al ATMega16 si unul al LCD-ului si o rezistenta de 3.3K intre pinul LCD-ului si masa.

Software Design

Mediu de dezvoltare: AVR Studio

Driver folosit: http://www.quantumtorque.com/content/view/32/37/

Pentru jocul de X si 0 voi implementa algoritmul minimax.

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi

Functii LCD:

  • void LCD_init(void) initializeaza lcd
  • void LCD_str( char* str,uint8_t sel) printeaza string pe ecran (selectat sau neselectat)
  • void LCD_clear(void) sterge ecran
  • void LCD_gotoXY(uint8_t x, uint8_t y) salt la linia y coloana x
  • int LCD_chr(char chr, uint8_t sel) printeaza caracter (selectat sau neselectat)
  • void LCD_contrast(unsigned char contrast) seteaza contrast

Functii joc:

  • static void ADC_init(void) intialzieaza ADC
  • static int ADC_get(uint8_t channel) citeste o valoare de pe canalul dat ca parametru
  • static void init_seed() initializeaza seedul pentru numere random cu o valoare citita prin ADC de pe un pin lasat in aer
  • static inline int evaluate(char player) evalueaza daca a castigat jucatorul player
  • static inline int canWin(int last) evalueaza daca mai poate castiga cineva
  • static int8_t minimax_x(char player,char opp,uint8_t depth) realizeaza minimax pe nivelurile 2-9 in arbore, intoarce scorul mutarii
  • static inline uint8_t minimax_0(char player,char opp,uint8_t depth) realizeaza minimax pe primul nivel din arbore, intoarce cea mai buna mutare
  • static inline void printBoard() afiseaza tabla de joc si un mesaj
  • static int getKeyPres() citeste apasarea tastelor
  • static void play() logica jocului de x si 0

Rezultate Obţinute

Am avut cateva probleme la lipirea LCD-ului deoarece pinii sunt foarte apropiati si trebuie avuta foarte multa grija sa nu apara scurt-circuite. Intai am incercat sa potrivesc firele, fara a le lipi efectiv. Intrucat erau cativa pini care nu faceau contact, am lipit intai firele din margine (mai solid) si apoi, foarte fin, firele din centru. Pentru mai multa siguranta panglica este fixata si ea.

De asemenea, se pare ca diodele 1N4007 achizitionate nu au UD = 0.7, deoarece voltajul la pinul VDD al LCD-ului era 4.2V. Din aceasta cauza, LCD-ul se oprea brusc dupa cateva zeci de secunde de functionare. Solutia a reprezntato adaugarea altor doua diode.

Placuta aditionala este lipita direct pe pinii A si C ai placii de baza.

Jocul contine un meniu din care utilizatorul isi poate alege modul de joc (1 sau 2 jucatori) si caracterul cu care joaca.

Dupa cum se observa din imaginile de mai sus, sunt identificate situatiile in care niciun jucator nu mai poate castiga. Lipsesc pozele cu mesajul “Am castigat”, deoarece nu am reusit inca sa inving inteligenta artificiala. De asemenea, trebuie mentionat ca oponentul nu realizeaza aceleasi mutari de fiecare data.

Citirea butoanelor se face intr-o bucla blocanta. Intre doua citiri consecutive ale aceluiasi buton exista un anumit timeout.

Download

Bibliografie/Resurse

pm/prj2010/dtudose/xsi0.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0