Game of Life

Introducere

Game of Life este un “joc” in care se porneste de la o configuratie initiala si se observa evolutia acesteia. Configuratia este alcatuita din celule vii si moarte. Cand spun vecin, ma refer la o celula vie aflata in vecinatatea alteia.

Reguli:

  • o celula vie cu mai putin de doi vecini moare
  • o celula vie cu doi sau trei vecini ramane in viata si in generatia urmatoare
  • o celula vie cu mai mult de trei vecini moare (suprapopulare)
  • o celula moarta cu trei vecini “invie”

Descriere generală

Schema bloc a proiectului:

Schema bloc

KS0108 este controllerul care se afla in LCD si care interpreteaza comenzile trimise de ATmega16.

Produsul final:

Hardware Design

Piese

La placuta initiala am mai adaugat:

  • BG12864A (Lcd)
  • cabluri si conectori
  • rezistente pt alimentare backlight
  • potentiometru pt ajustare contrast

In imaginea de mai jos este prezentat felul in care am conectat LCD-ul la pinii microprocesorului. LCD-ul din imagine nu este identic cu al meu, dar avea pinii asemanatori.

Conectare LCD

Lcd-ul l-am alimentat la 5V la pinii aflati pe placuta langa portul D al ATmega16.

 Alimentare LCD

Pt ca led-urile lcd-ului sa fie alimentate, trebuiau legate precum in imaginea de mai jos. Deoarece nu am avut o rezistenta de 16.5 Ω, am folosit 4 rezistente de 4.7 Ω inseriate.

Legare Backlight

Software Design

Codul l-am scris folosind Programmer's Notepad, pe Windows 7, 32 biti.

Pt a interactiona cu KS0108, am folosit o biblioteca de pe net. Cand am vazut ca nu functiona, am incercat sa imi scriu propriile functii de afisare, dar nu am reusit sa fac sa apara nimic.

Pt partea de Game Of Life, pastrez doua matrici: in una am starea anterioara a jocului, iar in cealalta imi construiesc starea curenta. Pentru a ocupa cat mai putina memorie, fiecare bit dintr-un char reprezinta un punct pe lcd.

Creare fisier .hex: make

Stergere fisiere executabile: make clean

Descriere functii necesare jocului:

  • getNeigh(x, y, index) - intoarce cati vecini sunt in jurul punctului (x, y), iar index precizeaza din care matrice;
  • setCell(i, j, index) - marcheaza celula (i, j) din matricea index ca fiind vie;
  • isAlive(i, j, index) - intoarce starea celulei (i, j) din matricea index;

In while, verific cati vecini are fiecare celula si in functie de numar, determin noua ei stare (vie sau moarta). Apoi afisez matricea curenta, iar matricea curenta devine matricea veche.

LCD-ul are 20 pini, printre care:

  • DB0 - DB7 - date
  • E - enable
  • RW - H → Citire, L → Scriere
  • DI - H → Date, L → Instructiuni
  • CS1, CS2 - selecteaza in care jumatate de ecran se face afisarea

Datele le-am pus pe PORTA, iar partea pt comenzi (RW, DI, CS, E) pe PORTC. Pt a putea folosi PORTC, am inteles ca trebuie dezactivat JTAG, ceea ce am si facut. Oricum, firele sunt legate la conectori, care pot fi mutati pe orice port. Doar trebuie actualizat in fisierul header noile porturi folosite.

Descriere functii afisare folosite:

  • ks0108GotoXY(x, y) - pregateste LCD-ul sa afiseze la pozitia (x, y);
  • ks0108WriteData(data) - scrie data (8 biti) la pozitia care fusese setata inainte.

Dispunerea punctelor pe LCD:

Rezultate Obţinute

Am pornit de la: Placuta initiala si am ajuns la: Placuta finala

Codul este scris, LCD-ul este alimentat, dar din pacate, nu am reusit sa afisez nici macar un punct.

Concluzii

Datorita acestui proiect si laboratorului, mi-am consolidat lucrul pe biti. De asemenea, acum incerc mai mereu cand scriu cod, sa folosesc cat mai putin spatiu. Mi-as dori sa reusesc sa il fac sa afiseze ceva, pentru a realiza apoi si lucruri mai complicate cu el.

Download

Codul cu libraria luata de pe net:

Codul cu ce am incercat eu:

Bibliografie/Resurse

pm/prj2012/avoinescu/gol_ls.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