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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-04-13T14:05:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18146&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-04-13T14:05:17+01:00</updated>
<published>2017-04-13T14:05:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187016#p187016</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187016#p187016"/>
<title type="html"><![CDATA[Re: Obsługa enkodera - błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187016#p187016"><![CDATA[
<div class="quotetitle">BePower napisał(a):</div><div class="quotecontent"><br />Ale w tym wypadku gdy steruję ją PWM'em uznałem, że nie muszę.<br /></div><br />To jeśli na takiej samej zasadzie podszedłeś i podchodzisz do innych rzeczy to nie dziwne że masz problemy .... Ciekawe skąd to przekonanie że nie potrzeba rezystora ... a szczególnie przy PWM o wartości bliskiej 100% albo 100% - zastanów się więc bo niestety opowiadasz kosmiczne historie albo innymi słowy mówiąc fantasmagorie - że w takim wypadku nie trzeba rezystora<br /><br /><div class="quotetitle">BePower napisał(a):</div><div class="quotecontent"><br />Dioda pobiera tylko i wyłącznie 8,9 mA przy maksymalnym poziomie jasności.<br /></div><br />No niestety - warto jednak głębiej poduczyć się ABSOLUTNYCH PODSTAW ELEKTRONIKI i nie piszę tego broń boże złośliwie - bo widać, że przy takim podejściu to kolega KOMPLETNIE ale to KOMPLETNIE nie rozumie jak działają diody ani też nie za bardzo się orientuje co to jest i do czego &quot;Prawo Ohma&quot; ....<br /><br />W skrócie dioda LED - sama nie bierze panie kochany ... dioda może wziąć ILE WLEZIE aż do spalenia - bo to ile ona weźmie zależy od tego jak ty ograniczysz ten prąd - jeśli go nie ograniczysz rezystorem ... a tego jak widać nie robisz ... To przez twoją diodę przy MAX PWM 100% jak mówię poleciałoby nawet 1A - zasilacz podałby ile mu fabryka dała .... ale wtedy ograniczeniem jest wydajność prądowa pinu procka - która może być na poziomie max ok 30-40 mA !!! więc pomyśl pan sobie to właśnie TYLE wtedy leci przez twoją diodę LED bez rezystora a nie żadne tam 8,9 mA!<br /><br />jak w nocie PDF widzisz że dioda LED świeci max przy 9mA to oznacza TYYLKO TYLE i AŻ TYLE - że to ty jako elektronik musisz zadbać aby ograniczyć ten prąd do takiej wartości - a nie odwrotnie !<br /><br />Pomyśl sobie gdyby tak było że dioda LED bierze ile ona chce <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to podłącz ją do gniazdka 220V ! (żartuję nie rób tego) ... wtedy co? ona też pobierze sobie 8,9mA ? i będzie świecić ładnie ? czy po prostu ODPARUJE ? ... a jak odparuje to jak myślisz dlaczego ?<br /><br />Ale ok zamiast 220V ... podłącz swoją diodę LED bez rezystora wprost do wyprowadzeń +5V i GND z zasilacza komputerowego - to powinno być dla ciebie ważne doświadczenie .... Tylko załóż okulary bo dioda może błysnąć i strzelić kawałkami plastiku - wtedy się ostatecznie przekonasz że dioda nie bierze ile ona zechce .... <br /><br />teraz jaśniej ?<br /><br />A nawiasem mówiąc - podłączanie diod LED bez rezystora może powodować TAK PRZERÓŻNE CYRKI na zasilaniu procka - ponieważ KATUJESZ jego pin jego MAKSYMALNYM DOPUSZCZALNYM prądem - że w ogóle procek może świrować albo nawet się restartować jeśli do tego nie zadbałeś o prawidłową np i sporą filtrację zasilania<br /><br />poczytaj sobie to DOKŁADNIE:<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/04/mikrokontroler-prawidowe-zasilanie.html" >http://mirekk36.blogspot.com/2012/04/mi ... lanie.html</a><!-- m --><br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/12/filtrowanie-zasilania-dlaczego-tak-wazne.html" >http://mirekk36.blogspot.com/2012/12/fi ... wazne.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 kwi 2017, o 14:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eMCe2]]></name></author>
<updated>2017-04-13T13:54:33+01:00</updated>
<published>2017-04-13T13:54:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187014#p187014</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187014#p187014"/>
<title type="html"><![CDATA[Re: Obsługa enkodera - błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187014#p187014"><![CDATA[
widzę literówki... w pliku .h w lini 46 zjadłeś &quot;T&quot; na koncu<br />w pliku .c w funkcji encoder_init() chociażby zamiast INT piszesz INIT np.. #if USE_INIT_IRQ, #if USE_INIT w lini 100 i 102<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1363">eMCe2</a> — 13 kwi 2017, o 13:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BePower]]></name></author>
<updated>2017-04-13T12:21:46+01:00</updated>
<published>2017-04-13T12:21:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187008#p187008</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187008#p187008"/>
<title type="html"><![CDATA[Obsługa enkodera - błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18146&amp;p=187008#p187008"><![CDATA[
Witajcie, <br />ostatnio zająłem się troszkę starym już tematem enkoderów. Więc zabrałem się za podłączanie wszystkich komponentów do zestawu ATB (enkoder + zestaw rezystorów, kondensatorów) do płytki stykowej. <br />Następnie odpaliłem sobie poradnik Pana Mirka dotyczący elementu wyż. wym. i najpierw jednego dnia przeszedłem przez serię poradników wyłącznie oglądając i słuchając. Następnego dnia wziąłem się za brzydko mówiąc &quot;przerżnięcie&quot; kodu z poradnika. Jako, że jestem osobą, która szanuje czyjąś pracę i osobą która docieka i chce na własnej skórze poczuć samo pisanie kodu zacząłem kod przepisywać krok po kroku. I o dziwo po przejściu odcinków 1-5 kod działał poprawnie i enkoder spełniał swoją funkcję. <br />Widzicie to na dwóch pierwszych wsadach. Pierwszy z nich to moja modyfikacja sterowania LED'em za pomocą PWM - tak wiem, jest kiepska i niedokończona. Nie działa to tak jak powinno ale nie o tym mowa. Drugi wsad to oryginalny wsad, który napisał Pan Mirek. Trzeci wsad to jest właśnie ta nieszczęsna biblioteka (ale biblioteka z Youtube) - nie ta biblioteka o nazwie MK_ENCODER.<br /> <br />No i problem jest taki, że Panu Mirkowi to działa - mi nie. <br />Działam na enkoderze pełno-krokowym czyli z tego co rozumiem zanim mikrokontroler wykryje krok to mam 3 mikrokroki przed - czyli 4 w sumie (wtedy jest wykrywany pojedynczy krok). Działam nie na pullingu a właśnie na przerwaniach INT0 i INT1. I prosiłbym was o sprawdzenie mojego bądź co bądź przepisanego kodu z poradnika.  <br />Kod niby się kompiluje bez żadnych błędów. Nie mam zielonego pojęcia o co chodzi. Siedziałem nad tym wczoraj chyba z 9 godzin. Chciałem nadmienić, że Panu Mirkowi już program na tym etapie działał, mam identyczny zestaw, i tak samo podpięty. Enkoder pod piny PD2, PD3. Dodatkowo buzzerek i wyświetlacz LCD. Wszystkie pliki nagłówkowe mam dołączone. Wydaje mi się, że problem jest gdzieś z jakąś niedomkniętą klamrą ale eclipse nie pluje błędami. No tylko wtedy gdy nie mam zarejestrowanego eventu dotyczącego użycia switcha (gdy ustawiam jego obsługę w pliku nagłówkowym).<br />Aha i właśnie wiem, że niektórzy mnie zlinczują za brak rezystora podłączonego do diody. Tak wiem, LED steruje się prądem nie napięciem. Ale w tym wypadku gdy steruję ją PWM'em uznałem, że nie muszę. Dioda pobiera tylko i wyłącznie 8,9 mA przy maksymalnym poziomie jasności. <br />Poniżej kolejno znajdują się kody źródłowe + załączam filmik na Youtube, który nagrałem:<br />1. Plik nagłówkowy biblioteki<br />2. Plik kodu źródłowego biblioteki<br />3. Plik główny main.c<br /><br />[syntax=c]/*<br /> * encoder.h<br /> *<br /> *  Created on: 12 kwi 2017<br /> *      Author: Miroslaw Kardas<br /> */<br /><br />#ifndef ENCODER_H_<br />#define ENCODER_H_<br /><br /><br />/*~~~~~~~~~~~~~~~~~~~~~ inicjalizacja / obsługa enkodera w main.c ~~~~~~~~~~~~~~~~~~~~~~~~<br />mk_encoder_init();<br />register enc_event_callback ( enc_event ); //własna funkcja obsługi encodera<br />register enc_event_sw_callback( enc_evebt ); // własna funkcja obsługi klawisza enkodera<br /><br /><br /><br />// w programie głównym użytkownik ma do dyspozycji zmienne;<br /> 1. enco_cnt - licznik enkodera (-32768 do 327687)<br /> 2. eco_dir - kierunek ( 1 - left, 2 - right)<br /><br /> while(1)<br /> {<br />  ENCODER_EVENT();<br /> }<br /> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />*/<br /><br />//~~~~~~~~~~~~~~~~~~~~~ konfiguracja sprzetowa encodera ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br /><br />#define HALF_STEP 0// 0 - fullstep encoder<br />// 1 - halfstep encoder<br /><br />#define USE_ENC_SWITCH 0// 0 - brak obsługi przycisku<br />// 1 - z obsługą przycisku<br /><br />#define USE_INT_IRQ 1// 0 - obsługa typu pooling<br />// 1 - obsługa na przerwaniach<br /><br /><br />#if USE_INT_IRQ == 1<br /><br />#define ENC_INT -1 // ( -1 - INT0 &amp; INT1, -2 - PCINT )<br /><br />#if ENC_IN<br />#define PCINT_IRQ_VECT PCINT2_vect // wektor przerwania PCINT<br />#define PCMSK_REG PCMSK2    // nazwa rejestru maskującego grupy przerwań PCINT<br />#define PCINT_A PCINT18   // nazwa przerwania PCINTx dla pinu A enkodera<br />#define PCINT_B PCINT19   // nazwa przerwania PCINTx dla pinu B enkodera<br />#endif<br /><br />#endif<br />//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ piny A i B enkodera ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />#define ENC_A (1&lt;&lt;PD2)// pin podłączony do wejścia INTx<br />#define ENC_B (1&lt;&lt;PD3)// pin podłaczony do innego wejścia tego samego portu<br />#define ENC_AB_PIN PIND<br />#define ENC_AB_PORT PORTD<br /><br />//~~~~~~~~~~~~~~~~~~~~~~~~~~~~ przycisk enkodera ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />#define ENC_SW (1&lt;&lt;PD4)<br />#define ENC_SW_PORT PORTD<br />#define ENC_SW_PIN PIND<br />#define ENC_SW_DIR DDRD<br /><br />#ifdef GIMSK<br />#define GICR GIMSK<br />#endif<br /><br />#define ENC_SW_ON (ENC_SW_PIN &amp; ENC_SW)<br /><br />#define enc_A_HI (ENC_A_PIN &amp; ENC_A)<br />#define enc_B_HI (ENC_B_PIN &amp; ENC_B)<br /><br />#define ENC_LEFT 0x10<br />#define ENC_RIGHT 0x20<br /><br /><br />// extern volatile int encc_cnt;<br />extern volatile uint8_t enco_dir;<br /><br /><br />//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ funkcje biblioteki enkodera ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />void encoder_init (void);<br />void ENCODER_EVENT (void);<br /><br />//~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rejestracja własnej funkcji obsługi przycisku encodera ~~~<br />void register_enc_event_sw_callback (void (*callback) (void));<br /><br />//~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rejestracja własnej funkcji obsługi enkodera<br />void register_enc_event_callback (void (*callback) (void));<br /><br /><br />void encoder_proc (void);<br />int get_encoder (void);<br />void set_encoder (int val);<br /><br />#endif /* ENCODER_H_ */[/syntax]<br /><br />[syntax=c]/*<br /> * encoder.c<br /> *<br /> *  Created on: 12 kwi 2017<br /> *      Author: Miroslaw Kardas<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;encoder.h&quot;<br /><br /><br />volatile int enco_cnt;<br />volatile uint8_t enco_dir;<br />volatile uint8_t enco_flag;<br /><br /><br />// wskaźnik do funkcji callback dla zdarzenia ENCODER_EVENT() do obsługi klawisza<br />static void (*enc_event_sw_callback)(void);<br /><br />// funkcja do rejestracji funkcji zwrotniej w zdarzeniu ENCODER_EVENT()<br />void register_enc_event_sw_callback (void (*callback)(void))<br />{<br />enc_event_sw_callback = callback;<br />}<br /><br /><br />// wskaźnik do funkcji callback dla zdarzenia ENCODER_EVENT() do obsługi enkodera<br />static void (*enc_event_callback) (void);<br /><br />// funkcja do rejestracji funkcji zwrotniej w zdarzeniu ENCODER_EVENT()<br />void register_enc_event_callback (void (*callback)(void))<br />{<br />enc_event_callback = callback;<br />}<br /><br />#if HALF_STEP == 1<br />// Use the half-step state table (emits a code at 00 and 11)<br />const uint8_t enc_tab&#91;6&#93; &#91;4&#93; PROGMEM =<br />{<br />{0x3, 0x2, 0x1, 0x0}, {0x23, 0x0 ,0x1, 0x0},<br />{0x13, 0x2, 0x0, 0x0}, {0x3, 0x5, 0x4, 0x0},<br />{0x3, 0x3, 0x4, 0x10}, {0x3,0x5, 0x3, 0x20}<br />};<br />#else<br />// Use the full-step state table (emits a code at 00 only)<br />const uint8_t enc_tab&#91;7&#93; &#91;4&#93; PROGMEM =<br />{<br />{0x0, 0x2, 0x4, 0x0}, {0x3, 0x0 ,0x1, 0x10},<br />{0x3, 0x2, 0x0, 0x0}, {0x3, 0x2, 0x1, 0x0},<br />{0x6, 0x0, 0x4, 0x0}, {0x6, 0x5, 0x0, 0x20},<br />{0x6, 0x5, 0x4, 0x0},<br />};<br />#endif<br /><br />int get_encoder (void)<br />{<br />uint8_t sreg = SREG;<br />cli();<br />int res = enco_cnt;<br />SREG = sreg;<br />return res;<br />}<br /><br />void set_encoder (int val)<br />{<br />uint8_t sreg = SREG;<br />cli();<br />enco_cnt = val;<br />SREG = sreg;<br />}<br /><br />void encoder_proc (void)<br />{<br />static uint8_t enc_stat;<br />register uint8_t pin = ENC_AB_PIN;<br />register uint8_t ABstate = ((pin&amp;ENC_B)?2:0) | ((pin&amp;ENC_A)?1:0);<br />enc_stat = pgm_read_byte( &amp;enc_tab&#91;enc_stat &amp; 0xf&#93; &#91;ABstate&#93;);<br />ABstate = (enc_stat &amp; 0x30);<br />if (ABstate)<br />{<br />enco_dir = ABstate;<br />if (ABstate == ENC_RIGHT) enco_cnt++;<br />else enco_cnt--;<br />enco_flag = 1;<br />}<br />}<br /><br />void encoder_init (void )<br />{<br />#if USE_ENC_SWITCH == 1<br />ENC_SW_PORT |= ENC_SW;<br />#endif<br /><br />ENC_AB_PORT |= ENC_A | ENC_B;<br />encoder_proc();<br /><br />#if USE_INIT_IRQ == 1<br /><br />#if ENC_INIT == -1<br /><br />#ifndef GICR<br />EIMSK |= (1&lt;&lt;INT0); //enable INT0<br />EICRA |= (1&lt;&lt;ISC00); //INT0 - falling &amp; rising edge<br />#else<br />GICR |= (1&lt;&lt;INT0); //enagle INT0<br />MCUCR |= (1&lt;&lt;ISC00); //INT0 - falling &amp; rising edge<br /><br />#endif<br /><br />#indef GICR<br />GICR |= (1&lt;&lt;INT1);<br />MCUCR |= (1&lt;&lt;ISC10);<br />#else<br />GICR |= (1&lt;&lt;INT1);<br />MCUCR |= (1&lt;&lt;ISC10);<br /><br /><br />#endif<br />#endif<br /><br />#if ENC_INT == -2<br />#ifndef GICR<br />PCICR |= (1&lt;&lt;PCIE2);<br />#else<br />GICR |= (1&lt;&lt;PCIE);<br />#endif<br />PCMSK_REG |= (1&lt;&lt;PCINT_B) | (1&lt;&lt;PCINT_A);<br /><br />#endif<br />}<br /><br />void ENCODER_EVENT (void)<br />{<br />#if USE_INT_IRQ == 0<br /> encoder_proc();<br /><br />#else<br />if (enco_flag)<br />{<br />if (enc_event_callback) enc_event_callback();<br />enco_flag = 0;<br />}<br />#endif<br /><br /><br />#if USE_ENC_SWITCH == 1<br />static uint16_t enc_key_lock;<br />if( !enc_key_lock &amp;&amp; !(ENC_SW_PIN &amp; ENC_SW))<br />{<br />enc_key_lock = 65000;<br />if(enc_event_sw_callback) enc_event_sw_callback();<br /><br />}<br />else if (enc_key_lock &amp;&amp; (ENC_SW_PIN &amp; ENC_SW)) enc_key_lock++;<br /><br />}<br /><br />#endif<br /><br /><br />#if USE_INT_IRQ == 1<br /><br />#if ENC_INT == -2<br />ISR (PCINT_IRQ_VECT)<br />{<br />encoder_proc();<br />}<br />#endif<br /><br /><br />#if ENC_INT == -1<br />}<br />ISR(INT0_vect)<br />{<br />encoder_proc();<br />}<br /><br />ISR(INT1_vect)<br />{<br />encoder_proc();<br />}<br /><br />#endif<br /><br />#endif[/syntax]<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 12 kwi 2017<br /> *      Author: Miroslaw Kardas<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;hd44780.h&quot;<br />#include &quot;encoder.h&quot;<br /><br />void enkoderek (void);<br /><br />int main (void)<br />{<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7);<br /><br />lcd_init();<br />lcd_cls();<br />lcd_str_P( PSTR(&quot;Start...&quot;));<br />_delay_ms(50 );<br /><br />encoder_init();<br />register_enc_event_callback(enkoderek);<br /><br />sei();<br />while(1)<br />{<br />ENCODER_EVENT();<br />}<br />}<br />void enkoderek (void)<br />{<br />lcd_locate(0,0);<br />lcd_str(&quot;enc dir: &quot; );<br />if (enco_dir == ENC_RIGHT) lcd_str(&quot;right&quot;);<br />else lcd_str(&quot;left&quot;);<br />lcd_locate(1,0);<br />lcd_str(&quot;enco cnt: &quot; );<br />lcd_int (get_encoder());<br />lcd_str(&quot;  &quot;);<br />}[/syntax]<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><br /><br />Pozdrawiam i dziękuję już na wstępie za chęć udzielenia pomocy - takiemu &quot;barankowi&quot; jak ja <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=15601">BePower</a> — 13 kwi 2017, o 12:21</p><hr />
]]></content>
</entry>
</feed>