This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:eusebiu.burtescu [2026/05/23 17:43] eusebiu.burtescu [Hardware Design] |
pm:prj2026:alexandru.jipa2803:eusebiu.burtescu [2026/05/25 07:58] (current) eusebiu.burtescu [Download] |
||
|---|---|---|---|
| Line 44: | Line 44: | ||
| | **D13** | PB5 (SCK) | Ecran TFT **SCL** / **SCK** | Semnalul de ceas (Clock) pentru sincronizarea SPI | | | **D13** | PB5 (SCK) | Ecran TFT **SCL** / **SCK** | Semnalul de ceas (Clock) pentru sincronizarea SPI | | ||
| | **A5** | PC5 | **Buzzer Pasiv** | Generare audio low-level pentru efecte si alerte | | | **A5** | PC5 | **Buzzer Pasiv** | Generare audio low-level pentru efecte si alerte | | ||
| - | | **5V / VCC** | VCC | Ecran TFT **VCC** | Alimentarea cu energie a ecranului | | + | | **5V / VCC** | VCC | Ecran TFT **VCC** | Alimentarea cu energie a ecranului (Unde e conectat si suportul de baterii)| |
| | **GND** | GND | Ecran / Buzzer / Butoane | Masa comuna a intregului circuit electric | | | **GND** | GND | Ecran / Buzzer / Butoane | Masa comuna a intregului circuit electric | | ||
| Line 50: | Line 50: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | ==== Mediu de dezvoltare, librarii si surse ==== | ||
| + | Proiectul este scris in **PlatformIO (in VS Code)** cu compilerul standard *avr-gcc*. Singura librarie din exterior pe care am folosit-o este **Adafruit_ST7735** (impreuna cu *Adafruit_GFX*), strict pentru a desena pe ecran. | ||
| - | <note tip> | + | Restul functiilor (partea de SPI, citirea butoanelor, debouncing-ul, sunetele si timpii) sunt facute de noi de la zero, **fara librarii**, umbland direct in registrii de pe ATmega328P. |
| - | 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 | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | ==== Algoritmi si structuri de date ==== |
| - | <note tip> | + | === 1. Masina de stari (State Machine) === |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Codul se bazeaza pe o masina de stari simpla (folosind un ''enum StareJoc''): |
| - | </note> | + | * ''MENIU'': Ecranul de start unde alegem dimensiunea tablei ($3\times3$, $4\times4$, $5\times5$). |
| + | * ''IN_JOC'': Jocul propriu-zis, unde miscam cursorul, punem piese si scade timpul. | ||
| + | * ''GAME_OVER'': Afiseaza cine a castigat si asteapta sa apasam pe butonul de reset. | ||
| + | === 2. Reprezentarea tablei si Verificarea Castigului === | ||
| + | Tabla este salvata intr-o matrice de intregi ''int tabla[5][5]''. Logica este asa: ''0'' pentru patratel gol, ''1'' pentru Jucatorul X (Albastru) si ''2'' pentru Jucatorul O (Portocaliu). Pentru a vedea daca a castigat cineva, parcurgem matricea pe linii, coloane si diagonale cu o „fereastra” (Sliding Window) de 3 elemente vecine. Daca gasim 3 piese la fel, jocul se opreste. | ||
| + | |||
| + | === 3. Periferice si Temporizare Hardware === | ||
| + | * **SPI Hardware Manual:** Ca sa mearga ecranul foarte rapid, am configurat manual modulul SPI din procesor. Setați din registrul ''DDRB'' pinii de MOSI (PB3), SCK (PB5) si CS (PB2) ca iesiri. Dupa, am pornit SPI-ul din registrul ''SPCR'' pe mod Master si am activat viteza maxima de 8MHz din registrul ''SPSR'' (folosind bitul ''SPI2X''). Asa ecranul se deseneaza instant. | ||
| + | * **Sistemul cu doua timere (Timer0 si Timer2):** Ca sa nu folosim functii blocante gen delay() care pun tot codul pe pauza, am impartit treaba pe doua timere interne: | ||
| + | * **Timer2 (Bara de timp):** L-am pus in mod Normal cu prescaler de 64. Ii dam valoarea ''TCNT2 = 6'' in functia de intrerupere ''ISR(TIMER2_OVF_vect)'' si asa primim o intrerupere fixa la fiecare 1 milisecunda. O folosim ca sa scadem timpul din tura (limita de 10 secunde). | ||
| + | * **Timer0 (Delay-uri pentru sunet si butoane):** Este pus tot pe prescaler de 64 (un pas inseamna 4 microsecunde). Citim direct registrii ''TCNT0'' si ''TIFR0'' (prin metoda de *polling* / verificare continua) ca sa facem pauze exacte pentru frecventele de la buzzer si debouncing. | ||
| + | |||
| + | ==== Surse si functii implementate ==== | ||
| + | |||
| + | === Control Hardware Low-Level & Audio === | ||
| + | * ''void initSPIHardware()'': Seteaza pinii de pe portul B si porneste modulul SPI din procesor. | ||
| + | * ''void initTimer0Delay()'': Porneste Timer0 ca sa il avem gata pentru functiile de delay. | ||
| + | * ''void asteaptaMicrosecunde(unsigned int us)'' / ''void asteaptaMilsecunde(unsigned int ms)'': Functiile noastre de delay care asteapta dupa timerul hardware (se uita in registrul ''TCNT0'' si asteapta flag-ul ''TOV0''). | ||
| + | * ''void pulsHardware(int frecventaMicros, int durataMs)'': Misca rapid pinul PC5 (unde avem buzzerul) modificand registrul ''PORTC'' ca sa scoata sunete pe diferite frecvente. | ||
| + | * ''uint8_t citesteButoaneCuDebounce()'': Citeste pinii din registrul ''PIND'', asteapta 5ms si verifica din nou cu un XOR ca sa fie sigur ca apasarea e stabila si nu e doar zgomot (bounce). | ||
| + | * ''sunet[Eveniment]()'': Functii simple (ex: ''sunetCastig()'', ''sunetMiscare()'') care doar apeleaza ''pulsHardware'' cu valori diferite ca sa sune diferit. | ||
| + | |||
| + | === Logica si Randare Vizuala === | ||
| + | * ''void calculeazaDimensiuni()'': Calculeaza in pixeli cat de mari sa fie patratelele in functie de modul ales ($3\times3$, $4\times4$ sau $5\times5$) ca grila sa stea pe centrul ecranului. | ||
| + | * ''void deseneazaMeniu()'' / ''void deseneazaGameOver()'': Coloreaza ecranele fixe si pune textul la coordonate fixe ca sa nu se incalece literele. | ||
| + | * ''void deseneazaGrila()'' / ''void deseneazaPiesa()'' / ''void deseneazaCursor()'': Deseneaza efectiv liniile tablei, cercurile/X-urile si patratul de cursor in timpul meciului. | ||
| + | * ''void updateTimerGrafic()'': Vede cat timp a trecut din secunda in secunda si redeseneaza bara colorata de sus (verde/rosie). Daca trec cele 10 secunde, schimba rândul automat. | ||
| + | |||
| + | ==== Functionalitati din laborator utilizate ==== | ||
| + | |||
| + | * **SPI:** Configurat manual prin registrii hardware (''SPCR'', ''SPSR'', ''SPDR'') si pinii de pe Portul B. Trimitem octetii direct in siliciu la viteza maxima de 8MHz, fara functii gata facute. | ||
| + | * **GPIO:** Tot controlul pinilor (butoane, DC/RST ecran, buzzer) se face prin manipularea directa a registrelor de porturi (''DDRB'', ''PORTB'', ''PORTD'', ''PIND'', ''DDRC'', ''PORTC''). | ||
| + | * **Timere:** **Timer0** este folosit pentru delay-uri precise prin polling (numara pasi de 4 microsecunde pentru buzzer si debouncing), iar **Timer2** genereaza baza de timp pentru cronometrul jocului. | ||
| + | * **Intreruperi:** Am activat intreruperea de overflow pe **Timer2** (''TIMER2_OVF_vect'') pentru a scadea timpul la fiecare 1ms. Am facut asta ca sa nu avem operatii blocante in loop-ul principal, eliminand complet micro-lag-urile in timpul jocului. | ||
| + | ===== Rezultate Obtinute ===== | ||
| + | |||
| + | In urma testarii pe hardware, proiectul este 100% functional, aspect demonstrat si in clipul video (.mp4) atasat in arhiva. | ||
| + | |||
| + | Performantele obtinute: | ||
| + | * **Grafica fluida:** Ecranul se randeaza instant datorita SPI-ului. | ||
| + | * **Control fara lag:** Cursorul si meniurile raspund imediat la butoane, iar debouncing-ul elimina apasarile duble. | ||
| + | * **Audio stabil:** Buzzerul scoate sunete clare pentru mutari, selectii, victorii sau erori. | ||
| + | * **Timp precis:** Bara de 10 secunde scade uniform prin Timer2, schimband automat jucatorul la expirare fara sa inghete jocul. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | In urma multor teste si incercari, proiectul a fost implementat cu succes, respectand toate functionalitatile din planul initial. Pe partea de dezvoltare am intampinat si probleme hardware specifice: am ars controllerul USB al unei placi de test si am reusit sa rup pinii unui buton de pe board (cel configurat initial pentru Start). Totusi in final am reusit sa ajung la ce mi-am propus. | ||
| + | |||
| ===== Download ===== | ===== Download ===== | ||
| + | {{:pm:prj2026:alexandru.jipa2803:archive.zip|}} | ||
| - | <note warning> | + | https://github.com/BurtescuEusebiu/TicTacToePM |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
| - | + | ||
| - | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | |
| - | </note> | + | |
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| Line 82: | Line 118: | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| + | {{:pm:prj2026:alexandru.jipa2803:xplainedmini.pdf|}} | ||
| - | <note> | + | {{:pm:prj2026:alexandru.jipa2803:st7735.pdf|}} |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | |
| - | + | ||
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | |