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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-05-06T11:28:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18208&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-05-01T20:24:37+01:00</updated>
<published>2017-05-01T20:24:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188184#p188184</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188184#p188184"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188184#p188184"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Jeśli wskaźnik do funkcji jest różny od zera to funkcja się wykona, w przeciwnym wypadku się nie wykona.<br />Można by to wykorzystać do &quot;wyrejestrowania&quot; funkcji, ale nie mam pewności czy tu nie ma jakichś zagrożeń..<br /></div><br />Tak sobie myślę, może się mylę, ale myślę ... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... że wyrejestrowanie nie miałoby tu hmmm jakby sensu - dlaczego?<br /><br />no bo skoro zero to właśnie callback jest wyrejestrowany - nie ma innej możliwości - tak tylko podpowiadam może to pozwoli nieco poszerzyć obraz tych callbacków<br /><br />Warunek jest po to, że nawet jeśli ktoś użyje tej funkcji nazywanej zdarzeniem w pętli while, a nieopatrznie np przez zapomnienie nie zarejestruje callbacka - to właśnie ma się to zachować bezpiecznie czyli nic ma się nie wykonać. A jak już zarejestruje to funkcja prawidłowo się wykona<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Nie widzę natomiast problemu w zdefiniowaniu kilku funkcji reagujących na enkoder i w zależności od kontekstu rejestrowanie tej właściwej.<br />Do tego pewnie należałoby znowu skorzystać z mechanizmu zdarzeń, który by właściwe funkcje rejestrował lub wyrejestrowywał.<br /></div><br /><br />Dokładnie to jest fajną zaletą callbacków, że można rejestrować różne funkcje w różnych miejscach programu. To nie tylko ma sens ale jest wręcz chyba najbardziej miodną możliwością <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> że aż tak to określę.<br /><br />Ale czy myśleć o mechanizmie to rejestracji/wyrejestrowania ? hmmm oczywiście może czegoś nie rozumiem w tym stwierdzeniu - ale prosta funkcja rejestracji wystarcza w zupełności.<br /><br />Zwykle pierwszy raz rejestrujesz przed pętlą główną w main ... prawda?<br /><br />Później skoczysz np do jakiegoś MENU - tam pewnie też będzie jakaś pętla główna, wystarczy zarejestrować nowego callbacka (nie trzeba nic wyrejestrowywać przecież bo podmieniasz wskaźnik na nowy i już) <br /><br />Po wyjściu z pętli funkcji MENU rejestrujesz to co było wcześniej ...<br /><br />a jeśli masz jeszcze więcej, dużo więcej takich sytuacji w sofcie i trzeba często rejestrować callbacka i przywracać różne poprzednie jego wartości to warto wtedy np pomyśleć o tablicy wskaźników do funkcji callbackowych, zapamiętywać je przed zmianą - zaś po wyjściu z jakiejś pętli przywracać poprzednio zapamiętaną <br /><br />no możliwości jest sporo<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2017, o 20:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-05-01T14:34:12+01:00</updated>
<published>2017-05-01T14:34:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188154#p188154</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188154#p188154"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188154#p188154"><![CDATA[
<div class="quotetitle">quartus napisał(a):</div><div class="quotecontent"><br />Do rozważenia:<br />1. Jest register. Czy jest (powinien być) unregister?<br /></div><br />Wszystko pewnie zależy od aplikacji. W obsłudze zdarzenia jest warunek:<br />[syntax=c]if( enc_event_callback )<br />enc_event_callback();[/syntax]<br />Jeśli wskaźnik do funkcji jest różny od zera to funkcja się wykona, w przeciwnym wypadku się nie wykona.<br />Można by to wykorzystać do &quot;wyrejestrowania&quot; funkcji, ale nie mam pewności czy tu nie ma jakichś zagrożeń..<br />Czy to byłoby potrzebne? Ciężko powiedzieć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">quartus napisał(a):</div><div class="quotecontent"><br />2. Ile razy zamierzasz rejestrować/wyrejestrowywać zdarzenie dla enkodera?<br /></div><br />Domyślnie, jak w przykładzie, rejestracja nastąpiła przed funkcją main, więc w tym przypadku raz.<br />Nie widzę natomiast problemu w zdefiniowaniu kilku funkcji reagujących na enkoder i w zależności od kontekstu rejestrowanie tej właściwej.<br />Do tego pewnie należałoby znowu skorzystać z mechanizmu zdarzeń, który by właściwe funkcje rejestrował lub wyrejestrowywał.<br /><br /><div class="quotetitle">quartus napisał(a):</div><div class="quotecontent"><br />3. Czy tylko 1 rodzaj zdarzenia? Np. inc/dec o &quot;1 działkę&quot; czy może także przeskok w jednostce czasu o kilka działek?<br /></div><br />Tutaj już można pewnie ostro zamieszać jeśli będzie potrzeba.<br /><br /><div class="quotetitle">quartus napisał(a):</div><div class="quotecontent"><br />4. Czy do funkcji callback nie powinien trafiać argument? Np. inc/dec, może wartość licznika?<br /></div><br />Można tak zrobić, ale w tym wypadku nie był potrzebny, bo funkcja bazuje na funkcji enc_get().<br /><br />Jak pisałem, póki co, zdarzenia i callbacki są dla mnie tajemnicą więc ciężko powiedzieć czy trafiłem z odpowiedziami <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Mam nadzieje, że jakiś bardziej obeznany programista uściśli moje wypowiedzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 1 maja 2017, o 14:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-30T22:26:53+01:00</updated>
<published>2017-04-30T22:26:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188132#p188132</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188132#p188132"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188132#p188132"><![CDATA[
Wg mnie jeszcze nie można postawić kropki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Już tłumaczę dlaczego.<br />Brakuje tutaj jeszcze, żeby dopełnić obsługę enkodera, technik zdarzeniowych i funkcji zwrotnych <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pewnie niektórzy złapią się za głowę, po co taką &quot;kobyłę&quot; stosować do &quot;prościutkiej&quot; biblioteki, ale wg mnie po to, żeby nieskomplikowany kod nie komplikował tych bardziej skomplikowanych. Oprócz tego Mirek wielokrotnie udowadniał w poradnikach, że zdarzenia i callbacki znacznie upraszczają kod i powoli ta myśl mnie ukierunkowuje.<br />Dodatkowo myślę, że należy iść tą drogą już nawet na początku programowania, bo na końcu to taki must have.<br /><br />Sam jeszcze tego tematu całkowicie nie ogarniam, ale wszystko wskazuje na to, że udało mi się zastosować obsługę mirkowych rozwiązań do niniejszej biblioteki. Mam nadzieję też, że ten przykład ukierunkuje innych.<br />Załączam bibliotekę, a zmiany to:<br />- pozostaję przy modyfikacji definicji dowolnych pinów procesora (bo tak <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> )<br /><br />- włączenie techniki zdarzeniowej i calbacków, dzięki temu kod jest przejrzysty oraz dodatkowo wyświetlacz nie jest męczony w pętli głównej (efekt uboczny, ale pożądany <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> )<br />Może tego nie widać na LCD, ale u mnie na VFD strasznie to migało. Oczywiście to tylko kod przykładowy był u Sylwka, ale warto zwrócić na to uwagę.<br /><br />- włączenie/wyłączenie obsługi timera przez użytkownika i korzystanie bez dodatkowych zabiegów z pollingu. <br />Nie zawsze można skorzystać z timera, a w wielu projektach obsługa enkodera nie musi być krytyczna. Jeśli coś się zgubi to niewielka strata.<br /><br />- przeniesienie inicjalizacji timera do funkcji inicjującej enkodera. Przy okazji zmieniłem na:<br />void encoder_init(void); To jeszcze bardziej uprościło funkcję main.<br /><br /><br />[syntax=c]/******************* USTAWIENIA UŻYTKOWNIKA ***************************************/<br />#define USE_TIMER0// 0 jeśli tryb polling, 1 używamy dla timer2<br />#define ENC_TYPE 0// typ enkodera: 0-pełnokrokowy, 1-półkrokowy, 2-czterokrokowy<br /><br />#define ENCA_PORTPORTA<br />#define ENCA_PIN0<br /><br />#define ENCB_PORTPORTA<br />#define ENCB_PIN2<br />/*********************************************************************************/[/syntax]<br /><br />[syntax=c]/********** Kod dotyczący funkcji zwrotnych ****************/<br />static void ( *enc_event_callback )(void);<br />void register_enc_event_callback(void (*callback)(void)) {<br />enc_event_callback = callback;<br />}<br />/***********************************************************/[/syntax]<br /><br />Na zakończenie jeszcze uproszczony plik main.c:<br /><br />[syntax=c]/*<br /> * Immpulsator obrotowy<br /> *<br /> *   SylwekK<br /> *   15-04-2017<br /> *<br /> *   ATMEGA32 16Mhz kwarc<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;libs/LCD/lcd44780.h&quot;<br />#include &quot;libs/encoder_SK/encoder_SK.h&quot;<br /><br />//*******************************************************************************<br />uint8_t p0&#91;&#93; = { 16, 16, 16, 16, 16, 16, 16, 16 };<br />uint8_t p1&#91;&#93; = { 24, 24, 24, 24, 24, 24, 24, 24 };<br />uint8_t p2&#91;&#93; = { 28, 28, 28, 28, 28, 28, 28, 28 };<br />uint8_t p3&#91;&#93; = { 30, 30, 30, 30, 30, 30, 30, 30 };<br /><br />uint8_t p&#91;&#93; = {0x20, 0x80, 0x81, 0x82, 0x83};<br /><br />uint16_t odczyt = 0;<br /><br />void plus_minus(void);<br />void pasek (uint8_t poz_y, uint8_t poz_x, uint8_t k);<br />//*******************************************************************************<br /><br /><br />int main(void) {<br />//definicje znaków dla paska<br />lcd_init();<br />lcd_locate(0,0); lcd_str(&quot;0&quot;);<br />lcd_defchar(0x80, p0);<br />lcd_defchar(0x81, p1);<br />lcd_defchar(0x82, p2);<br />lcd_defchar(0x83, p3);<br />//-------------------------------------------------------------------------------<br />encoder_init();       //ustawienie wejść enkodera<br />encoder_reset();<br /><br />/********* Rejestrujemy funkcje zwrotną *************/<br />register_enc_event_callback( plus_minus );<br />/****************************************************/<br /><br />sei();<br />while(1) {<br />SW_ENCODER_EVENT();<br />}//END while<br />}// END main<br /><br /><br />/****************************** Ciała funkcji ***********************************/<br />void pasek (uint8_t poz_y, uint8_t poz_x, uint8_t k) {<br />uint8_t xp1, xp2;<br /><br />xp1=k/5; xp2=k%5;//wyliczenie podziału<br />lcd_locate(poz_y, poz_x);<br />uint8_t a=0; while(a++&lt;xp1) lcd_char(0xff); //negatyw spacji<br />lcd_char(p&#91;xp2&#93;);//przypisanie pionowego paska<br /><br />while(xp1++&lt;20) lcd_str(&quot; &quot;);//dla LCD buforowanego można pominąć tą linię<br />}<br />/******************** Funkcja reagująca na zmiany enkodera **********************/<br />void plus_minus(void) {<br />odczyt += enc_get();<br />lcd_locate(0,0); lcd_int(odczyt); lcd_str(&quot;  &quot;);<br />pasek(1, 0, (odczyt&amp;255)/3); //dopasowanie wartości na całą skalę (16x5=80 punktów, 255/80=3.1)<br />}<br />/********************************************************************************/[/syntax]<br /><br /><br />PS<br /> &quot;prościutkiej&quot; biblioteka - to taki mój skrót myślowy.<br />Sam jestem pod wrażeniem kodu Sylwka, bo obsługa jest naprawdę przemyślana, a brak konieczności używania jakichkolwiek filtrów na piny enkodera to jest ta najważniejsza miodność tego rozwiązania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 30 kwi 2017, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-05-06T11:28:19+01:00</updated>
<published>2017-04-28T01:58:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188030#p188030</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188030#p188030"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188030#p188030"><![CDATA[
Żeby już postawić kropkę nad obsługą różnych typów enkoderów dodaję jeszcze ciut rozbudowaną wersję biblioteki obsługującą 4 impulsy czyli innymi słowy każdą zmianę stanu enkodera (nie tylko na &quot;klik&quot;). Gdzie to się może przydać? Przede wszystkim tam gdzie enkoder nie robi &quot;kilik&quot;, tj. enkodery optyczne lub magnetyczne gdzie ich ruch jest płynny. Pozwala to znacznie zwiększyć ich rozdzielczość. Przykładowo moje enkodery magnetyczne RMS20-250, które z założenia mają 250 impulsów... ale pełnych czyli od 00 do 00 (lub 11 do 11  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ) teraz uzyskują 1000 impulsów na obrót <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Oczywiście drgania styków nie straszne, bo akceptowane są tylko stany sąsiednie enkodera, a podczas drgań następuje i wzajemna kompensacja impulsów nadmiarowych.<br /><br />Aha, i o ile przy przerwaniach 10kHz robiłem kołowrotek z enkodera to zdarzyło mu się coś zgubić, natomiast po zwiększeniu próbkowania do 50kHz mało palców nie połamałem przy kręceniu, a pozycja startowa za każdym razem była ta sama, z której zaczynałem  <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 28 kwi 2017, o 01:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-27T11:39:56+01:00</updated>
<published>2017-04-27T11:39:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188010#p188010</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188010#p188010"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188010#p188010"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Przesunięcia bitowe doszły by wtedy gdyby zostały zastosowane jakieś zmienne a nie stałe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />Ooo tego nie umiałem sformułować w komentarzu, choć podskórnie wiedziałem o tym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 27 kwi 2017, o 11:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-04-27T10:42:11+01:00</updated>
<published>2017-04-27T10:42:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188009#p188009</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188009#p188009"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188009#p188009"><![CDATA[
Przesunięcia bitowe doszły by wtedy gdyby zostały zastosowane jakieś zmienne a nie stałe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Sent from my Mi-4c using Tapatalk<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 27 kwi 2017, o 10:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-04-27T09:57:16+01:00</updated>
<published>2017-04-27T09:57:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188007#p188007</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188007#p188007"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188007#p188007"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />ale po to ciągnie się wątki, żeby sobie ją uporządkować<br /></div><br />Dokładnie o to chodzi ... dlatego czasem staram się włączyć do dyskusji ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 kwi 2017, o 09:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-27T09:49:48+01:00</updated>
<published>2017-04-27T09:49:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188006#p188006</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188006#p188006"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188006#p188006"><![CDATA[
No cóż biję się w pierś, to były braki w wiedzy, ale po to ciągnie się wątki, żeby sobie ją uporządkować <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Sprawdziłem i faktycznie tak jest, także dzięki, lekcję o stałej dosłownej na pewno zapamiętam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 27 kwi 2017, o 09:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-04-27T09:15:12+01:00</updated>
<published>2017-04-27T09:15:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188004#p188004</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188004#p188004"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188004#p188004"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />druga będzie nieco wolniejsza, bo oprócz przypisania jest też przesunięcie<br /></div><br /><br />to:<br /><br />[syntax=c]temp |= (1&lt;&lt;1);[/syntax]<br /><br />będzie wolniejsze niż to?<br /><br />[syntax=c]temp |=0x02;[/syntax]<br /><br />Jeśli kolega tak sądzi to proponuję jednak zrobić proste ćwiczenie jak DRUT, czyli skompilować i zajrzeć do kodu ASM w pliku *.lss<br /><br />No i zastanowić się dobrze ... bo tu nawet nie ma ŻADNEJ wątpliwości, że obydwa zapisy dla kompilatora są ABSOLUTNIE JEDNOZNACZNE, proponuję też przypomnieć sobie co to są tzw &quot;stałe dosłowne&quot;<br /><br />NIGDY W ŻYCIU procesor nie będzie tu wykonywał ŻADNEGO przesunięcia bitowego <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> panie kochany obydwa zapisy<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">0x02<br />(1&lt;&lt;1)</div><br /><br />to są STAŁE DOSŁOWNE czy ty tego nie widzisz ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> powiem więcej, takie zapisy jak niżej<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">0b00000010<br />2<br />0x02<br />1&lt;&lt;1</div><br /><br />to też będzie TO SAMO - czyli ta sama stała dosłowna <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Toż kompilator zamieni to na bajt o wartości = 2 i taka wartość trafi do rejestru aby brać udział w operacji przypisania do zmiennej<br /><br />no myślę, że takie PODSTAWY to jednak warto dobrze rozumieć.<br /><br />To co piszę nie ma już nawet nic wspólnego czy używać przesunięć czy wartości HEX. Bo tak jak piszesz czasem w tak prostym przypadku gdzie mamy albo 0x01 albo 0x02 to nie stanowi dużego problemu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 kwi 2017, o 09:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-27T09:03:58+01:00</updated>
<published>2017-04-27T09:03:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188003#p188003</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188003#p188003"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188003#p188003"><![CDATA[
<div class="quotetitle">riddik napisał(a):</div><div class="quotecontent"><br />To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 &lt;&lt; 0)?<br /></div><br />No cóż, programowanie to taka sztuka, gdzie każde z zadań ma wiele rozwiązań.<br />Co zostanie wybrane to zależy od umiejętności programisty, jego predyspozycji, uzyskanej wiedzy a czasami, po prostu, pewnych preferencji zależnych od kontekstu, a zwykle po prostu jego &quot;widzimusię&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Powyższe zadanie miało na celu ustawienie dwóch najmniej znaczących bitów w bajcie.<br />Założyłem, że zacznę od ustawiania bitu na pozycji 0 (jeśli będzie potrzeba - warunek &quot;if&quot;).<br />Ten kto już liznął zapisu hexadecymalnego to łatwiej mu wpisać &quot;temp = 0x01&quot;. Mając pewną wprawę w programowaniu taki zapis jest dość czytelny.<br />Drugi wpis miał zmanipulować bitem na pozycji 1, nie naruszając żadnego innego bitu.<br />W dwóch linijkach mamy dwie formy zapisu, pierwsza będzie szybsza, bo mamy tylko przypisanie, druga będzie nieco wolniejsza, bo oprócz przypisania jest też przesunięcie. Różnice w szybkości dla tego zadania nie są jakieś kolosalne, ale warto o nich pamiętać.<br />Nie ma żadnych przeciwwskazań żeby zapisać całość tak:<br />[syntax=c]uint8_t static inline enc_in( void ) {<br />        uint8_t temp=0;<br />        if ( PINN(ENC_PORTA)&amp;(1&lt;&lt;ENC_PINA) )<br />                temp = 0x01;<br />        if ( PINN(ENC_PORTB)&amp;(1&lt;&lt;ENC_PINB) )<br />                temp |=0x02;<br />        return temp;<br />}[/syntax]<br /><br />ale dla mnie czytelniej było to co wcześniej, choć na pewno nie powiem, że lepiej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 27 kwi 2017, o 09:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-04-27T08:06:13+01:00</updated>
<published>2017-04-27T08:06:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188002#p188002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188002#p188002"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188002#p188002"><![CDATA[
<div class="quotetitle">riddik napisał(a):</div><div class="quotecontent"><br />To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 &lt;&lt; 0)?<br /></div><br />Pokazałem, który zapis jest czytelniejszy i napisałem dlaczego - a nie żeby się przyczepiać co jest dwie linijki wyżej a co niżej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 kwi 2017, o 08:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[riddik]]></name></author>
<updated>2017-04-27T07:58:09+01:00</updated>
<published>2017-04-27T07:58:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188001#p188001</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188001#p188001"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=188001#p188001"><![CDATA[
To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 &lt;&lt; 0)?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16099">riddik</a> — 27 kwi 2017, o 07:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-04-26T13:54:16+01:00</updated>
<published>2017-04-26T13:54:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187940#p187940</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187940#p187940"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187940#p187940"><![CDATA[
<div class="quotetitle">riddik napisał(a):</div><div class="quotecontent"><br />temp |= 0x02;<br /></div><br />Dlatego, że na tym forum każdy docenia przejrzysty zapis z przesunięciami bitowymi, który jest po stokroć bardziej przejrzysty niż wpisywanie wartości HEX ...<br /><br />dla ciebie nie ma różnicy pomiędzy np takimi dwoma zapisami ?<br /><br />[syntax=c]temp |= (1&lt;&lt;6)|(1&lt;&lt;3)|(1&lt;&lt;1);<br /><br />tem |= 0x4A;[/syntax]<br /><br />? jak nie widzisz różnicy to postaraj się zrozumieć co oznacza &quot;dobry styl programowania&quot; ponieważ te dwa zapisy NICZYM się nie różnią z punktu widzenia kompilatora a tym bardziej procesora. Za to ten drugi sposób JEST PASKUDNY jeśli chodzi o widoczność, które bity macamy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 kwi 2017, o 13:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[riddik]]></name></author>
<updated>2017-04-26T13:47:01+01:00</updated>
<published>2017-04-26T13:47:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187939#p187939</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187939#p187939"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187939#p187939"><![CDATA[
Ok ale dlaczego w takim razie nie<br />[syntax=c]temp |= 0x02;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16099">riddik</a> — 26 kwi 2017, o 13:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-26T12:32:12+01:00</updated>
<published>2017-04-26T12:32:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187935#p187935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187935#p187935"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187935#p187935"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Cieszę się, że jest zainteresowanie biblioteką, którą opublikowałem jako inspirację do dalsazych prób i modyfikacji. Mam jednak uwagę co do zamiany makra ENC_IN - właśnie to makro wskazane by było aby zajmowało jak najmniej czasu. Te kilka dodatkowych if'ów w przeróbce zajmuje sporo miejsca jak by nie patrzył. Fajnie by było jakby odpowiednimi definicjami już na etapie preprocesora udało się załatwić wygodniejszee przypisy do pinów wybranego portu oraz stałych STANx. To by było chyba najekonomiczniejsze rozwiązanie jeśli chodzi o szybkość wykonywania funkcji. Moje definicje może nie są jakieś wyszukane, ale w sumie można się połapać choć nie ukrywam, że właśnie liczyłem na kogoś kto to zmodyfikuje, bo moja wiedza na tym etapie jest nieco skromna <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />Moja wiedza też niestety skromna.<br />Widzę jedynie potencjał takiej modyfikacji przy pracy nad nowymi projektami, gdzie szukamy dopiero właściwej pinologii.<br />Ja często &quot;żongluję&quot; pinami jeśli pracuję koncepcyjnie, szczególnie wtedy, gdy szukam rozwiązań lub gdy przygotowuję bibliotekę np na kilka procków. Zaproponowane makra pozwalają na pewną swobodę, niestety kosztem szybkości, choć uważam, że w standardowych projektach nie będzie z tym problemu, a wygoda doboru pinów ma swoją wartość.<br />Wracając do szybkości, założyłem, że funkcja typu &quot;static inline&quot; dołoży trochę do szybkości.<br />Zmienną temp można wspomóc przedrostkiem &quot;register&quot;, co powinno dać dodatkowy wzrost prędkości, ale te modyfikacje mogą zależeć silnie od opcji kompilacji. <br /><div class="quotetitle">riddik napisał(a):</div><div class="quotecontent"><br />Taka moja drobna poprawka zupełnie kosmetyczna. Wydaje mi się, że lepszy dla szybkiej identyfikacji znaczenia będzie zapis zamiast<br /></div><br />Podoba mi się <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">riddik napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">[syntax=c]uint8_t static inline enc_in( void ) {<br />uint8_t temp=0;<br />if ( PINN(ENC_PORTA)&amp;(1&lt;&lt;ENC_PINA) )<br />temp = 0x01;<br />if ( PINN(ENC_PORTB)&amp;(1&lt;&lt;ENC_PINB) )<br />temp |= (1&lt;&lt;1);<br />return temp;<br />}[/syntax]<br /><br />Pomijając jak zostanie zoptymalizowany zapis temp |= (1&lt;&lt;1);<br />czemuś szczególnemu ma służyć? Linijkę wcześniej jest temp = 0x01; a dalej przesunięcie bitowe stałej o wartości 0x01 o jeden bit w lewo. <br />Pytam bo chciałbym wiedzieć o powodach zastosowania dwóch różnych zapisów.<br /></div></div><br /><br />Tu nie chodzi o przesunięcie bitowe, same w sobie, ale o wykrycie stanów wysokich na pinach.<br />Pierwszy zapis ustawi bit 0, a drugi bit 1.<br />Jest to standardowy sposób na ustawianie pojedynczych bitów, jak zauważył SylwekK może mieć wpływ na szybkość w wymagających zadaniach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 26 kwi 2017, o 12:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-04-26T07:47:32+01:00</updated>
<published>2017-04-26T07:47:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187927#p187927</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187927#p187927"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187927#p187927"><![CDATA[
Cieszę się, że jest zainteresowanie biblioteką, którą opublikowałem jako inspirację do dalsazych prób i modyfikacji. Mam jednak uwagę co do zamiany makra ENC_IN - właśnie to makro wskazane by było aby zajmowało jak najmniej czasu. Te kilka dodatkowych if'ów w przeróbce zajmuje sporo miejsca jak by nie patrzył. Fajnie by było jakby odpowiednimi definicjami już na etapie preprocesora udało się załatwić wygodniejszee przypisy do pinów wybranego portu oraz stałych STANx. To by było chyba najekonomiczniejsze rozwiązanie jeśli chodzi o szybkość wykonywania funkcji. Moje definicje może nie są jakieś wyszukane, ale w sumie można się połapać choć nie ukrywam, że właśnie liczyłem na kogoś kto to zmodyfikuje, bo moja wiedza na tym etapie jest nieco skromna <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 kwi 2017, o 07:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[riddik]]></name></author>
<updated>2017-04-26T07:23:25+01:00</updated>
<published>2017-04-26T07:23:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187926#p187926</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187926#p187926"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187926#p187926"><![CDATA[
Taka moja drobna poprawka zupełnie kosmetyczna. Wydaje mi się, że lepszy dla szybkiej identyfikacji znaczenia będzie zapis zamiast<br />[syntax=c]#define ENC_PORTA       PORTA<br />#define ENC_PORTB       PORTA<br /> <br />#define ENC_PINA        0<br />#define ENC_PINB        2[/syntax]<br />np. taki<br />[syntax=c]#define ENCA_PORT       PORTA<br />#define ENCB_PORT       PORTA<br /> <br />#define ENCA_PIN        0<br />#define ENCB_PIN        2[/syntax]<br /><br />I jeszcze pytanko <br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />[syntax=c]uint8_t static inline enc_in( void ) {<br />uint8_t temp=0;<br />if ( PINN(ENC_PORTA)&amp;(1&lt;&lt;ENC_PINA) )<br />temp = 0x01;<br />if ( PINN(ENC_PORTB)&amp;(1&lt;&lt;ENC_PINB) )<br />temp |= (1&lt;&lt;1);<br />return temp;<br />}[/syntax]<br /></div><br />Pomijając jak zostanie zoptymalizowany zapis temp |= (1&lt;&lt;1);<br />czemuś szczególnemu ma służyć? Linijkę wcześniej jest temp = 0x01; a dalej przesunięcie bitowe stałej o wartości 0x01 o jeden bit w lewo. <br />Pytam bo chciałbym wiedzieć o powodach zastosowania dwóch różnych zapisów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16099">riddik</a> — 26 kwi 2017, o 07:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-25T23:36:26+01:00</updated>
<published>2017-04-25T23:36:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187918#p187918</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187918#p187918"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187918#p187918"><![CDATA[
Jeśli można chciałbym zaprezentować drobną modyfikację (w ramach zabawy z kodem).<br />Modyfikacja ta pozwoli nam definiować dowolne, piny z różnych portów.<br />Sercem będzie makro i definicje portów oraz pinów:<br />[syntax=c]#define  DDRR(x)(*(&amp;x-1))<br />#define  PINN(x)(*(&amp;x-2))<br /><br />#define ENC_PORTAPORTA<br />#define ENC_PORTBPORTA<br /><br />#define ENC_PINA0<br />#defineENC_PINB2[/syntax]<br /><br />Żeby całość działało tak jak w oryginale, należy zmodyfikować funkcję &quot;encoder_port&quot;:<br />[syntax=c]void encoder_port(void)//ustawienie wejść enkodera<br />{<br />DDRR(ENC_PORTA) &amp;= ~(1&lt;&lt;ENC_PINA);// Jako wejście<br />ENC_PORTA |= (1&lt;&lt;ENC_PINA);// Robimy pullupa<br />DDRR(ENC_PORTB) &amp;= ~(1&lt;&lt;ENC_PINB);// Jako wejście<br />ENC_PORTB |= (1&lt;&lt;ENC_PINB);// Robimy pullupa<br />}[/syntax]<br /><br />Do tego stworzymy funkcję dodatkową:<br />[syntax=c]uint8_t static inline enc_in( void ) {<br />uint8_t temp=0;<br />if ( PINN(ENC_PORTA)&amp;(1&lt;&lt;ENC_PINA) )<br />temp = 0x01;<br />if ( PINN(ENC_PORTB)&amp;(1&lt;&lt;ENC_PINB) )<br />temp |= (1&lt;&lt;1);<br />return temp;<br />}[/syntax]<br /><br />i podmieniamy za makro ENC_IN w pliku encoder_SK.c<br />No i cieszymy się zwiększoną funkcjonalnością.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 25 kwi 2017, o 23:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-04-25T22:12:34+01:00</updated>
<published>2017-04-25T22:12:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187903#p187903</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187903#p187903"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187903#p187903"><![CDATA[
Widzę wątek się fajnie rozrósł, jest gotowa biblioteka.<br />W międzyczasie udało mi podłączyć zarówno enkoder optyczny jak i mechaniczny.<br />Niestety na testy optycznego nie miałem pomysłów, mam jedynie ogólne wrażenie: kręci się i to szybko:)<br />Wrzuciłem więc mechaniczny i nie udało mi się programu wyprowadzić z równowagi, przy standardowym kręceniu paranoika <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jest zasadne, że kod powinien nadać się do standardowych rozwiązań jako manipulator i powinienem spróbować go zaadoptować u siebie, ale nie wiadomo kiedy <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> bo mirkowe kody w moich programach póki co działają.<br />Jeśli jednak podejmę się zadania to prawie na pewno obuduję i tę bibliotekę w callbacki i zdarzenia. <br />Dzięki jeszcze raz za podzielenie się biblioteką.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 25 kwi 2017, o 22:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tungu]]></name></author>
<updated>2017-04-23T09:50:04+01:00</updated>
<published>2017-04-23T09:50:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187703#p187703</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187703#p187703"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187703#p187703"><![CDATA[
Projektuję i buduję gniazda produkcyjne. Takie enkodery to moja codzienność - muszę przecież jakość odmierzać pozycję.<br />m.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12776">tungu</a> — 23 kwi 2017, o 09:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-04-23T17:35:17+01:00</updated>
<published>2017-04-22T19:41:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187670#p187670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187670#p187670"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187670#p187670"><![CDATA[
Aha, a ja zapomniałem dopisać, że jeśli ktoś nie korzysta z przerwań to też można spokojnie działać z enkoderem. Warunek jest taki, że cały czas w pętli musi być odczytywany razem z aktualizowaną zmienną czyli coś w tym stylu:<br />[syntax=c]while(1)<br />        {<br />          encoder();<br />          odczyt += enc_get();<br />          lcd_locate(0,0); lcd_int(odczyt); lcd_str(&quot;  &quot;);<br />          //<br />          // coś tam dalej byle nie blokowało pętli<br />          //<br />        }[/syntax]<br /><br />EDIT:<br />Oczywiście w takim przypadku warto LCD odświeżać nieco rzadziej, bo to on będzie tu zakłócał odczyt (spora strata czasowa) i w życiu nie uzyska się takiej pewności zliczania jak w przerwaniach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 22 kwi 2017, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2017-04-22T19:34:17+01:00</updated>
<published>2017-04-22T19:34:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187669#p187669</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187669#p187669"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187669#p187669"><![CDATA[
aha ...nie napisałem że odpaliłem na 18,432 MHz,  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> , bo nie miałem 16-ki.   <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br />dzięki za .c i .h , przeanalizuję w celu edukacyjnym.  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 22 kwi 2017, o 19:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-05-06T11:05:54+01:00</updated>
<published>2017-04-22T19:10:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187666#p187666</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187666#p187666"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187666#p187666"><![CDATA[
No dobra, to wrzucam jak obiecałem bibliotekę. Myślę, że wybaczycie mi dużo mniej elastyczny sposób jej konfiguracji w porównaniu z tym co robi Mirek, ale mimo wszystko z jej korzystaniem nie powinno być problemu. W załączniku libsik, a poniżej przykładowe użycie na M32 16Mhz.<br /><br /><strong><span style="color: #BF0080">Aktualna wersja biblioteki pod poniższym linkiem:</span></strong><br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic18208.html#p188030" >topic18208.html#p188030</a><!-- l --><br /><br />[syntax=c]/*<br /> * Immpulsator obrotowy<br /> *<br /> *   SylwekK<br /> *   15-04-2017<br /> *<br /> *   ATMEGA32 16Mhz kwarc<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;encoder_SK/encoder_SK.h&quot;<br /><br />//*******************************************************************************<br />//*******************************************************************************<br /><br />uint8_t p0&#91;&#93; = { 16, 16, 16, 16, 16, 16, 16, 16 };<br />uint8_t p1&#91;&#93; = { 24, 24, 24, 24, 24, 24, 24, 24 };<br />uint8_t p2&#91;&#93; = { 28, 28, 28, 28, 28, 28, 28, 28 };<br />uint8_t p3&#91;&#93; = { 30, 30, 30, 30, 30, 30, 30, 30 };<br /><br />uint8_t p&#91;&#93; = {0x20, 0x80, 0x81, 0x82, 0x83};<br /><br /><br />void pasek (uint8_t poz_y, uint8_t poz_x, uint8_t k)<br />{<br />  uint8_t xp1, xp2;<br /><br />  xp1=k/5; xp2=k%5;                              //wyliczenie podziału<br />  lcd_locate(poz_y, poz_x);<br />  uint8_t a=0; while(a++&lt;xp1) lcd_char(0xff);    //negatyw spacji<br />  lcd_char(p&#91;xp2&#93;);                              //przypisanie pionowego paska<br /><br />  while(xp1++&lt;16) lcd_str(&quot; &quot;); //dla LCD buforowanego można pominąć tą linię<br />}<br />//*******************************************************************************<br />//*******************************************************************************<br /><br /><br /><br /><br />int main(void)<br />{<br />  //taktowanie 16Mhz ATMEGA32<br />  //------------------------------------------<br />  //ustawienie TIMER2 w tryb CTC<br />  TCCR2   |= (1&lt;&lt;WGM21);           // tryb pracy CTC<br />  TCCR2   |= (1&lt;&lt;CS22) ;           // preskaler = 64<br />  OCR2    = 24;                    // przerwanie porównania co 100us (10kHz) (24=25-1)<br />  TIMSK   |= (1&lt;&lt;OCIE2);           // Odblokowanie przerwania CompareMatch<br />  //-------------------------------------------------------------------------------<br />  //-------------------------------------------------------------------------------<br />  //definicje znaków dla paska<br />  lcd_init();<br />  lcd_defchar(0x80, p0);<br />  lcd_defchar(0x81, p1);<br />  lcd_defchar(0x82, p2);<br />  lcd_defchar(0x83, p3);<br />  //-------------------------------------------------------------------------------<br /><br />  encoder_port();//ustawienie wejść enkodera<br />  uint16_t odczyt=0;<br />  encoder_reset();<br /><br />  sei();<br />  while(1)<br />    {<br />      odczyt += enc_get();<br /><br /><br />      lcd_locate(0,0); lcd_int(odczyt); lcd_str(&quot;  &quot;);<br />      pasek(1, 0, (odczyt&amp;255)/3); //dopasowanie wartości na całą skalę (16x5=80 punktów, 255/80=3.1)<br /><br /><br />    }//END while<br />}// END main<br />//*******************************************************************************<br /><br /><br />ISR(TIMER2_COMP_vect)<br />{<br />  encoder();<br /><br /><br /><br />}<br /><br />//*******************************************************************************<br />//*******************************************************************************[/syntax]<br /><br />@Daro69, z tym kierunkiem to po prostu odczyt zmiennej encoder_dir, a ta w trakcie drgania styków może się zmienić kilka razy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Umieściłem w tamtym wsadzie tylko jako ciekawostkę. Jeśli to komuś potrzebne to można badać już sam wynik po zmianie i będzie bardziej wiarygodnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 22 kwi 2017, o 19:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2017-04-22T18:34:31+01:00</updated>
<published>2017-04-22T18:34:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187661#p187661</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187661#p187661"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187661#p187661"><![CDATA[
Witaj <strong>SylwekK</strong>,<br /><div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Widzę, że wsad parę razy pobrany... Naprawdę nikt jeszcze nie przetestował tej próbki? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /></div><br />skusiłem się by sprawdzić ten wsad.  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />pobawiłem się na ATB 1.05 ,<br />kręcąc w obie strony jak szalony. (dobrze że enkodera nie urwałem)  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><br />sprawdziłem też w powolnym tempie,<br />zauważyłem że pojawia się sporadycznie kierunek przeciwny(czyli zakłócenia z mojego enkodera),  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <br />kurcze, pomimo tego oszukaństwa licznik nie zgubił się.  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />i o wyskalowaniu graficznym widzę pomyślałeś.  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> działa fajnie !  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />pozdrawiam Darek P.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 22 kwi 2017, o 18:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2017-04-22T18:15:31+01:00</updated>
<published>2017-04-22T18:15:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187657#p187657</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187657#p187657"/>
<title type="html"><![CDATA[Re: Impulsator enkoder - kolejna odsłona]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18208&amp;p=187657#p187657"><![CDATA[
To chyba jakiś specjalistyczny? Przy wysokich obrotach nie ma szans, żeby AVR czegoś nie zgubił, chociaż jakby podnieść częstotliwość przerwań to coś tam zliczy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jak będę przy kompie to wrzucę bibliotekę. Będzie wtedy można przetestować na czym kto może i na czym kto chce <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 22 kwi 2017, o 18:15</p><hr />
]]></content>
</entry>
</feed>