luni, 1 iunie 2009
miercuri, 20 mai 2009
Bill Of Materials
QTY PART-REFS VALUE
--- --------- -----
Resistors
---------
4 R1-R4 330
Capacitors
----------
2 C8,C9 1nF
Integrated Circuits
-------------------
1 U1 ATMEGA324P
1 U3 AD581
Diodes
------
1 D2 1N914
Miscellaneous
-------------
1 J1 CONN-D25M
1 LCD1 LM3229
4 RB1-RB4 330
1 RR 10k
4 RV1-RV4 POT
--- --------- -----
Resistors
---------
4 R1-R4 330
Capacitors
----------
2 C8,C9 1nF
Integrated Circuits
-------------------
1 U1 ATMEGA324P
1 U3 AD581
Diodes
------
1 D2 1N914
Miscellaneous
-------------
1 J1 CONN-D25M
1 LCD1 LM3229
4 RB1-RB4 330
1 RR 10k
4 RV1-RV4 POT
miercuri, 6 mai 2009
Optimizari
Am facut niste simulari ale programului folosing simulatorul din avr studio pentru a vedea viteza de executie. Iata ce am obtinut:
Timpul de desenare variaza in functie de dimensiunea obiectelor desenate. Se poate vedea ca rutinele de desenare sunt cele mai lente(si mai exact partea de scriere pe lcd). Astfel pentru programul simulat(dar si testat pe lcd) aveam aproximativ doar 5FPS, ceea ce ducea la o afisare in trepte a miscarii dar si la scaderea preciziei sistemului de coliziune.
Solutia pe care am gasit-o a fost desenarea labirintului doar la inceput si nu la fiecare frame. Astfel timpul de executie s-a imbunatatit dramatic. Insa in acest caz apare o problema: se mai intampla ca bila sa se suprapuna cu pixeli din labirint si la actualizarea imaginii(la stergerea bilei pentru desenarea ei la pozitia urmatoare) se sterg si pixeli din labirint. Acest bug il voi rezolva pe viitor.
O alta optimizare a fost modul de desenare a bilei. Initial dupa cum se poate vedea in poza, la capetele superioare si inferioare bilei ii lipseau niste pixeli, iar pentru dimensiuni mai mici ale bilei aceasta semana cu o acolada.

Acum insa bila este desenata aproape complet:

Tipul rutinei | Timpul de executie |
desenare cerc | 46ms |
desenare linie | 57ms |
verificare coliziune | 1 ms |
O parcurgere completa a rutinei(pentru un labiritnt cu un numar mic de linii) | 210ms |
Timpul de desenare variaza in functie de dimensiunea obiectelor desenate. Se poate vedea ca rutinele de desenare sunt cele mai lente(si mai exact partea de scriere pe lcd). Astfel pentru programul simulat(dar si testat pe lcd) aveam aproximativ doar 5FPS, ceea ce ducea la o afisare in trepte a miscarii dar si la scaderea preciziei sistemului de coliziune.
Solutia pe care am gasit-o a fost desenarea labirintului doar la inceput si nu la fiecare frame. Astfel timpul de executie s-a imbunatatit dramatic. Insa in acest caz apare o problema: se mai intampla ca bila sa se suprapuna cu pixeli din labirint si la actualizarea imaginii(la stergerea bilei pentru desenarea ei la pozitia urmatoare) se sterg si pixeli din labirint. Acest bug il voi rezolva pe viitor.
O alta optimizare a fost modul de desenare a bilei. Initial dupa cum se poate vedea in poza, la capetele superioare si inferioare bilei ii lipseau niste pixeli, iar pentru dimensiuni mai mici ale bilei aceasta semana cu o acolada.
Acum insa bila este desenata aproape complet:
luni, 4 mai 2009
Cu un pas mai aproape
Am rescris algoritmul de detectie a coliziunii si de reactie astfel incat merge pentru orice tip de linie(nu numai orizontala sau verticala).
Algoritmul propriu-zis l-am conceput intr-un timp destul de scurt deoarece nu este foarte complicat si se bazeaza pe alegbra vectoriala. Ceea ce a durat foarte mult a fost (din nou) debugingul deoarece se pare ca avr-gcc are un bug(sau poate asa ar trebui sa functiuneze):
- daca avem 2 variabile de tip int a si b si variabila c de tip long, atunci executand instructiunea c=a*b; vom obtine in c rezultatul de tip int si nu de tip long al inmultirii si nu scapam de posibile overflowuri.
Intre timp cred se pare ca s-a ars si microcontrollerul(cert este ca nu mai merge programat) si l-am inlocuit cu alt atmega324p (multumesc danut pt uC:) )
Algoritmul propriu-zis l-am conceput intr-un timp destul de scurt deoarece nu este foarte complicat si se bazeaza pe alegbra vectoriala. Ceea ce a durat foarte mult a fost (din nou) debugingul deoarece se pare ca avr-gcc are un bug(sau poate asa ar trebui sa functiuneze):
- daca avem 2 variabile de tip int a si b si variabila c de tip long, atunci executand instructiunea c=a*b; vom obtine in c rezultatul de tip int si nu de tip long al inmultirii si nu scapam de posibile overflowuri.
Intre timp cred se pare ca s-a ars si microcontrollerul(cert este ca nu mai merge programat) si l-am inlocuit cu alt atmega324p (multumesc danut pt uC:) )
miercuri, 22 aprilie 2009
Primii pasi in programare
Proiectul incepe sa ia contur. Am realizat un sistem de detectie a coliziunii si de schimbare a directiei bilei in functie de coliziune(deocamdata functioneaza doar pentru linii orizontale si verticale).
Am folosit lcd-ul pentru debugging printand pe el valori a diferite variabile ce ma interesau.
Pentru a face programul cat mai eficient (folosirea unei memorii de date mai mici, timpi mai mici de executie) am ales sa nu folosesc variabile cu virgula(floating point). Am ales o valoare de normare egala cu 180(ce am ales-o dupa mai multe calcule ce au luat in consideratie dimensiunea lcdului) ce va reperezenta dimensiunea 1. Daca as avea o variabila int cu valoarea 630 ea ar reprezenta numarul 3,5(630/180). Pot calcula astfel cu o precizie de 0,0056 (1/180).
Am folosit lcd-ul pentru debugging printand pe el valori a diferite variabile ce ma interesau.
Pentru a face programul cat mai eficient (folosirea unei memorii de date mai mici, timpi mai mici de executie) am ales sa nu folosesc variabile cu virgula(floating point). Am ales o valoare de normare egala cu 180(ce am ales-o dupa mai multe calcule ce au luat in consideratie dimensiunea lcdului) ce va reperezenta dimensiunea 1. Daca as avea o variabila int cu valoarea 630 ea ar reprezenta numarul 3,5(630/180). Pot calcula astfel cu o precizie de 0,0056 (1/180).
joi, 16 aprilie 2009
It is alive!!
Saptamana trecuta am cumparat de la Comet un lcd grafic 160x80.
Dupa o noapte de debugging am reusit sa fac lcd-ul sa functioneze cu ajutorul codului scris deIvan Sergeev http://www.frozeneskimo.com/samsunglcd/avr-lc7981-v1/ (lc7981.c si lc8981.h)(multumesc Ivan!).
Lcd-ul l-am testat pe un breadboard(de fapt sunt 3 unite) pe care am pus un microcontroller atmega324p.
Mai pe larg:
Toata noaptea am incercat sa fac un debuger ce ruleaza pas cu pas codul programului (cate o instructiune atunci cand apas pe un buton) pentru a vedea unde anume intervine ceva neprevazut, fara insa sa reusesc sa depistez unde era hiba.
Hiba era chiar la mine.. Pe la 3:30 dimineata cand vroiam sa ma culc am zis sa refac conexiunile dintre uC si lcd.. Surpriza, lcd-ul mergea, codul pe care-l credeam de vina si pe care incercam sa-l "repar" n-avea nimic, eu si numai eu eram de vina. Desi initial verificasem toate firele cu test de conectivitate se pare ca atunci cand am mutat "platforma" langa calculator sa incarc codul un fir nu mai facea contact.
Am invatat de aici cat de important e sa verific conexiunile de fiecare data cand nu merge ceva inainte de a da vina pe cod. :)
Abonați-vă la:
Postări (Atom)