Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:victor.stoica0203:andrei.popa0810 [2026/05/24 17:50]
andrei.popa0810 [Software Design]
pm:prj2026:victor.stoica0203:andrei.popa0810 [2026/05/24 18:56] (current)
andrei.popa0810 [Software Design]
Line 76: Line 76:
 ===== Software Design ===== ===== Software Design =====
  
-**Mediu de dezvoltare:** Editor de text: Sublime, și atât.+**Mediu de dezvoltare** Editor de text: Sublime, și atât.
  
-**Biblioteci utilizate:**+**Biblioteci utilizate**
   * **avr/​io.h**   * **avr/​io.h**
   * **avr/​interrupt.h**   * **avr/​interrupt.h**
Line 84: Line 84:
   * **stdint.h**   * **stdint.h**
  
-**Justificarea utilizării funcționalităților din laborator:**+**Justificarea utilizării funcționalităților din laborator**
   * **Timer 1 in mod CTC**: Prescaler CLK/64, Top=250 => Numărător cu frecvență de 1kHz, folosit pentru a număra milisecunde.   * **Timer 1 in mod CTC**: Prescaler CLK/64, Top=250 => Numărător cu frecvență de 1kHz, folosit pentru a număra milisecunde.
  
   * **Întreruperi Hardware Pin Change**: activate prin regiștrii PCICR și PCMSK2 pe Pinul 2 -> permit citirea asincronă a butoanelor din matrice.   * **Întreruperi Hardware Pin Change**: activate prin regiștrii PCICR și PCMSK2 pe Pinul 2 -> permit citirea asincronă a butoanelor din matrice.
  
-  * **Modul SPI**: comunicarea cu display-ul se face prin SPI +  * **Modulul ​SPI**: comunicarea cu display-ul se face prin SPI 
-  * **Modul USART**: comunicarea între plăcuțe se face prin UART.+  * **Modulul ​USART**: comunicarea între plăcuțe se face prin UART.
  
-**Scheletul proiectului și interacțiunea funcționalităților:**+**Scheletul proiectului și interacțiunea funcționalităților**
  
   * **cpu.c**: Unitatea care citește input de la utilizator și trimite comenzi GPU-ului. Inputul provine de la o matrice de butoane 4x4, fiecare rând este activat alternativ continuu, iar pe fiecare coloană activează o întrerupere PCINT2 când este apăsată (și rândul e activ).   * **cpu.c**: Unitatea care citește input de la utilizator și trimite comenzi GPU-ului. Inputul provine de la o matrice de butoane 4x4, fiecare rând este activat alternativ continuu, iar pe fiecare coloană activează o întrerupere PCINT2 când este apăsată (și rândul e activ).
Line 98: Line 98:
   * **buffer.c**:​ Implementarea buffer-ului folosit de gpu.   * **buffer.c**:​ Implementarea buffer-ului folosit de gpu.
   * **lcd_screen.c**:​ Implementarea "​driver-ului"​ pentru display-ul spi. De asemenea conține și câteva funcții pentru desenarea formelor simple (dreptunghi,​ triunghi, pixel).   * **lcd_screen.c**:​ Implementarea "​driver-ului"​ pentru display-ul spi. De asemenea conține și câteva funcții pentru desenarea formelor simple (dreptunghi,​ triunghi, pixel).
-  * **geometry.c**:​ Implementarea transformărilor necesare proiectării scenei 3D pe ecranul 2D al display-ului+  * **geometry.c**:​ Implementarea transformărilor necesare proiectării scenei 3D pe ecranul 2D al display-ului
 +  * **spi.c**, **uart.c**, **timer.c**:​ implementarea modulelor respective.
  
-**Calibrarea perifericelor și sincronizarea I/O:**+**Calibrarea perifericelor și sincronizarea I/O**
  
-  * **Stabilizarea electrică a intrării:​** ​calibrarea butonului s-a realizat prin activarea hardware a rezistenței interne ​de Pull-Up microcontroleruluifixând o stare stabilă de HIGH în repaus ​și eliminând zgomotul de fond (efectul de pin flotant).+  * **Stabilizarea electrică a intrării:​** ​când un rând este "​activat"​ acesta acționează ca rezistență de pull-up pentru toate butoanele de pe acel rând. Ciclarea continuă ​rândurilor va genera PCINT constantdeci trebuie verificat faptul că un buton a fost apăsat (verificarea dacă pinul este tras la masă).  
 +  * **Sincronizarea CPU-ului cu GPU-ul**: La pornire, CPU-ul va trimite continuu mesajul HELLO_GPU pe uart, odată la 1 secundă. În momentul ​în care primește răspunsul HELLO_BACK, consideră că este conectat la GPU și intră în bucla în care poate procesa input. 
 +  * **Setup display**: Display-ul este setat să facă mirror vertical și orizontal ​(deoarece este conectat "​invers"​ pe breadboard).
  
-  ​* **Sincronizarea progresului vizual:** calibrarea barei de defuse s-a efectuat prin corelarea timpului fizic de acționare (5 secunde) cu densitatea de pixeli a ecranului. Împărțirea simetrică a intervalului la cele 7 caractere ale codului a determinat o rată de eșantionare de exact 714 ms per segment, asigurând o actualizare fluidă și liniară pe LCD.+**Optimizări arhitecturale realizate**
  
-**Optimizări arhitecturale realizate:**+  * **Optimizare de timp**: Pentru a nu trimite la fiecare frame întreaga scenă de la CPU la GPU, GPU-ul va stoca informații despre fiecare față(poziție,​ culoare, id). De asemenea, dacă scena rămâne neschimbată între frame-uri, GPU-ul nu o va mai redesena. Acesta reprezintă un trade-off major, deoarece memoria RAM este foarte limitată (2KB), nu se pot păstra foarte multe fețe (maxim 35, este nevoie și de buffer de comandă, alte flag-uri și o stivă destul de liberă pentru apel de funcții). 
 +  ​* **Optimizare de spațiu**: Deoarece limitarea de memorie nu permite existența unui depth buffer, GPU-ul sortează fețele descrescător față de distanța față de cameră. În fiecare frame, execută 2 pași de bubble-sort.
  
-  ​* **Optimizare de timp (Hardware Multitasking):​** înlocuirea totală a funcției software standard millis() cu un ceas intern generat pe baza Timerului 2. Prin mutarea contorului direct într-o rutină de întrerupere hardware (ISR) la fiecare o milisecundă,​ s-a eliminat overhead-ul software și s-a redus masiv timpul de ocupare a procesorului. +**Limitări**
- +
-  ​* **Optimizare de calcul (Eficiență computațională):​** în cadrul algoritmului de generare a frecvențelor PWM pentru buzzer, operațiile matematice costisitoare (înmulțiri și împărțiri repetitive de numere mari) au fost simplificate direct prin constante pre-calculate hardware în cod. Astfel, procesorul execută o singură operație aritmetică de bază per apel, salvând cicluri critice de ceas în momentele de alertă maximă (mai ales în ultimele 10 secunde până la explozie).+
  
 +  * **Memorie**:​ Din cauza dimensiunii mici a memoriei RAM, scena trebuie redesenată la fiecare schimbare, asta introduce fenomenul de "​blink-ing",​ ecranul fiind golit la fiecare frame, adaugă un timp vizibil în care ecranul este complet negru înainte de a desena fețele. De asemenea, sortarea fețelor este imperfectă,​ deoarece sortează față de distanța medie a fiecărui vârf față de cameră, în unele situații fețele se pot suprapune în mod ciudat.
 +  * **Canal imperfect de comunicație**:​ Deoarece modulul USART este setat la un baud-rate ridicat(115k),​ pot apărea erori în transmisia unui cadru, asta induce într-o posibilă pierdere a informației. (Problema cea mai mare este trimiterea greșită sau trimiterea parțială a unei fețe, totuși asta se întâmple foarte rar). 
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
 +[[https://​youtu.be/​r_Rg994yKR0|Demo]]
 ===== Concluzii ===== ===== Concluzii =====
 +Proiectul demonstrează că o implementare a unui engine 3D este posibilă, chiar și într-un mediu cu resurse foarte limitate, însă compromisurile tehnice nu permit existența unor funcționalități de bază (ex: double buffering), esențiale pentru un engine modern.
  
 +De asemenea, am învățat să fac debugging aproape orb, întrucât, comunicarea dintre CPU și GPU este realizată prin USART, nu puteam comunica cu plăcuțele prin intermediul interfeței seriale (nu aveam acces la "debug prin printf"​). Singurul instrument de debug pe care îl aveam la dispoziție era ecranul SPI: fie schimbam complet culoarea fundalului, fie "​desenam numere"​ (într-un mod rudimentar). Cea mai importantă parte a fost să implementez modul prin care CPU-ul trimite comenzi către GPU, fără să "​înece"​ canalul de comunicație (și să piardă comenzi importante în proces).  ​
 ===== Download ===== ===== Download =====
 https://​github.com/​andarkrc/​Basic-Arduino-Game https://​github.com/​andarkrc/​Basic-Arduino-Game
 +
 +{{:​pm:​prj2026:​victor.stoica0203:​popaandrei333cacod.zip|}}
  
 ===== Jurnal ===== ===== Jurnal =====
Line 123: Line 131:
   * 7.04.2026 - Alegere tema proiect si confirmare.   * 7.04.2026 - Alegere tema proiect si confirmare.
   * 7.05.2026 - Creare pagină ocw pentru proiect.   * 7.05.2026 - Creare pagină ocw pentru proiect.
 +  * 18.05.2026 - Finalizarea parțială a codului pentru a prezenta în cadrul milestone-ului software.
 +  * 23.05.2026 - Finalizarea codului.
 +  * 24.05.2026 - Update final la pagina de proiect. ​
  
  
pm/prj2026/victor.stoica0203/andrei.popa0810.1779634201.txt.gz · Last modified: 2026/05/24 17:50 by andrei.popa0810
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