Prezentarea pe scurt a proiectului vostru:
Proiectul consta in implementarea unui joc tic-tac-toe (x si 0) folosind 10 leduri bicolore (9 pentru matricea 3×3 a jocului si inca unul pentru a indica jucatorul curent), multiplexate la 5 pini de intrare in microcontroller, 4 butoane care reprezinta directia de deplasare pe matrice, 1 buton de confirmare, 2 butoane care reprezinta actiunile de save/load a starii curente intr-un fisier pe card-ul SD, precum si folosirea unui speaker de PC pentru a semnaliza diferite evenimente in joc (s-a terminat jocul etc.).
(schema initiala am gandit-o pentru doua LED-uri simple conectate in anti-paralel, in loc de LED-uri bicolore. Apoi am adaugat diodele in anti-paralel cu LED-urile componente LED-ului bicolor pentru a simula acelasi comportament. Astfel a trebuit sa micsorez valoarea rezistentelor pentru a pastra o iluminare puternica, dar pe schema din EAGLE nu am mai modificat valorile R-urilor)
Din pacate, autoroute-ul EAGLE-ului a facut niste greseli si mi-a unit niste fire care nu trebuiau legate. Astfel, in loc sa mi se aprinda cate un bec, mi se aprindeau 3. Dupa ore bune de debugging in care credeam ca poate am gresit eu cand am gandit schema electrica astfel, am corectat legaturile stricate. Astfel, schema corectata ar fi urmatoarea, cu mentiunea ca diodei D6 i-am mutat catodul la anodul din interiorul placii al LED-ului de deasupra :
La plusul de la speaker am mai pus o rezistenta de 100 ohmi pentru a micsora amperajul ce trece prin el. Altfel, era posibil sa se topeasca membrana speakerului.
Am folosit ca mediul de dezvoltare WinAVR. Am dorit sa folosesc ca resurse auxiliare biblioteca pentru card sd/mmc (cea folosita in laborator) dar din motive neintelese de mine codul acela (adaptat evident) nu a functionat. Astfel, am renuntat la partea de salvare/incarcare a starii curente pe/de pe cardul SD. Mentionez ca partea HW sigur e functionala, deoarece am testat placa cu codul de aici: http://www.captain.at/electronic-atmega-sd-card.php .
Neavand suficienti pini de I/O pentru a interfata 20 de leduri (10 leduri bicolore), 7 butoane si speaker-ul am optat pentru o multiplexare a ledurilor. Astfel, sunt fortat sa controlez aprinderea lor pe rand din soft. Ce am facut a fost sa aprind la un interval de 2ms fiecare bec de pe placa. Astfel, ochiul uman este pacalit si nu observa ca becurile sunt aprinse cate unul, secvential.
Am vrut sa clipocesc ledul cu pozitia curenta pentru o mai buna orientare. Astfel, am avut de ales intre a folosi un counter intern pentru a controla comutarea ledului si a folosi intreruperile si un timer al microcontrolerului. Am folosit in final doua timere, unul (Timer 1A) pentru a scoate o intrerupere la o zecime de secunda pentru a comuta starea ledului si inca unul (Timer 2) pentru a scoate o intrerupere la o milisecunda pentru speaker (ca sa se auda in continuu beep-ul de eroare, trebuie sa alternez semnalul transmis catre +-ul lui - 0,1,0,1,…; am folosit intreruperea pentru aceasta alternare). Intreruperea de la Timer 1A am folosit-o in modul explicat mai sus si pentru a clipoci la final ledurile care formeaza linia castigatoare, in caz ca exista.
Cu parere de rau ca nu am reusit sa pun si partea cu cardul SD, consider ca am realizat ceva dragut, invatand destul de mult despre cum sa construiesc electronice.
Un filmulet demonstrativ se regaseste aici: http://www.youtube.com/watch?v=V5MRfCbFhes