<?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=7715&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-28T18:30:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7715&amp;mode</id>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-12-28T18:30:19+01:00</updated>
<published>2014-12-28T18:30:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=110884#p110884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=110884#p110884"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=110884#p110884"><![CDATA[
Udało się w końcu polutować i przetestować jedną płytkę testową. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><a href="http://forum.atnel.pl/_obrazki/o/4440/0776c45c006bcf71514d3bd76e91f0d0.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4440/0776c45c006bcf71514d3bd76e91f0d0.jpg" alt="Obrazek" /></a><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br />Obok miga sobie mała płyteczka z STM32F030, która będzie docelowo tym sterować i komunikować się przez dwuprzewodową sieć. Teraz tylko zostało zlutować kilka takich kompletów, żeby było z czego tą sieć stworzyć. Dorzucam jeszcze aktualny kod biblioteki, wciąż w fazie beta.<br />P.S. Płytek mam nadmiar, więc mogę się podzielić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />MBI5040_lib.zip<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 28 gru 2014, o 18:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-08-08T22:29:39+01:00</updated>
<published>2014-08-08T22:29:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=90790#p90790</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=90790#p90790"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=90790#p90790"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Napisałem kiedyś prosty kod testowy do obserwowania wpływu ilości bitów PWM na płynność zapalania się diody (symulacja bezwładności włókna żarówki). Jak go znajdę i posprzątam to dołączę, każdy będzie mógł się pobawić, bo wykorzystuje PWM sprzętowy na timerze.<br /></div><br /><br />Wystarczy u góry w definicji wpisać sobie ilość bitów (maksymalnie 16), skompilować (pisane na atmegę8, na inne procesory może wymagać przeróbek) i można po podłączeniu diody pomiędzy PB2 i masę się pobawić, uzyskując jakiś tam kompromis pomiędzy częstotliwością migotania a płynnością zmian jasności. Stałe czasowe dobrałem analizując zachowanie żarówki do kierunkowskazów, można zmienić. Kod:<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 14-06-2014<br /> *      Author: Federerer<br /> */<br /><br /><br />// rozdzielczość pwm<br />#define BITS 12<br /><br /><br />#define MAX 0xFFFFFFFF<br />#define SHIFT (32-BITS)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />uint32_t pwm;<br />uint8_t mig;<br /><br />int main (void) {<br /><br />// konfiguracja timera 0<br />TCCR0 |= (1&lt;&lt;CS02);<br />TIMSK |= (1&lt;&lt;TOIE0);<br />TCNT0 = 101;<br /><br />// ustawienia timera 1, fast pwm tryb 14 brak preskalera<br />TCCR1A |= (1&lt;&lt;COM1B1) | (1&lt;&lt;WGM11);<br />TCCR1B |= (1&lt;&lt;WGM13) | (1&lt;&lt;WGM12) | (1&lt;&lt;CS10);<br /><br />// rozdzielczoć pwm<br />ICR1 = (uint16_t)(MAX&gt;&gt;SHIFT);<br /><br />// Port B jako wyjście<br />DDRB = (1&lt;&lt;PB2);<br /><br />sei();<br /><br />while(1) {<br /><br />for (uint8_t x=0; x&lt;10 ;x++){<br /><br />mig ^= 1;<br />_delay_ms(333);<br /><br />}<br /><br />_delay_ms(2000);<br /><br />}<br /><br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 101;<br />if (mig) {<br /><br />if (pwm &lt; MAX) {<br /><br />pwm += (MAX - pwm) / 16;// szybkoć rozpalania diody<br />OCR1B = pwm &gt;&gt; SHIFT;<br /><br />}<br /><br />}<br /><br />else {<br /><br />if (pwm &gt; 0) {<br /><br />pwm -= pwm / 15;// szybkoć wygasania diody<br />OCR1B = pwm &gt;&gt; SHIFT;<br /><br />}<br /><br />}<br /><br />// &quot;proteza&quot; pozwalająca uniknąć szpilek napięcia przy pwm = 0;<br /><br />if (OCR1B == 0) {<br /><br />DDRB &amp;= ~(1&lt;&lt;PB2);<br /><br />}<br /><br />else {<br /><br />DDRB |= (1&lt;&lt;PB2);<br /><br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 8 sie 2014, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-13T12:42:59+01:00</updated>
<published>2014-07-13T12:42:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87455#p87455</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87455#p87455"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87455#p87455"><![CDATA[
Załączam plik excela z wyliczeniami korekcji CIELab. Myślę, że wszystko jest dość czytelnie opisane. Dla chcących się pobawić, wpisujemy tylko rozdzielczość PWM w bitach w zielone pole i ewentualnie zmieniamy gammę dla porównania <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Machnąłem małą literówkę, powinno być &quot;L* [0-100]&quot; zamiast &quot;L* [1-100]&quot; ale to detal <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=4440">Federerer</a> — 13 lip 2014, o 12:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-12T14:23:03+01:00</updated>
<published>2014-07-12T14:23:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87347#p87347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87347#p87347"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87347#p87347"><![CDATA[
Wersja z makrami też działa, i nawet daje ten sam rozmiar kodu co użycie funkcji inline, co jest w sumie logiczne,oczywiście pod warunkiem dołączenia pgmspace.h w pliku MBI504.h, który przecież jest dołączany zarówno do main.c jak i MBI5040.c, więc tam już nie trzeba dołączać.<br /><br /><br />Wersja z makrami:<br />[syntax=c]/*<br /> * MBI5040.h<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#ifndef MBI5040_H_<br />#define MBI5040_H_<br /><br />#include &lt;avr/pgmspace.h&gt;<br /><br />// &quot;1&quot; - USI, &quot;0&quot; - Software SPI<br />#define HW_SPI 1<br /><br />// definicje wyprowadzeń mikrokontrolera<br />#define MBI_PORT PORTB<br />#define MBI_PORT_DIR DDRB<br />#define SDI (1&lt;&lt;PB6)<br />#define LE (1&lt;&lt;PB4)<br />#define DCLK (1&lt;&lt;PB7)<br />#define SDO (1&lt;&lt;PB5)<br /><br />// odczyt z tablicy korekcji<br />extern const uint16_t lab&#91;&#93;;<br />#define LAB(a) (pgm_read_word(&amp;lab&#91;a&#93;))<br /><br /><br />// inicjalizacja<br />void MBI5040_init();<br /><br />// wysyłanie bufora<br />void mbi5040_send(void * data);<br /><br />// korekcja jasnoci poszczególnych diod<br />void mbi5040_send_dot(void * data);<br /><br /><br />// funkcja HSV to RGB by sq8dsr, w sam raz do testów ;)<br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue);<br /><br /><br />#endif /* MBI5040_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 12 lip 2014, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-07-12T13:54:02+01:00</updated>
<published>2014-07-12T13:54:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87344#p87344</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87344#p87344"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87344#p87344"><![CDATA[
jeśli się wszystko kompiluje ładnie bez warningów to tak - jest poprawnie <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> — 12 lip 2014, o 13:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-12T13:23:58+01:00</updated>
<published>2014-07-12T13:23:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87342#p87342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87342#p87342"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87342#p87342"><![CDATA[
Czyli dokładnie to co chciałem uzyskać, nie widzę tych funkcji w pliku main.c korzystając z autouzupełniania. Tak trochę jak private w klasach w C++<br /><br />Tak działa:<br />[syntax=c]/*<br /> * MBI5040.h<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br />#ifndef MBI5040_H_<br />#define MBI5040_H_<br /><br />#include &lt;avr/pgmspace.h&gt;<br /><br />// &quot;1&quot; - USI, &quot;0&quot; - Software SPI<br />#define HW_SPI 1<br /><br />// definicje wyprowadzeń mikrokontrolera<br />#define MBI_PORT PORTB<br />#define MBI_PORT_DIR DDRB<br />#define SDI (1&lt;&lt;PB6)<br />#define LE (1&lt;&lt;PB4)<br />#define DCLK (1&lt;&lt;PB7)<br />#define SDO (1&lt;&lt;PB5)<br /><br />// odczyt z tablicy korekcji<br />extern const uint16_t lab&#91;&#93;;<br />inline uint16_t lab_read(uint8_t pwm);<br /><br />// inicjalizacja<br />void MBI5040_init();<br /><br />// wysyłanie bufora<br />void mbi5040_send(void * data);<br /><br />// korekcja jasnoci poszczególnych diod<br />void mbi5040_send_dot(void * data);<br /><br /><br />// funkcja HSV to RGB by sq8dsr, w sam raz do testów ;)<br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue);<br /><br />inline uint16_t lab_read(uint8_t pwm) {<br />return pgm_read_word(&amp;lab&#91;pwm&#93;);<br />}<br /><br /><br />#endif /* MBI5040_H_ */[/syntax]<br />Pytanie, czy jest poprawnie? <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=4440">Federerer</a> — 12 lip 2014, o 13:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-07-12T13:21:30+01:00</updated>
<published>2014-07-12T13:21:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87341#p87341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87341#p87341"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87341#p87341"><![CDATA[
static dla funkcji po pierwsze powoduje że staje się ona widoczna TYLKO w ramach tego pliku *.c a to powoduje że jest inaczej traktowana przez kompilator i czasem nawet może zostać zinlinowana <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... to już jak kompilatorowi wygodniej ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lip 2014, o 13:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-12T13:21:33+01:00</updated>
<published>2014-07-12T13:03:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87339#p87339</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87339#p87339"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87339#p87339"><![CDATA[
Znów podpowiedź w sam raz, bo właśnie zrobiłem funkcję inline myślę dlaczego mi nie działa - dałem ciało funkcji oczywiście w pliku .c zamiast .h <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> W przypadku funkcji static inline które już tam miałem wszystko działa, ale to pewnie dlatego, że one nie przyjmują żadnych argumentów z pliku main ani nic tam nie zwracają (dlatego dałem static)?<br /><br />Edit:<br /><br />Czy w takim razie pgmspace.h dołączam również w pliku .h?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 12 lip 2014, o 13:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-07-12T12:46:24+01:00</updated>
<published>2014-07-12T12:46:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87335#p87335</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87335#p87335"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87335#p87335"><![CDATA[
<div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Choć z drugiej strony makra powinny działać szybciej... Czyli coś za coś.<br /></div><br /><br />Wiesz tu szybkość to byłaby istotna może dopiero wtedy gdybyś chciał robić sobie na tych LED'ach ekran RGB <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a tak ?<br /><br />a tak to uwierz że różnice żadne a zawsze masz jeszcze trzecie wyjście <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> podpowiem<br /><br />zrobić funkcje INLINOWE zamiast tych makr, ale pamiętasz mam nadzieję, że ciała tych funkcji jeśli chodzi o C umieszczamy w plikach *.h a nie źródłowych *.c<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lip 2014, o 12:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-12T12:58:14+01:00</updated>
<published>2014-07-12T12:21:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87329#p87329</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87329#p87329"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87329#p87329"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent">nie chcesz jej podciągać ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zastąp sobie makra funkcjami w bibliotece i wtedy się okaże że nie musisz w main.c podciągać - sprawa jak widzisz dość prosta<br /></div></div><br />No i to jest właśnie to na co nie wpadłem, dzięki! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Choć z drugiej strony makra powinny działać szybciej... Czyli coś za coś. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />No jeśli się tym już jak widać sporo pobawiłeś i zbadałeś (mi zabrakło wcześniej czasu na CIElab a gamma też dawał radę) ... to oczywiście chętnie skorzystam z sugestii jeśli jakieś masz i wrzucę też do MkAvrCalca jak dam radę ... wtedy wszyscy będziemy mieli do dyspozycji dwa rodzaje korekcji w razie czego<br /></div><br /><br />W takim razie jak znajdę chwilę to dopisze komentarze i wrzucę plik excela z obliczeniami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 12 lip 2014, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-07-12T11:58:15+01:00</updated>
<published>2014-07-12T11:58:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87323#p87323</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87323#p87323"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87323#p87323"><![CDATA[
<div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Chodzi mi o to, że korzystając z mojej biblioteki muszę pamiętać o tym, żeby dołączyć również pgmspace.h a chciałbym, żeby to następowało automatycznie<br /></div><br /><br />No to dobrze że musisz pamiętać - tak się programuje w C, gdy trzeba to dołączasz biblioteki ... bo sam sobie wyjaśniłeś, że skoro korzystasz z makr, które korzystają z kolei z pgm_read_xxx() no to chyba oczywiste że musisz podciągnąć tą bibliotekę<br /><br />nie chcesz jej podciągać ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zastąp sobie makra funkcjami w bibliotece i wtedy się okaże że nie musisz w main.c podciągać - sprawa jak widzisz dość prosta<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Tak więc korekcję gamma czy nie-gamma stosujemy nie dlatego, że dioda świeci nieliniowo a dlatego, że wzrok człowieka działa nieliniowo.<br /></div><br /><br />Tak to słuszna uwaga.<br /><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />użyłem 256-elementowej tablicy, więc w efekcie użytkownik korzysta z niej jak z normalnego 8 bitowego PWM<br /></div><br /><br />no ale każdy element 16-bitowy więc tablica i tak puchnie dwa razy - nie mniej jednak zdecydowanie zgadzam się z tym, że jeśli JUŻ chcieć robić fajne efekty to nie ma co żałować na pamięci Flash bo i tak wrzucamy ją do flasha <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a cóż to jest dla procka zmieścić 1,5kb tablic <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ....<br /><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Jeszcze małe porównanie (zawęziłem specjalnie zakres żeby było widać różnicę):<br /></div><br /><br />No tym suwakiem w MkAvrCalculator można sobie jak widać regulować sobie krzywą współczynnika korekcji gamma - ale dla CIElab .. trzeba by było rzeczywiście użyć innego wzoru ...<br /><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Co do MkAvrKalkulatora, to bardzo łatwo można rozszerzyć jego funkcjonalność o korekcję opartą o model CIELab. W razie czego chętnie służę pomocą.<br /></div><br /><br />No jeśli się tym już jak widać sporo pobawiłeś i zbadałeś (mi zabrakło wcześniej czasu na CIElab a gamma też dawał radę) ... to oczywiście chętnie skorzystam z sugestii jeśli jakieś masz i wrzucę też do MkAvrCalca jak dam radę ... wtedy wszyscy będziemy mieli do dyspozycji dwa rodzaje korekcji w razie czego <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> — 12 lip 2014, o 11:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-12T11:28:17+01:00</updated>
<published>2014-07-12T11:28:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87319#p87319</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87319#p87319"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87319#p87319"><![CDATA[
No więc tak:<br />w pliku MBI5040.h mam zdefiniowane makro, podpatrzone zresztą z MkAvrCalkulatora <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />[syntax=c]#define LAB(a) (pgm_read_word(&amp;lab&#91;a&#93;))[/syntax]<br />natomiast w pliku MBI5040.c mam zdefiniowaną tablicę w pamięci flash, więc muszę do niego dołączyć pgmspace.h.<br />[syntax=c]#include &lt;avr/pgmspace.h&gt;<br /><br />const uint16_t lab&#91;&#93; PROGMEM = {<br />0, 28, 57, 85, 113, 142, 170, 198, 227, 255, 283, 312, 340, 368,<br />397, 425, 453, 482, 510, 538, 567, 595, 625, 655, 686, 718, 751,<br />785, 821, 857, 894, 933, 972, 1012, 1054, 1097, 1141, 1186, 1232,<br />1279, 1328, 1378, 1429, 1481, 1535, 1590, 1646, 1703, 1762, 1822,<br />1883, 1946, 2010, 2076, 2143, 2211, 2281, 2352, 2425, 2500, 2575,<br />2653, 2731, 2812, 2894, 2977, 3062, 3149, 3237, 3327, 3419, 3512,<br />3607, 3704, 3802, 3902, 4004, 4108, 4213, 4320, 4429, 4540, 4652,<br />4767, 4883, 5001, 5121, 5243, 5367, 5493, 5621, 5751, 5882, 6016,<br />6152, 6289, 6429, 6571, 6715, 6861, 7009, 7159, 7312, 7466, 7623,<br />7782, 7943, 8106, 8272, 8439, 8609, 8781, 8956, 9133, 9312, 9493,<br />9677, 9863, 10052, 10243, 10436, 10632, 10830, 11030, 11234, 11439,<br />11647, 11858, 12071, 12286, 12504, 12725, 12948, 13174, 13403, 13634,<br />13868, 14104, 14343, 14585, 14830, 15077, 15327, 15579, 15835, 16093,<br />16354, 16618, 16885, 17154, 17426, 17702, 17980, 18261, 18545, 18831,<br />19121, 19414, 19710, 20008, 20310, 20615, 20922, 21233, 21547, 21864,<br />22184, 22507, 22833, 23163, 23495, 23831, 24170, 24512, 24857, 25206,<br />25558, 25913, 26271, 26632, 26997, 27366, 27737, 28112, 28490, 28872,<br />29257, 29645, 30037, 30432, 30831, 31233, 31639, 32048, 32461, 32877,<br />33297, 33720, 34147, 34578, 35012, 35450, 35891, 36336, 36785, 37237,<br />37693, 38153, 38616, 39083, 39554, 40029, 40507, 40990, 41476, 41966,<br />42460, 42957, 43459, 43964, 44473, 44987, 45504, 46025, 46550, 47079,<br />47612, 48149, 48690, 49235, 49785, 50338, 50895, 51457, 52022, 52592,<br />53166, 53744, 54326, 54912, 55503, 56097, 56696, 57300, 57907, 58519,<br />59135, 59755, 60380, 61009, 61642, 62280, 62922, 63569, 64220, 64875,<br />65535<br />};[/syntax]<br />W pliku main.c korzystam z makra, więc muszę do niego również dołączyć pgmspace.h, bo jeśli tego nie zrobię to dostaję błąd:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">main.c:(.text+0x5e): undefined reference to `pgm_read_word'<br />main.c:(.text+0x76): undefined reference to `pgm_read_word'<br />main.c:(.text+0x8e): undefined reference to `pgm_read_word'<br />make: *** &#91;MBI_TEST.elf&#93; Error 1</div><br />Chodzi mi o to, że korzystając z mojej biblioteki muszę pamiętać o tym, żeby dołączyć również pgmspace.h a chciałbym, żeby to następowało automatycznie wraz z dołączeniem mojej biblioteki, tylko nie wiem jak to zrobić poprawnie.<br /><br />Co do MkAvrKalkulatora, to bardzo łatwo można rozszerzyć jego funkcjonalność o korekcję opartą o model CIELab. W razie czego chętnie służę pomocą.<br />Pozwolę sobie jeszcze odnieść się do przytoczonego tekstu na blogu, gdzie załączone są charakterystyki prądowo-napięciowe diod LED. Owszem są one nieliniowe, ale przy użyciu PWM do regulacji jasności korzystamy zwykle ze źródła prądowego do zasilania diod (ewentualnie rezystora), więc jej jasność zależy tylko i wyłącznie od współczynnika wypełnienia PWM (pomijam wpływ zmian temperatury złącza, przy małych diodach i prądach jest pomijalny). Tak więc korekcję gamma czy nie-gamma stosujemy nie dlatego, że dioda świeci nieliniowo a dlatego, że wzrok człowieka działa nieliniowo. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Korzystam z 16 bitowego PWM z powodu tego, że przy 8 bitowym nie udawało mi się uzyskać ładnych przejść przy małych poziomach jasności. Wynika to z tego, że czułość oka ludzkiego na zmianę natężenia światła jest zależna od... samego natężenia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Chodzi o to, że bez problemu dostrzeżemy zmianę pomiędzy wypełnieniem np 2 a 12, natomiast zmiana pomiędzy 245 a 255 będzie trudna do zauważenia. Jest to szczegółowo opisane w drugim załączonym przeze mnie linku. W dużym uproszczeniu: obserwator zauważa zmianę natężenia jeżeli wynosi ona 1/64 pierwotnego natężenia (wartości tego ułamka są różne w zależności od źródła). <br />Moja korekcja jest o tyle przyjazna, że użyłem 256-elementowej tablicy, więc w efekcie użytkownik korzysta z niej jak z normalnego 8 bitowego PWM, tyle że już skorygowanego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jeszcze małe porównanie (zawęziłem specjalnie zakres żeby było widać różnicę):<br /><a href="http://forum.atnel.pl/_obrazki/o/4440/076d3d95dfefd7b330d2726cc9559fbf.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4440/076d3d95dfefd7b330d2726cc9559fbf.jpg" alt="Obrazek" /></a><br />Napisałem kiedyś prosty kod testowy do obserwowania wpływu ilości bitów PWM na płynność zapalania się diody (symulacja bezwładności włókna żarówki). Jak go znajdę i posprzątam to dołączę, każdy będzie mógł się pobawić, bo wykorzystuje PWM sprzętowy na timerze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 12 lip 2014, o 11:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-07-12T09:12:26+01:00</updated>
<published>2014-07-12T09:12:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87298#p87298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87298#p87298"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87298#p87298"><![CDATA[
<div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />Działa, gdy dołączę go tylko w pliku nagłówkowym biblioteki, ale tak się chyba nie powinno robić?<br /></div><br /><br />plik nagłówkowy dołącza się za pomocą #include tylko w tych plikach *.c w których korzystasz z funkcji w nim istniejących. Ale jego zainkludowanie przypadkowe w innych plikach źródłowych wcale nie przynosi żadnego warninga - więc pewnie masz coś innego źle <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ale ciężko coś podpowiedzieć bo opisujesz to tylko na zasadzie, że coś ci działa albo nie działa ... więc reszty to już trzeba się domyślać albo być jasnowidzem. Opisz dokładnie błąd, fragment kodu itp żeby można było pomóc<br /><br /><div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />ale korekcja w oparciu o CIELab według mnie ma przewagę nad użyciem gammy<br /></div><br /><br />Ale to nie jest tak że wg ciebie ma a wg innych nie ma <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... CIElab zawsze ma przewagę nad gamma ... bo CIElab do tego został stworzony w przeciwieństwie do gamma <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />I pewnie w przypadku rozdzielczości PWM 16-bit jest to lepiej widoczne .,.... ale tak na prawdę narzędziem do dowolnej zmiany współczynnika gamma w MkAvrCalculator <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2013/09/gamma-correction-nowe-narzedzie-w.html" >http://mirekk36.blogspot.com/2013/09/ga ... zie-w.html</a><!-- m --><br /><br />można uzyskać podobne hmm zbliżone efekty dla oka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... <br /><br />Nie mniej jednak - bardzo fajnie jest się pobawić coraz lepszymi profilami kolorów niż RGB czyli HSV no i CIElab szczególnie <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> — 12 lip 2014, o 09:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-11T23:29:04+01:00</updated>
<published>2014-07-11T23:29:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87290#p87290</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87290#p87290"/>
<title type="html"><![CDATA[Re: MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87290#p87290"><![CDATA[
Trochę po cichu liczyłem na opinie co można zrobić lepiej albo poprawić, bo dopiero zaczynam i pewnie coś się znajdzie a tu cisza. <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> No nic to lecimy dalej, bo korekcja nie-gamma gotowa. Nie-gamma dlatego, że skorzystałem z równań używanych w modelu CIELab do opisu luminancji, które powinny zasadniczo opisywać nieliniowość odbierania jasności przez oko ludzkie, choć problem wydaje się być dużo bardziej złożony. Moja korekcja bazuje na tym artykule:<br /><a href="http://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/"  class="postlink">http://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/</a><br />Widać, że różnice nie są duże, ale korekcja w oparciu o CIELab według mnie ma przewagę nad użyciem gammy w zakresie niewielkich jasności (L* poniżej 8), gdzie zależność opisywana jest za pomocą równania liniowego, w efekcie czego dostajemy mniej zer na początku tablicy.<br />Dokładniejszy opis odczuwania jasności przez człowieka można znaleźć tu:<br /><a href="http://www.telescope-optics.net/eye_intensity_response.htm"  class="postlink">http://www.telescope-optics.net/eye_intensity_response.htm</a><br />Wzory z których korzystałem tu:<br /><a href="http://www.brucelindbloom.com/index.html?Equations.html"  class="postlink">http://www.brucelindbloom.com/index.html?Equations.html</a><br /><br />Kod po modyfikacjach wygląda tak:<br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;MBI5040.h&quot;<br /><br />uint16_t bufor&#91;16&#93;, hue;<br />uint32_t calc&#91;16&#93;;<br />uint8_t dot&#91;16&#93;, red, green, blue;<br /><br />int main (void) {<br /><br /><br /><br />TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);// konfiguracja timera 0<br />TIMSK |= (1&lt;&lt;TOIE0);<br />TCNT0 = 179;<br /><br />MBI5040_init();// ustawienie portów dla MBI<br />memset(dot,0x80,sizeof dot);// wszystkie diody na &quot;pół gwizdka&quot;<br />memset(bufor,0xffff,sizeof bufor);// wszystkie diody na &quot;pół gwizdka&quot;<br />dot&#91;0&#93;=0x7f;// korekcja RGB dla uzyskania koloru białego<br />dot&#91;1&#93;=0xff;<br />dot&#91;2&#93;=0x6f;<br />mbi5040_send_dot(&amp;dot);// wysłanie korekcji do układu<br />mbi5040_send(&amp;bufor);<br />_delay_ms(2000);<br /><br />sei();<br /><br />while(1) {<br /><br />}<br /><br />}<br /><br />ISR(TIMER0_OVF_vect) {<br /><br />TCNT0 = 179;<br /><br />hsv_to_rgb_8(hue, 255, 255, &amp;red, &amp;green, &amp;blue);<br /><br />bufor&#91;0&#93;=LAB((red));<br />bufor&#91;1&#93;=LAB((green));<br />bufor&#91;2&#93;=LAB((blue));<br /><br />hue++;<br />if(hue&gt;1529) hue=0;<br /><br />mbi5040_send(&amp;bufor);<br /><br />}[/syntax]<br /><br />MBI5040.h<br />[syntax=c]/*<br /> * MBI5040.h<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#ifndef MBI5040_H_<br />#define MBI5040_H_<br /><br />// &quot;1&quot; - USI, &quot;0&quot; - Software SPI<br />#define HW_SPI 1<br /><br />// definicje wyprowadzeń mikrokontrolera<br />#define MBI_PORT PORTB<br />#define MBI_PORT_DIR DDRB<br />#define SDI (1&lt;&lt;PB6)<br />#define LE (1&lt;&lt;PB4)<br />#define DCLK (1&lt;&lt;PB7)<br />#define SDO (1&lt;&lt;PB5)<br /><br />// odczyt z tablicy korekcji<br />#define LAB(a) (pgm_read_word(&amp;lab&#91;a&#93;))<br />extern const uint16_t lab&#91;&#93;;<br /><br /><br />// inicjalizacja<br />void MBI5040_init();<br /><br />// wysyłanie bufora<br />void mbi5040_send(void * data);<br /><br />// korekcja jasnoci poszczególnych diod<br />void mbi5040_send_dot(void * data);<br /><br /><br />// funkcja HSV to RGB by sq8dsr, w sam raz do testów ;)<br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue);<br /><br /><br />#endif /* MBI5040_H_ */[/syntax]<br /><br />MBI5040.c<br />[syntax=c]/*<br /> * MBI5040.c<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include  &quot;MBI5040.h&quot;<br /><br />const uint16_t lab&#91;&#93; PROGMEM = {<br />0, 28, 57, 85, 113, 142, 170, 198, 227, 255, 283, 312, 340, 368,<br />397, 425, 453, 482, 510, 538, 567, 595, 625, 655, 686, 718, 751,<br />785, 821, 857, 894, 933, 972, 1012, 1054, 1097, 1141, 1186, 1232,<br />1279, 1328, 1378, 1429, 1481, 1535, 1590, 1646, 1703, 1762, 1822,<br />1883, 1946, 2010, 2076, 2143, 2211, 2281, 2352, 2425, 2500, 2575,<br />2653, 2731, 2812, 2894, 2977, 3062, 3149, 3237, 3327, 3419, 3512,<br />3607, 3704, 3802, 3902, 4004, 4108, 4213, 4320, 4429, 4540, 4652,<br />4767, 4883, 5001, 5121, 5243, 5367, 5493, 5621, 5751, 5882, 6016,<br />6152, 6289, 6429, 6571, 6715, 6861, 7009, 7159, 7312, 7466, 7623,<br />7782, 7943, 8106, 8272, 8439, 8609, 8781, 8956, 9133, 9312, 9493,<br />9677, 9863, 10052, 10243, 10436, 10632, 10830, 11030, 11234, 11439,<br />11647, 11858, 12071, 12286, 12504, 12725, 12948, 13174, 13403, 13634,<br />13868, 14104, 14343, 14585, 14830, 15077, 15327, 15579, 15835, 16093,<br />16354, 16618, 16885, 17154, 17426, 17702, 17980, 18261, 18545, 18831,<br />19121, 19414, 19710, 20008, 20310, 20615, 20922, 21233, 21547, 21864,<br />22184, 22507, 22833, 23163, 23495, 23831, 24170, 24512, 24857, 25206,<br />25558, 25913, 26271, 26632, 26997, 27366, 27737, 28112, 28490, 28872,<br />29257, 29645, 30037, 30432, 30831, 31233, 31639, 32048, 32461, 32877,<br />33297, 33720, 34147, 34578, 35012, 35450, 35891, 36336, 36785, 37237,<br />37693, 38153, 38616, 39083, 39554, 40029, 40507, 40990, 41476, 41966,<br />42460, 42957, 43459, 43964, 44473, 44987, 45504, 46025, 46550, 47079,<br />47612, 48149, 48690, 49235, 49785, 50338, 50895, 51457, 52022, 52592,<br />53166, 53744, 54326, 54912, 55503, 56097, 56696, 57300, 57907, 58519,<br />59135, 59755, 60380, 61009, 61642, 62280, 62922, 63569, 64220, 64875,<br />65535<br />};<br /><br />#if HW_SPI==0<br /><br />static inline void dclk_low(void) {<br />MBI_PORT &amp;= ~DCLK;<br />}<br /><br />static inline void dclk_high(void) {<br />MBI_PORT |= DCLK;<br />}<br /><br />#endif<br /><br />static inline void dclk_pulse(void) {<br />MBI_PORT |= DCLK;<br />MBI_PORT &amp;= ~DCLK;<br />}<br /><br />static inline void le_low(void) {<br />MBI_PORT &amp;= ~LE;<br />}<br /><br />static inline void le_high(void) {<br />MBI_PORT |= LE;<br />}<br /><br />static inline void sdi_low(void) {<br />MBI_PORT &amp;= ~SDI;<br />}<br /><br />static inline void sdi_high(void) {<br />MBI_PORT |= SDI;<br />}<br /><br />void usi_send(uint8_t data) {<br /><br />  USIDR = data;<br />  USISR |= (1&lt;&lt;USIOIF);<br /><br />  while ( !(USISR &amp; (1&lt;&lt;USIOIF))) {<br />   USICR = (1&lt;&lt;USIWM0)|(1&lt;&lt;USICS1)|(1&lt;&lt;USICLK)|(1&lt;&lt;USITC);<br /><br />  }<br /><br />}<br /><br /><br />void MBI5040_init(void) {<br /><br />MBI_PORT_DIR |= (SDI | DCLK | LE);<br />MBI_PORT_DIR &amp;= ~(SDO);<br />le_high();<br />dclk_pulse();<br />dclk_pulse();<br />dclk_pulse();<br />le_low();<br /><br />}<br /><br />void mbi5040_send(void *data) {<br /><br />uint8_t byte;<br />uint16_t tmp;<br /><br />le_high();<br /><br />#if HW_SPI==0<br /><br /><br /><br />for (byte=16; byte&gt;0; byte--) {<br /><br />tmp=*((uint16_t*)data+byte-1);<br /><br />for (uint8_t bit=0; bit&lt;16; bit++) {<br /><br />if (tmp&amp;0x8000) {<br />sdi_high();<br />}<br />else {<br />sdi_low();<br />}<br /><br />dclk_pulse();<br />tmp&lt;&lt;=1;<br /><br />}<br /><br />}<br /><br />#else<br />for (byte=16; byte&gt;0; byte--) {<br />tmp=*((uint16_t*)data+byte-1);<br />usi_send(tmp&gt;&gt;8);<br />usi_send(tmp);<br />}<br />#endif<br /><br />le_low();<br />sdi_low();<br /><br />}<br /><br />void mbi5040_send_dot(void *data) {<br /><br />uint8_t byte;<br />uint8_t bit;<br />uint8_t tmp;<br /><br /><br />le_high();<br />dclk_pulse();<br />le_low();<br /><br />for (byte=8; byte&gt;0; byte--) {<br /><br />tmp=*((uint8_t*)data+byte-1);<br /><br />for (bit=0; bit&lt;8; bit++) {<br /><br />if (tmp&amp;0x80) {<br />sdi_high();<br />}<br />else {<br />sdi_low();<br />}<br /><br />dclk_pulse();<br />tmp&lt;&lt;=1;<br /><br />}<br /><br />}<br /><br />le_high();<br />le_low();<br />sdi_low();<br /><br />}<br /><br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue) {<br /><br /><br />uint16_t red_val, green_val, blue_val;<br /><br />        while (hue &gt; 1529) hue -= 1530;<br />        while (hue &lt; 0) hue += 1530;<br /><br />        if (hue &lt; 255) {<br />           red_val = 255;<br />           green_val = (65280 - sat * (255 - hue)) &gt;&gt; 8;<br />           blue_val = 255 - sat;<br />        }<br />        else if (hue &lt; 510) {<br />           red_val = (65280 - sat * (hue - 255)) &gt;&gt; 8;<br />           green_val = 255;<br />           blue_val = 255 - sat;<br />        }<br />        else if (hue &lt; 765) {<br />           red_val = 255 - sat;<br />           green_val = 255;<br />           blue_val = (65280 - sat * (765 - hue)) &gt;&gt; 8;<br />        }<br />        else if (hue &lt; 1020) {<br />           red_val = 255 - sat;<br />           green_val = (65280 - sat * (hue - 765)) &gt;&gt; 8;<br />           blue_val = 255;<br />        }<br />        else if (hue &lt; 1275) {<br />           red_val = (65280 - sat * (1275 - hue)) &gt;&gt; 8;<br />           green_val = 255 - sat;<br />           blue_val = 255;<br />        }<br />        else {<br />           red_val = 255;<br />           green_val = 255 - sat;<br />           blue_val = (65280 - sat * (hue - 1275)) &gt;&gt; 8;<br />        }<br /><br />        *red = ((bri + 1) * red_val) &gt;&gt; 8;<br />        *green = ((bri + 1) * green_val) &gt;&gt; 8;<br />        *blue = ((bri + 1) * blue_val) &gt;&gt; 8;<br />}[/syntax]<br /><br />Zauważyłem, że kompilator wyrzuca błąd, gdy  pgmspace.h nie jest dołączony zarówno do pliku main.c jak i MBI5040.c, chciałbym, żeby wystarczyło dołączenie go w pliku biblioteki. Działa, gdy dołączę go tylko w pliku nagłówkowym biblioteki, ale tak się chyba nie powinno robić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 11 lip 2014, o 23:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-07-11T23:29:33+01:00</updated>
<published>2014-07-09T12:53:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87063#p87063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87063#p87063"/>
<title type="html"><![CDATA[MBI5040 - pierwszy projekt.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7715&amp;p=87063#p87063"><![CDATA[
Witam wszystkich serdecznie.<br /><br />Jako, że niedomagania BASCOMA w kwestii obsługi timerów i pwm sprowokowały mnie do przejścia na C, naskrobałem sobie prosty kod do obsługi tego ciekawego układu, który wygląda tak:<br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;MBI5040.h&quot;<br /><br />uint16_t bufor&#91;16&#93;, hue;<br />uint32_t calc&#91;16&#93;;<br />uint8_t dot&#91;16&#93;, red, green, blue;<br /><br />int main (void) {<br /><br /><br /><br />TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);// konfiguracja timera 0<br />TIMSK |= (1&lt;&lt;TOIE0);<br />TCNT0 = 101;<br /><br />MBI5040_init();// ustawienie portów dla MBI<br />memset(dot,0x80,sizeof dot);// wszystkie diody na &quot;pół gwizdka&quot;<br />memset(bufor,0xffff,sizeof bufor);// wszystkie diody na &quot;pół gwizdka&quot;<br />dot&#91;0&#93;=0x65;// korekcja RGB dla uzyskania koloru białego<br />dot&#91;1&#93;=0x90;<br />dot&#91;2&#93;=0xff;<br />mbi5040_send_dot(&amp;dot);// wysłanie korekcji do układu<br />mbi5040_send(&amp;bufor);<br />_delay_ms(2000);<br /><br />sei();<br /><br />while(1) {<br /><br />}<br /><br />}<br /><br />ISR(TIMER0_OVF_vect) {<br /><br />TCNT0 = 101;<br /><br />hsv_to_rgb_8(hue, 255, 255, &amp;red, &amp;green, &amp;blue);<br /><br />bufor&#91;0&#93;=(blue&lt;&lt;8);<br />bufor&#91;1&#93;=(green&lt;&lt;8);<br />bufor&#91;2&#93;=(red&lt;&lt;8);<br /><br />hue++;<br />if(hue&gt;1529) hue=0;<br /><br />mbi5040_send(&amp;bufor);<br /><br />}[/syntax]<br /><br />MBI5040.h<br />[syntax=c]/*<br /> * MBI5040.h<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br />#ifndef MBI5040_H_<br />#define MBI5040_H_<br /><br />// definicje wyprowadzeń mikrokontrolera<br /><br />#define HW_SPI 1// &quot;1&quot; - USI, &quot;0&quot; - Software SPI<br /><br />#define MBI_PORT PORTB<br />#define MBI_PORT_DIR DDRB<br />#define SDI (1&lt;&lt;PB6)<br />#define LE (1&lt;&lt;PB4)<br />#define DCLK (1&lt;&lt;PB7)<br />#define SDO (1&lt;&lt;PB5)<br /><br /><br />// inicjalizacja<br />void MBI5040_init();<br /><br />// wysyłanie bufora<br />void mbi5040_send(void * data);<br /><br />//korekcja<br />void mbi5040_send_dot(void * data);<br /><br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue);  //funkcja HSV to RGB by sq8dsr, w sam raz do testów ;)<br /><br /><br />#endif /* MBI5040_H_ */[/syntax]<br /><br />MBI5040.c<br />[syntax=c]/*<br /> * MBI5040.c<br /> *<br /> *  Created on: 03-07-2014<br /> *      Author: Federerer<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include  &quot;MBI5040.h&quot;<br /><br />#if HW_SPI==0<br /><br />static inline void dclk_low(void) {<br />MBI_PORT &amp;= ~DCLK;<br />}<br /><br />static inline void dclk_high(void) {<br />MBI_PORT |= DCLK;<br />}<br /><br />#endif<br /><br />static inline void dclk_pulse(void) {<br />MBI_PORT |= DCLK;<br />MBI_PORT &amp;= ~DCLK;<br />}<br /><br />static inline void le_low(void) {<br />MBI_PORT &amp;= ~LE;<br />}<br /><br />static inline void le_high(void) {<br />MBI_PORT |= LE;<br />}<br /><br />static inline void sdi_low(void) {<br />MBI_PORT &amp;= ~SDI;<br />}<br /><br />static inline void sdi_high(void) {<br />MBI_PORT |= SDI;<br />}<br /><br />void usi_send(uint8_t data) {<br /><br />  USIDR = data;<br />  USISR |= (1&lt;&lt;USIOIF);<br /><br />  while ( !(USISR &amp; (1&lt;&lt;USIOIF))) {<br />   USICR = (1&lt;&lt;USIWM0)|(1&lt;&lt;USICS1)|(1&lt;&lt;USICLK)|(1&lt;&lt;USITC);<br /><br />  }<br /><br />}<br /><br /><br />void MBI5040_init(void) {<br /><br />MBI_PORT_DIR |= (SDI | DCLK | LE);<br />MBI_PORT_DIR &amp;= ~(SDO);<br />le_high();<br />dclk_pulse();<br />dclk_pulse();<br />dclk_pulse();<br />le_low();<br /><br />}<br /><br />void mbi5040_send(void *data) {<br /><br />uint8_t byte;<br />uint16_t tmp;<br /><br />le_high();<br /><br />#if HW_SPI==0<br /><br /><br /><br />for (byte=16; byte&gt;0; byte--) {<br /><br />tmp=*((uint16_t*)data+byte-1);<br /><br />for (uint8_t bit=0; bit&lt;16; bit++) {<br /><br />if (tmp&amp;0x8000) {<br />sdi_high();<br />}<br />else {<br />sdi_low();<br />}<br /><br />dclk_pulse();<br />tmp&lt;&lt;=1;<br /><br />}<br /><br />}<br /><br />#else<br />for (byte=16; byte&gt;0; byte--) {<br />tmp=*((uint16_t*)data+byte-1);<br />usi_send(tmp&gt;&gt;8);<br />usi_send(tmp);<br />}<br />#endif<br /><br />le_low();<br />sdi_low();<br /><br />}<br /><br />void mbi5040_send_dot(void *data) {<br /><br />uint8_t byte;<br />uint8_t bit;<br />uint8_t tmp;<br /><br /><br />le_high();<br />dclk_pulse();<br />le_low();<br /><br />for (byte=8; byte&gt;0; byte--) {<br /><br />tmp=*((uint8_t*)data+byte-1);<br /><br />for (bit=0; bit&lt;8; bit++) {<br /><br />if (tmp&amp;0x80) {<br />sdi_high();<br />}<br />else {<br />sdi_low();<br />}<br /><br />dclk_pulse();<br />tmp&lt;&lt;=1;<br /><br />}<br /><br />}<br /><br />le_high();<br />le_low();<br />sdi_low();<br /><br />}<br /><br />void hsv_to_rgb_8(uint16_t hue, uint16_t sat, uint16_t bri, uint8_t *red, uint8_t *green, uint8_t *blue) {<br /><br /><br />uint16_t red_val, green_val, blue_val;<br /><br />        while (hue &gt; 1529) hue -= 1530;<br />        while (hue &lt; 0) hue += 1530;<br /><br />        if (hue &lt; 255) {<br />           red_val = 255;<br />           green_val = (65280 - sat * (255 - hue)) &gt;&gt; 8;<br />           blue_val = 255 - sat;<br />        }<br />        else if (hue &lt; 510) {<br />           red_val = (65280 - sat * (hue - 255)) &gt;&gt; 8;<br />           green_val = 255;<br />           blue_val = 255 - sat;<br />        }<br />        else if (hue &lt; 765) {<br />           red_val = 255 - sat;<br />           green_val = 255;<br />           blue_val = (65280 - sat * (765 - hue)) &gt;&gt; 8;<br />        }<br />        else if (hue &lt; 1020) {<br />           red_val = 255 - sat;<br />           green_val = (65280 - sat * (hue - 765)) &gt;&gt; 8;<br />           blue_val = 255;<br />        }<br />        else if (hue &lt; 1275) {<br />           red_val = (65280 - sat * (1275 - hue)) &gt;&gt; 8;<br />           green_val = 255 - sat;<br />           blue_val = 255;<br />        }<br />        else {<br />           red_val = 255;<br />           green_val = 255 - sat;<br />           blue_val = (65280 - sat * (hue - 1275)) &gt;&gt; 8;<br />        }<br /><br />        *red = ((bri + 1) * red_val) &gt;&gt; 8;<br />        *green = ((bri + 1) * green_val) &gt;&gt; 8;<br />        *blue = ((bri + 1) * blue_val) &gt;&gt; 8;<br />}[/syntax]<br /><br />Kod napisany pod attiny2313, bo tylko taki procesor z wyjściem wewnętrznego zegara miałem pod ręką (zegar jest potrzebny dla układu MBI). Docelowo użyję pewnie attiny88. Brakuje jeszcze procedur zapisu do rejestru konfiguracyjnego i odczytu errorów (czy w ogóle potrzebne?), ale pewnie dopiszę niedługo.<br /><br />Pomiary:<br />Korzystając z programowego SPI, czas wysłania bufora składającego się z 32 bajtów wynosi 508 uS, przy wykorzystaniu USI spada do 289 uS, wszystko przy wewnętrznym oscylatorze 8 MHz.<br />Może ktoś podpowie co jeszcze poprawić w kwestii szybkości działania? Wydaje mi się, że zamiana funkcji inline na makra nie zrobi różnicy?<br /><br />Zrobiłem też próby widoczności migania diod z wykorzystaniem generatora. Przy 100 kHz podanych na pin GCLK migotanie jest jeszcze minimalnie widoczne, przy 8 MHz nie da się go zauważyć nawet machając ręką nad diodami. <br /><br />A testowy programik wygląda tak (jeszcze bez korekcji gamma, a raczej nie-gamma ale o tym innym razem):<br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 9 lip 2014, o 12:53</p><hr />
]]></content>
</entry>
</feed>