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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-11-29T18:47:47+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4932&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-11-29T18:47:47+01:00</updated>
<published>2013-11-29T18:47:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59077#p59077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59077#p59077"/>
<title type="html"><![CDATA[Re: Skoki przy obsłudze encodera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59077#p59077"><![CDATA[
Na końcu artykułu w blogu jest też link do naszego forum z alternatywnym i sprawdzonym sposobem ale bez timera - więc proponuję także to sprawdzić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 lis 2013, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2013-11-29T18:07:22+01:00</updated>
<published>2013-11-29T18:07:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59072#p59072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59072#p59072"/>
<title type="html"><![CDATA[Re: Skoki przy obsłudze encodera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=59072#p59072"><![CDATA[
No wielkie dzięki. W życiu bym nie przypuszczał, że takie rzeczy mozna zrobić z enkoderem.<br />Tylko jedno ALE.<br />Mam już wykorzystany timer w moim programie a mam tylko jeden.<br />Jak wpleść obsługę enkodera w istniejące przerwanie ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 29 lis 2013, o 18:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysztoffx]]></name></author>
<updated>2013-11-27T05:50:42+01:00</updated>
<published>2013-11-27T05:50:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58706#p58706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58706#p58706"/>
<title type="html"><![CDATA[Re: Skoki przy obsłudze encodera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58706#p58706"><![CDATA[
Ja używałem biblioteki Mirka w niezmienionej formie. Wspominał w poradniku że ten efekt został programowo ograniczony, a jednak też się z tym borykałem w przypadku jednego z enkoderów. Taka wrodzona wada tańszych egzemplarzy <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1459">krzysztoffx</a> — 27 lis 2013, o 05:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Intre]]></name></author>
<updated>2013-11-26T23:59:59+01:00</updated>
<published>2013-11-26T23:59:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58702#p58702</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58702#p58702"/>
<title type="html"><![CDATA[Re: Skoki przy obsłudze encodera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58702#p58702"><![CDATA[
Nie mam na tyle wiedzy żeby stwierdzić co z Twoim kodem jest nie tak ale mam pewien pomysł.<br />Nie wiem czy widziałeś może poradnik Mirka <a href="http://mirekk36.blogspot.com/2013/04/encoder-avr-callbackow-ciag-dalszy-cz2.html"  class="postlink">http://mirekk36.blogspot.com/2013/04/encoder-avr-callbackow-ciag-dalszy-cz2.html</a> o enkoderze, są tam też biblioteki, które byś mógł przeanalizować mało tego Mirek pokazuje też serwis niemiecki gdzie jest opisany kod do enkodera no i w ogóle opowiada jak się zabrać za obsługę jego. Jak nie widziałeś gorąco polecam.<br /><br />Może też wgrasz sobie przygotowany tam program i przetestujesz ze swoim Enkoderem bo może być też tak że to nie problem programowy a sprzętowy.<br />Ja osobiście to przerobiłem i enkodery bardzo ładnie mi działają. Nawet zmodyfikowałem sobie bibliotekę żeby było ich więcej.  <br />No chyba że masz jakieś inne urządzenie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1356">Intre</a> — 26 lis 2013, o 23:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2013-11-26T23:29:32+01:00</updated>
<published>2013-11-26T23:29:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58699#p58699</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58699#p58699"/>
<title type="html"><![CDATA[Skoki przy obsłudze encodera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4932&amp;p=58699#p58699"><![CDATA[
Witam<br /><br />W mojej aplikacji używam obsługi impulsatora obrotowego jaką kiedyś przedstawił chyba kolega sunriver.<br />Wszystko chodzi dobrze jednak co któryś obrót następuje gwałtowny skok (tutaj akurat świecenie) i po lekkim &quot;dygnięciu&quot; potencjometru dalej wartość wraca do jakby poprzedniej i idzie normalnie w górę lub w dół.<br />Sądzę, że jest to mój błąd gdzieś w kodzie lub w samym urządzeniu, jednak proszę o weryfikację.<br />Uwagi dotyczące kodu mile widziane jednak nie za surowo proszę bo jestem ciągle w fazie nauki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />P.S. Czy istnieje słowo dygnięcie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> ????<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />// definicja pinów enkodera<br />#define PHASE_A (PINA &amp; 1&lt;&lt;PA0)<br />#define PHASE_B (PINA &amp; 1&lt;&lt;PA1)<br /><br />#define LED_ON PORTA |=(1&lt;&lt;PA7)// definicja pinu do którego podlaczona jest dioda<br />#define LED_OFF PORTA &amp;= ~(1&lt;&lt;PA7)<br />#define LED_PIN (1&lt;&lt;PA7)<br />#define LED_TOG PORTA ^= LED_PIN<br />#define KEY1 (1&lt;&lt;PA3)<br /><br />static int8_t last;<br />volatile int8_t enc_delta; // -128 ... 127<br />volatile int8_t kanal1;<br />volatile int8_t kanal2;<br />volatile uint16_t i;<br />volatile uint16_t pp;<br />volatile uint16_t zz;<br />volatile uint8_t tk;<br />volatile int zal;<br />volatile int PUSZCZONE;<br />volatile int TRZYMANE;<br />volatile int8_t val = 0;<br />volatile int WLA_WYL;<br />volatile int8_t ostatni;<br />volatile int8_t new, diff;<br /><br />void encode_init(void)<br />    {<br />      int8_t new;<br />      new = 0;<br />      if( PHASE_A )<br />        new = 3;<br />      if( PHASE_B )<br />        new ^= 1;<br />      last = new;<br />      enc_delta = 0;<br />    }<br /><br />int8_t encode_read1(void) // odczyt co krok<br />{<br />int8_t val;<br />cli();<br />val = enc_delta;<br />enc_delta = 0;<br />sei();<br />return val;<br />}<br /><br />int main(void) {<br /><br />encode_init();<br /><br />DDRA &amp;= ~(1&lt;&lt;PA0); // PHASE A<br />DDRA &amp;= ~(1&lt;&lt;PA1); // PHASE B<br />DDRA &amp;= ~(1&lt;&lt;PA3); // ZEW ON/OFF<br />PORTA |= KEY1;  // PODCIAGAMY DO +VCC<br />DDRA &amp;= ~(1&lt;&lt;PA5); // ON/OFF<br />DDRB &amp;= ~(1&lt;&lt;PB2); // ZERO CROSS DETECT<br />DDRA |= (1&lt;&lt;PA6);  // OUTPUT<br />DDRA |= (1&lt;&lt;PA7);  // LED DIODE<br /><br />// Przerwanie INT0<br />MCUCR |= (1 &lt;&lt; ISC00); // kazde zbocze<br />GIMSK |= (1 &lt;&lt; INT0); // odblokowanie INT0<br /><br /><br />//PCMSK |= (1 &lt;&lt; PCINT0);<br />#define TIMER0_START TCCR0B |= (1 &lt;&lt; CS01);  // 8 x preskaler<br />#define TIMER0_STOP TCCR0B = 0;<br />TCCR0A |= (1 &lt;&lt; WGM01);  // tryb CTC<br />TIMSK0 |= (1 &lt;&lt; OCIE0A); // odblokowanie przerwania COMPARE MATCH<br />OCR0A = 99; // przepelnienie co 0,1ms dla 8,0 MHz 8 x prscaler<br />sei();<br />TIMER0_STOP;<br />i=0;<br />val=0;<br />ostatni=0;<br />WLA_WYL=0;<br />tk=0;<br />LED_OFF;<br />PUSZCZONE=0;<br />TRZYMANE=0;<br />pp=0;<br />zz=0;<br /><br />_delay_ms(10);<br /><br />while (1) {<br />val += encode_read1(); // odczyt jednego kroku<br />if (val &gt; 99) val = 99;<br />if (val &lt; 10) val = 10;<br /><br />if (WLA_WYL==0) kanal1=0;<br />if (WLA_WYL==1)kanal1 = 100 - val;<br /><br />if (WLA_WYL == 0) LED_ON;<br />else LED_OFF;<br /><br />if (!(PINA &amp; KEY1) &amp;&amp; !TRZYMANE ) pp++;// Poczatek obslugi zew wyzwolenia<br /><br />if (pp==1500){<br />TRZYMANE=1;<br />WLA_WYL =!WLA_WYL;//reakcja na wcisk i trzymanie<br />pp=0;<br />}<br /><br />if ( KEY1 &amp;&amp; TRZYMANE) zz++;  // reakcja na puszczenie po trzymaniu<br /><br />if (zz==1700) TRZYMANE=0;<br /><br />if (!(PINA &amp; KEY1) &amp;&amp; TRZYMANE ) zz=0;// reakcja normalna koniec obslugi zew wyzwolenia<br /><br />}<br />}<br /><br />//////////////////////////////////////////////////////<br /><br />ISR(INT0_vect) {// Przerwanie INT0 zero Cross detect<br /><br />TIMER0_STOP;<br />TCNT0=0;<br />PORTA &amp;= ~(1 &lt;&lt; PA6);<br />//PORTA |= (1 &lt;&lt; PA6);<br />i=0;<br />zal=0;<br /><br />if( !(PINA &amp; (1&lt;&lt;PA5))) tk++;// klawisz wcisniety<br />else tk=0;<br />if(tk==5) {<br />WLA_WYL =!WLA_WYL;<br />  }<br /><br />TIMER0_START;<br /><br />}<br /><br />/////////////////////////////////////////////////////////////////<br /><br />ISR(TIM0_COMPA_vect) {// przerwanie od TIMER0<br />i++;<br /><br />if (i==kanal1){<br />zal =1;<br />PORTA |= (1 &lt;&lt; PA6);<br />}<br /><br />if (i==100){<br />zal=0;<br />PORTA &amp;= ~(1 &lt;&lt; PA6);<br />}<br /><br />new = 0;<br />if( PHASE_A )<br />  new = 3;<br />if( PHASE_B )<br />  new ^= 1;                                   // konwersja do binarki<br />diff = last - new;<br />if( diff &amp; 1 ){                               // bit 0 = value (1)<br />  last = new;                                 // zapamiêtanie nowej wartoœci w  next last<br />  enc_delta += (diff &amp; 2) - 1;                // bit 1 = direction (+/-)<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 26 lis 2013, o 23:29</p><hr />
]]></content>
</entry>
</feed>