<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=2052&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-01-04T22:20:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2052&amp;mode</id>
<entry>
<author><name><![CDATA[elkuba]]></name></author>
<updated>2013-01-04T22:20:58+01:00</updated>
<published>2013-01-04T22:20:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23379#p23379</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23379#p23379"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23379#p23379"><![CDATA[
Witaj.<br />Czy tych stałych z pliku ColorClass.h nie da się zmienić z float na jakiś typ całkowity?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=400">elkuba</a> — 4 sty 2013, o 22:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-01-04T21:55:34+01:00</updated>
<published>2013-01-04T21:55:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23376#p23376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23376#p23376"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23376#p23376"><![CDATA[
<div class="quotetitle">Ledes napisał(a):</div><div class="quotecontent"><br />Dziękuję Mirek za dobre słowo. Cieszę się, że mój kod jest czytelny. Chociaż jak tak teraz dokładniej patrzę, to jest jeszcze kilka baboli jeśli chodzi o notację czy formatowanie kodu. ;P<br /></div><br /><br />ajtam ajtam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... weź przestań - po tych ostatnich kodach w jednym pliku liczących sobie och-set linii kodu - to to co zaprezentowałeś to miód na moje serce <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale - masz rację, że warto po swojemu dopieszczać zawsze kodzik.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 sty 2013, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-01-04T21:51:58+01:00</updated>
<published>2013-01-04T21:51:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23374#p23374</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23374#p23374"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23374#p23374"><![CDATA[
Dziękuję Mirek za dobre słowo. Cieszę się, że mój kod jest czytelny. Chociaż jak tak teraz dokładniej patrzę, to jest jeszcze kilka baboli jeśli chodzi o notację czy formatowanie kodu. ;P<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 4 sty 2013, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-01-04T21:23:56+01:00</updated>
<published>2013-01-04T21:23:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23368#p23368</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23368#p23368"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23368#p23368"><![CDATA[
Ledes - przede wszystkim - to aż miło się czyta taki kod. O tej ważnej rzeczy o której napisał Krauser - nawet ja w swoich kodach często zapominam - a przypominam sobie zwykle dopiero wtedy gdy zaczyna brakować RAM'u i trzeba szybko go zaoszczędzić - zoptymalizować kod. Jak zwykle - kolega Krauser - Sokole OKO <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 sty 2013, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-01-04T21:06:43+01:00</updated>
<published>2013-01-04T21:06:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23364#p23364</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23364#p23364"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23364#p23364"><![CDATA[
Tak, wiem. Dlatego przy 80% już się powinna zapalić lampka. Ale u mnie do 80% daleko... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 4 sty 2013, o 21:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-04T20:53:23+01:00</updated>
<published>2013-01-04T20:53:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23363#p23363</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23363#p23363"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23363#p23363"><![CDATA[
Dodam jeszcze, że:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">Data: 2048 bytes (100.00% Full)<br />(.data + .bss + .noinit)</div><br />spowoduje błędne działanie programu przy wywołaniu typowej funkcji, bo to podsumowanie nie uwzględnia przecież stosu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 sty 2013, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-01-04T20:27:40+01:00</updated>
<published>2013-01-04T20:27:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23358#p23358</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23358#p23358"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23358#p23358"><![CDATA[
W tej chwili mam takie staty:<br /><br />Program:    7140 bytes (21.8% Full)<br />(.text + .data + .bootloader)<br /><br />Data:        652 bytes (31.8% Full)<br />(.data + .bss + .noinit)<br /><br />Procka nie będę zmieniał, bo to działa w dwóch płytkach:<br />1) ATB<br />2) moje własne PCB które ma już procka ATmega32A wpiętego w podstawkę.<br /><br />Ale dzięki za radę, nie wpadłem na to. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 4 sty 2013, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-04T19:55:25+01:00</updated>
<published>2013-01-04T19:55:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23350#p23350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23350#p23350"/>
<title type="html"><![CDATA[Re: Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23350#p23350"><![CDATA[
Te wszystkie stałe (const) możesz umieścić tylko w pamięci programu i zwolnisz z 300 bajtów pamięci RAM, a to jakieś 15% dla ATMEGA32 co może pozwolić na wykorzystanie ATMEGA16. Wiąże się to oczywiście z dużą ilością modyfikacji, ale sam pytałeś. Co do stringów i wskaźników do stringów w pamięci programu poczytaj tutaj <!-- m --><a class="postlink" href="http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array" >http://www.nongnu.org/avr-libc/user-man ... _rom_array</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 sty 2013, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-01-04T16:17:54+01:00</updated>
<published>2013-01-04T16:17:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23327#p23327</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23327#p23327"/>
<title type="html"><![CDATA[Prośba o ocenę kodu, klasyfikacja kolorów z TCS3200]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2052&amp;p=23327#p23327"><![CDATA[
Hej, nadszedł czas abym poddał się ocenie Kolegów C-owców.<br /><br />Do rzeczy: projekt mikroprocesorowego klasyfikatora kolorów opartego na ATmedze32A i czujniku TCS3200.<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#include &quot;COLOR_CLASSIFIER/colorClass.h&quot;<br /><br />int main(void)<br />{<br />colorClassifierInit();<br /><br />uint8_t filterNr = 0;<br /><br />enum {R,G,B};<br />changeFilter(R);// zaczynamy pomiar od skladowej Red<br /><br />while(1)<br />{<br />if(klawisz_wcisniety())<br />{<br />BKT_TOG;<br />}<br /><br />for(int j=0; j&lt;(3*MEAS_NR); j++)// MEAS_NR pomiarow (razy 3, bo 3 skladowe mierzymy oddzielnie)<br />{<br />singleMeasRes[filterNr] = TCSMeasure();// pomiar pojedynczej skladowej<br /><br />filterNr++;<br />filterNr %= 3;<br /><br />changeFilter(filterNr);<br /><br />if(filterNr % 3 == 0) // tablica result zapelniona wynikami R,G,B<br />{<br />filterNr = 0;<br />//showResults();<br />tempMeasRes = processing();// przetwarzanie czastkowe jednego pomiaru<br />tabmSI[j/3] = tempMeasRes.mSI;<br />tabmDI[j/3] = tempMeasRes.mDI;<br />}<br /><br />_delay_ms(50);// zwloka pomiedzy pomiarami fR, fG, fB<br />}<br />classify();// klasyfikacja na podstawie MEAS_NR pomiarow<br />}<br />}<br />[/syntax]<br /><br />colorClass.h<br />[syntax=c]<br />#ifndef COLORCLASS_H_<br />#define COLORCLASS_H_<br /><br />typedef struct// pomocnicza struktura (czastkowe wyniki)<br />{<br />int8_t mSI;<br />int8_t mDI;<br />} partialRes;<br /><br />void colorClassifierInit();// inicjalizacja urzadzenia<br />float TCSMeasure();// pomiar pojedynczego kanalu<br />float absValue(float value);// abs() dla floatow<br />void changeFilter(uint8_t filterNr);// zmiana aktywnej sekcji fotodiod na filterNr<br />uint8_t klawisz_wcisniety(void);// obsluga klawisza<br />void showResults(void);// wyswietlenie wyniku pomiaru (R=x, G=y, B=z)<br />partialRes processing(void);// czesc przetwarzania<br />void classify(void);// klasyfikacja<br /><br />#define MEAS_NR 10// liczba pomiarow w jednej klasyfikacji<br />#define COL_NR 13// liczba obiektow testowych (COL_NR-1 obiektow testowych + 1 obiekt -&gt; brak obiektu)<br /><br /><br />// -----------------------  KAMODCOLOR PINOUTS --------------------<br />#define TCS_S2_PIN (1 &lt;&lt; PC5)// S2<br />#define TCS_S3_PIN (1 &lt;&lt; PC6)// S3<br /><br />#define TCS_OE_PIN (1 &lt;&lt; PC3)// /OE<br />#define TCS_OUT_PIN (1 &lt;&lt; PC2)// OUT/Fo<br />// ----------------------------------------------------------------<br /><br />#define TCS_LED_PIN (1 &lt;&lt; PC7)// doswietlenie czujnika<br /><br />#define KEY_PIN (1 &lt;&lt; PC1)// klawisz wl/wyl doswietlenie<br /><br />#define KEY_DOWN !(PINC &amp; KEY_PIN)// klawisz wcisniety<br />#define BKT_TOG PORTC ^= TCS_LED_PIN;// makro zmieniajace stan doswietlenia czujnika<br /><br /><br />extern char* filterNames[3];// c-stringi: nazwy R,G,B<br />extern char* testObjNames[13];// c-stringi: nazwy kolorow obiektow testowych<br />extern const float sumRGB[13];// sumy R+B+G<br />extern const float sumDiff[13];// odchylki od sum R+B+G<br />extern const float rbDiv[13];// stosunki R/B<br /><br />extern const float rbDiff;// max odchylka od stosunku R/B<br />extern float singleMeasRes[3];<br /><br />extern int8_t tabmSI[MEAS_NR];// tablica zawierajaca wyniki wg sumy R+B+G<br />extern int8_t tabmDI[MEAS_NR];// tablica zawierajaca wyniki wg stosunku R/B<br /><br />extern partialRes tempMeasRes;// struktura czastkowa zawierajaca dwie liczby: sume i stosunek<br /><br /><br />#endif /* COLORCLASS_H_ */<br />[/syntax]<br /><br />colorClass.c:<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;../LCD/lcd44780.h&quot;<br /><br />#include &quot;colorClass.h&quot;<br /><br />int8_t tabmSI[MEAS_NR] = {};<br />int8_t tabmDI[MEAS_NR] = {};<br />partialRes tempMeasRes;<br /><br />char* filterNames[3] = {<br />&quot;R=&quot;,<br />&quot;G=&quot;,<br />&quot;B=&quot;<br />};<br /><br />char* testObjNames[13] = {<br />&quot;1_CZARNY&quot;,<br />&quot;2_FIOLETOWY&quot;,<br />&quot;3_NIEBIESKI&quot;,<br />&quot;4_CIEMNO-ZIELONY&quot;,<br />&quot;5_JASNO-ZIELONY&quot;,<br />&quot;6_AQUA&quot;,<br />&quot;7_CZERWONY&quot;,<br />&quot;8_ROZOWY&quot;,<br />&quot;9_POMARANCZOWY&quot;,<br />&quot;10_ZOLTY&quot;,<br />&quot;11_SZARY&quot;,<br />&quot;12_BIALY&quot;,<br />&quot;13_BRAK-OBJ&quot;<br />};<br /><br />const float sumRGB[13] = { // sumy R+B+G<br />74.4,<br />94.9,<br />99,<br />97.3,<br />146.1,<br />146.8,<br />141.5,<br />169.9,<br />198.3,<br />223.6,<br />214.9,<br />295,<br />53.7<br />};<br /><br />const float sumDiff[13] = { // odchylki od sum R+B+G<br />0.4,<br />0.2,<br />1.4,<br />1.8,<br />4,<br />0,<br />5,<br />6.2,<br />2.5,<br />4,<br />6.3,<br />15.5,<br />1.8<br />};<br /><br />const float rbDiv[13] = { // stosunki R/B<br />1.87,<br />1.48,<br />1.02,<br />1.59,<br />1.83,<br />1.06,<br />3.39,<br />2.05,<br />3.18,<br />3.06,<br />1.43,<br />1.31,<br />2.8<br />};<br /><br />const float rbDiff = 0.15;<br /><br />float singleMeasRes[3] = {};<br /><br />float TCSMeasure()<br />{<br />// jezeli funckcja jest wywolana podczas niskiego stanu na wyjsciu czujnika,<br />// to czeka na to, az wyjscie czujnika przyjmie stan wysoki<br /><br />   if((PINC &amp; TCS_OUT_PIN) == 0)<br />   {<br />      while((PINC &amp; TCS_OUT_PIN) == 0); // czekaj na zbocze narastajace<br />   }<br /><br />   while(PINC &amp; TCS_OUT_PIN);   // czekaj na zbocze opadajace<br /><br />   TCNT1 = 0x0000; // reset licznika<br /><br />   TCCR1B = (1 &lt;&lt; CS10); //Prescaller = F_CPU/1 (start zliczania)<br /><br />   while((PINC &amp; TCS_OUT_PIN) == 0);   // czekaj na zbocze narastajace<br /><br />   TCCR1B = 0x00; // zatrzymanie timera (koniec zliczania)<br /><br />   return (float)(11059.2/(2*TCNT1));<br />}<br /><br />void changeFilter(uint8_t filterNr) // zmiana filtra (R-&gt;G, G-&gt;B, B-&gt;R)<br />{<br />enum {R,G,B};<br /><br />switch(filterNr)<br />{<br />case R:<br />// set S2 &amp; S3 for R<br />// S2 = 0<br />// S3 = 0<br />PORTC &amp;= ~TCS_S2_PIN;<br />PORTC &amp;= ~TCS_S3_PIN;<br />break;<br /><br />case G:<br />// set S2 &amp; S3 for G<br />// S2 = 1<br />// S3 = 1<br />PORTC |= TCS_S2_PIN;<br />PORTC |= TCS_S3_PIN;<br />break;<br /><br />case B:<br />// set S2 &amp; S3 for B<br />// S2 = 0<br />// S3 = 1<br />PORTC &amp;= ~TCS_S2_PIN;<br />PORTC |= TCS_S3_PIN;<br />}<br />}<br /><br />float absValue(float value) // zamiennik abs() dla floatow<br />{<br />if(value &gt; 0)<br />{<br />return value;<br />}<br />return -value;<br />}<br /><br />uint8_t klawisz_wcisniety(void)<br />{<br />if(KEY_DOWN)// klawisz wciśnięty ?<br />{<br />_delay_ms(80);// czas drgań styków<br />if(KEY_DOWN) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />void showResults(void) // wyswietlenie wyniku pomiaru (R=x, G=y, B=z)<br />{<br />lcd_cls();<br /><br />for(uint8_t i = 0; i&lt;3; i++)<br />{<br />lcd_locate(i,0);<br />lcd_str(filterNames[i]);<br />lcd_int(singleMeasRes[i]);<br />lcd_str(&quot;.&quot;);<br />lcd_int((int)(singleMeasRes[i]*10)%10);<br />lcd_str(&quot;k&quot;);<br />}<br />}<br /><br /><br />partialRes processing(void)<br />{<br />enum {R,G,B};<br /><br />uint8_t minSum = 255;<br />int8_t minSumIndex = -1;<br /><br />float minDiv = 100;<br />int8_t minDivIndex = -1;<br /><br />float tempSum = 0;<br />float tempDiv = 0;<br /><br />for(int i=0; i&lt;3; i++)<br />{<br />tempSum += singleMeasRes[i];<br />}<br /><br />// -------------- wyswietlenie sumy (debug) ----------------<br />//lcd_locate(3,0);<br />//lcd_str(&quot;sum=&quot;);<br />//lcd_int(tempSum);<br />//lcd_str(&quot;.&quot;);<br />//lcd_int((int)(tempSum*10)%10);<br />// ---------------------------------------------------------<br /><br /><br />for(int i=0; i&lt;COL_NR; i++)<br />{<br />float temp = absValue(tempSum - sumRGB[i]);<br />if(temp &lt; minSum)<br />{<br />minSum = temp;<br />minSumIndex = i;<br />}<br />}<br /><br />// -------------- wyswietlenie minimalnej sumy i jej indeksu (debug) ----------------<br />//lcd_locate(0,8);<br />//lcd_str(&quot;mS=&quot;);<br />//lcd_int(minSum);<br />//<br />//lcd_locate(0,13);<br />//lcd_str(&quot;mSI=&quot;);<br />//lcd_int(minSumIndex+1);<br />// ----------------------------------------------------------------------------------<br /><br />tempDiv = singleMeasRes[R]/singleMeasRes[B];<br /><br />//  ---------  wyswietlenie stosunku R/B (debug) -----------<br />//lcd_locate(3,10);<br />//lcd_str(&quot;div=&quot;);<br />//lcd_int(tempDiv);<br />//lcd_str(&quot;.&quot;);<br />//lcd_int((int)(tempDiv*10)%10);<br />//lcd_int((int)(tempDiv*100)%10);<br />// ---------------------------------------------------------<br /><br />for(int i=0; i&lt;COL_NR; i++)<br />{<br />float temp = absValue(tempDiv - rbDiv[i]);<br />if(temp &lt; minDiv)<br />{<br />minDiv = temp;<br />minDivIndex = i;<br />}<br />}<br /><br />// -------------- wyswietlenie minimalnego stosunku R/B i jego indeksu (debug) ----------------<br />//lcd_locate(1,8);<br />//lcd_str(&quot;mD=&quot;);<br />//lcd_int(minDiv);<br />//lcd_str(&quot;.&quot;);<br />//lcd_int((int)(minDiv*10)%10);<br />//lcd_int((int)(minDiv*100)%10);<br />//<br />//lcd_locate(2,8);<br />//lcd_str(&quot;mDI=&quot;);<br />//lcd_int(minDivIndex+1);<br />// --------------------------------------------------------------------------------------------<br /><br />partialRes res;<br />res.mSI = minSumIndex+1;<br />res.mDI = minDivIndex+1;<br />return res;<br />}<br /><br /><br />void classify(void)<br />{<br />lcd_locate(0,0);<br />lcd_cls();<br />// ----------- wyswietlanie zawartosci tablic tabmSI i tabmDI -----------<br />//for(int i=0; i&lt;MEAS_NR; i++)<br />//{<br />//lcd_int(tabmSI[i]);<br />//lcd_str(&quot; &quot;);<br />//if(i == 4) lcd_locate(1,0);<br />//}<br />//lcd_locate(2,0);<br />//for(int i=0; i&lt;MEAS_NR; i++)<br />//{<br />//lcd_int(tabmDI[i]);<br />//lcd_str(&quot; &quot;);<br />//if(i == 4) lcd_locate(3,0);<br />//}<br />// ----------------------------------------------------------------------<br /><br />// ------- tabmSI + tabmDI =&gt; jedna tablica -------<br />int8_t tabDiff[2*MEAS_NR] = {};<br />for(int i=0; i&lt;MEAS_NR; i++)<br />tabDiff[i] = tabmSI[i];<br />for(int i=MEAS_NR; i&lt;(2*MEAS_NR); i++)<br />tabDiff[i] = tabmDI[i-MEAS_NR];<br />// ------------------------------------------------<br /><br />uint8_t diffVCnt = 0;<br /><br />// nowa tablica do ktorej przepisuje niepowtarzajace sie elementy tabDiff celem sprawdzenia ile jest elementow roznych<br />int8_t tabDiffNew[2*MEAS_NR] = {};<br /><br />// flaga == 0 -&gt; taki element juz jest w nowej tablicy, 1 -&gt; nie ma jeszcze<br />uint8_t flag = 0;<br />for(int i=0; i&lt;(2*MEAS_NR); i++)<br />{<br />for(int j=0; j!=i; j++)<br />{<br />if(tabDiffNew[j] != tabDiff[i])<br />{<br />flag = 1;<br />}<br />else<br />{<br />flag = 0;<br />break;<br />}<br />}<br /><br />if(flag != 0)<br />{<br />tabDiffNew[i] = tabDiff[i];<br />}<br />}<br /><br />for(int i=0; i&lt;(2*MEAS_NR); i++)<br />{<br />if(tabDiffNew[i] != 0)<br />{<br />diffVCnt++;<br />}<br />}<br /><br />lcd_locate(0,17);<br />lcd_int(diffVCnt);<br /><br />lcd_locate(1,0);<br /><br />uint8_t tabCnt[COL_NR] = {};<br />for(int i=0; i&lt;(2*MEAS_NR); i++)<br />{<br />tabCnt[tabDiff[i]-1]++;<br />}<br /><br />switch(diffVCnt)<br />{<br />case 1:<br />// pierwsza liczba z tabDiff -&gt; wynik<br />lcd_str(testObjNames[tabDiff[0]-1]);<br />break;<br />case 2:<br />case 4:<br />// max{rep} z tabDiff -&gt; wynik<br />{<br />uint8_t maxTabCnt = 0;<br />uint8_t maxTabCntI = -1;<br />for(int i=0; i&lt;COL_NR; i++)<br />{<br />if(tabCnt[i] &gt; maxTabCnt)<br />{<br />maxTabCnt = tabCnt[i];<br />maxTabCntI = i;<br />}<br />}<br /><br />lcd_locate(1,0);<br />lcd_str(testObjNames[maxTabCntI]);<br />break;<br />}<br />case 3:<br />// tabmSI czesc_wspolna tabmDI -&gt; wynik<br />{<br />uint8_t fComm = 0;<br />uint8_t commonPart = 0;<br />for(int i=0; i&lt;MEAS_NR; i++)<br />{<br />for(int j=0; j&lt;MEAS_NR; j++)<br />{<br />if(tabmSI[i] == tabmDI[j])<br />{<br />commonPart = tabmSI[i];<br />fComm = 1;<br />}<br />}<br />}<br /><br />lcd_locate(1,0);<br />if(fComm != 0)<br />{<br />lcd_str(testObjNames[commonPart-1]);<br />}<br />}<br />}<br /><br />lcd_locate(2,0);<br />for(int i=0; i&lt;COL_NR; i++)<br />{<br />lcd_int(tabCnt[i]);<br />lcd_str(&quot; &quot;);<br />if(i == 5) lcd_locate(3,0);<br />}<br />//lcd_cls();<br />}<br /><br />void colorClassifierInit()<br />{<br />lcd_init();<br />lcd_locate(0,0);<br /><br />DDRC &amp;= ~TCS_OUT_PIN;<br />DDRC |= (TCS_LED_PIN | TCS_S2_PIN | TCS_S3_PIN | TCS_OE_PIN);<br />PORTC |= TCS_OUT_PIN;// podciągnięcie pinu do VCC<br />PORTC |= TCS_LED_PIN;<br />}<br />[/syntax]<br /><br />Nieco tabulacja komentarzy się rozwaliła - w Eclipse jest większość optycznie wyrównana, tutaj nierówno, chyba system forum po prostu inaczej wyświetla.<br /><br />Jako, że jestem początkujący proszę o ocenę kodu, sugestie co można by było ulepszyć, zmienić.<br />Funkcja TCSMeasure jest mocno wzorowana na podobnym projekcie z sieci. Dostosowałem ją nieco do swoich potrzeb.<br />Wiem, że dostanie mi się za to i za użycie floatów. Można było się bez nich obyć, no ale używam ich w wielu miejscach a takie przeróbki tego na typ całkowitoliczbowy to chyba mają sens w jednym, dwóch miejscach w kodzie, ale nie co chwila. Łatwiej porównywać przecież 34.1 z 35.2 niż mnożyć to razy 10 czy 100 za każdym razem... Ale może się mylę...<br />Pewnie tego delaya w pętli głównej też warto zastąpić timerem programowym (?).<br /><br />Będę wdzięczny za wszelkie uwagi i sugestie co do tego kodu. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Więcej o moim projekcie jakby ktoś był ciekawy:<br /><!-- m --><a class="postlink" href="https://dl.dropbox.com/u/6082561/_9%20sem/PracProb/PrPr%231/MIKROPROCESOROWY%20KLASYFIKATOR%20KOLORU.pdf" >https://dl.dropbox.com/u/6082561/_9%20s ... KOLORU.pdf</a><!-- m --><br /><!-- m --><a class="postlink" href="https://dl.dropbox.com/u/6082561/_9%20sem/PracProb/PrProb%232/prezentacja2.pdf" >https://dl.dropbox.com/u/6082561/_9%20s ... tacja2.pdf</a><!-- m --><br /><!-- m --><a class="postlink" href="https://dl.dropbox.com/u/6082561/_9%20sem/PracProb/PrProb%20kons1.pdf" >https://dl.dropbox.com/u/6082561/_9%20s ... 0kons1.pdf</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 4 sty 2013, o 16:17</p><hr />
]]></content>
</entry>
</feed>