X si 0

Introducere

Proiectul meu implica realizarea unei implementari hardware si software a jocului X si 0 pe o placuta ATMega16 , folosind ca mijloc de afisare grafica un display de telefon (Nokia 3310) .

Implementarea va permite jocul in 2 persoane sau versus AI .

Descriere generală

In principiu , proiectul ar trebui sa ruleze in felul urmator : un user va folosi butoanele puse la dispozitie pe placuta de extensie pentru a comunica cu LCD-ul . 4 butoane vor fi folosite pentru deplasare pe ecran , iar unul pentru selectare.

Apasarea unui buton va fi observata de ATMega16 , care va procesa si concretiza intr-o afisare corespunzatoare pe LCD.

Hardware Design

Componentele hardware necesare sunt :

- placuta de baza cu un ATMega16 drept unitate de procesare principala

- 1 condensator 10uF legat de la pinul VOUT al LCD-ului

- 5 divizori de tensiune realizati cu cate 2 rezistente(1.8K la pinii ATMega16 si 3.3K la ground)

- 2 diode pentru reducerea voltajului ce vine in LCD la aproximativ 3.3 V

- LCD Nokia 3310

- 5 butoane pentru interactiunea cu LCD-ul

Schema in EAGLE arata in felul urmator :

Software Design

Pentru partea software a proiectului , se va folosi driver-ul pus la dispozitie la [1] pentru LCD-ul de Nokia . Jocul de X si 0 este o aplicatie clasica pentru algoritmul minimax. Mai multe despre algoritm gasiti la [2].

Driverul pus la dispozitie face urmatoarele :

void lcd_init(void);

void lcd_contrast(unsigned char contrast);

void lcd_clear(void);

void lcd_clear_area(unsigned char line, unsigned char startX, unsigned char endX);

void lcd_clear_line(unsigned char line);

void lcd_goto_xy(unsigned char x, unsigned char y);

void lcd_goto_xy_exact(unsigned char x, unsigned char y);

void lcd_chr(char chr);

void lcd_str(char *str);

void lcd_send(unsigned char data, LcdCmdData cd);

Jocul in sine va comunica prin aceste functii rezultatele obtinute in urma evaluarii tablei de catre functia de minimax si va afisa tabla de fiecare data cand se modifica ceva . Un pseudocod pentru negamax(o varianta a minimax) este dat in continuare :

if ( depth == 0 ) 
    return evaluate();
int max = -oo;
for ( all moves) {
    score = -negaMax( depth - 1 );
    if( score > max )
        max = score;
}
return max;

[1] 37

[2] Minimax

Rezultate Obţinute

Am avut o “mica” problema cu LCD-ul . Am vrut sa leg pinii individual prin fire , si dupa cateva ore de aranjat , am reusit sa lipesc si pe placa . Un fir totusi s-a desprins , asa ca incercarea de a-l reatasa a dus la disparitia unui pin de iesire al LCD-ului. Cum timpul nu mi-a mai permis , proiectul s-a oprit aici.

Concluzii

Per total , lucrul la proiect (atat cat a durat) a fost folositor si m-a invatat ce sa nu mai fac pe viitor . Probabil era mai bine daca foloseama o panglica de pini , dar si un pic mai multa indemanare ar fi ajutat .

Download

-

Bibliografie/Resurse

[1] 37

[2] viewtopic.php

pm/prj2011/ascurei/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