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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-03T16:23:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7290&amp;mode</id>
<entry>
<author><name><![CDATA[Paszo]]></name></author>
<updated>2014-06-03T16:23:50+01:00</updated>
<published>2014-06-03T16:23:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83217#p83217</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83217#p83217"/>
<title type="html"><![CDATA[Re: Enkoder zlicza co 2 lub co 4 &quot;kliknięcia&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83217#p83217"><![CDATA[
Nie próbowałem ponieważ enkoder na mojej płytce nie jest podłączony do przerwania zewnętrznego.<br /><br />Dorwałem inny enkoder i działa bez najmniejszych problemów, więc wnioskuję że z tamtym było coś nie tak a niestety nie mam oscyloskopu żeby sprawdzić co generuje na wyjściu .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=587">Paszo</a> — 3 cze 2014, o 16:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-03T16:21:39+01:00</updated>
<published>2014-06-03T16:21:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83216#p83216</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83216#p83216"/>
<title type="html"><![CDATA[Re: Enkoder zlicza co 2 lub co 4 &quot;kliknięcia&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83216#p83216"><![CDATA[
a zapytam tak jeszcze kontrolnie - tam na końcu tego artykułu na blogu jest link do forum, do innego sposobu obsługi enkodera , który przedstawił z kolei nasz szanowny kolega Antystatyczny .... czy próbowałeś też właśnie tej metody (tak z ciekawości zapytam?)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 cze 2014, o 16:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paszo]]></name></author>
<updated>2014-06-03T15:56:53+01:00</updated>
<published>2014-06-03T15:56:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83213#p83213</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83213#p83213"/>
<title type="html"><![CDATA[Enkoder zlicza co 2 lub co 4 &quot;kliknięcia&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7290&amp;p=83213#p83213"><![CDATA[
Witam.<br />Mam problem z enkoderem, mianowicie zlicza co 2 lub co 4 &quot;kliknięcie&quot;. Nie bardzo potrafię sobie z tym poradzić.<br />Kożystam z biblioteki <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2013/04/encoder-avr-callbackow-ciag-dalszy-cz2.html" >http://mirekk36.blogspot.com/2013/04/en ... y-cz2.html</a><!-- m --><br />Na początku zliczał co 4 &quot;kliknięcia&quot; ale trochę pozmieniałem idąc za poradami z tematu <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic2940-30.html" >topic2940-30.html</a><!-- l --><br />i po zabiegach zaproponowanych przez BIGjack'a zlicza co dwa &quot;kliknięcia&quot;. Po drodze było jeszcze zliczanie co 8 <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <br />Działam na atmedze 32 kwarc 16MHz.<br />Poniżej kody projektu, który zlicza raz na 4 kliknięcia.<br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 02-06-2014<br /> *      Author: Łukasz<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;pinGLCD.h&quot;<br />#include &quot;glcd_KS0107.h&quot;<br />#include &quot;encoder/mk_encoder.h&quot;<br /><br />int a;<br />void my_encoder( int8_t dir, int8_t w );<br />void enc_switch( void );<br /><br />uint8_t speed=0;// prędkość zliczania enkodera<br /><br />uint32_t wynik;// wartość zliczana przez enkoder<br />int main(void) {<br /><br /><br /><br />DDRB|=(1&lt;&lt;PB2); //Kierunak portu<br />//PORTB|=(1&lt;&lt;PB2); //Podwietlenie<br />LCD_init();<br />LCD_clr();<br />a=0;<br />encoder_init(1);<br />register_enc_callback( my_encoder );<br />register_sw_callback( enc_switch );<br /><br />sei();<br /><br /><br />while (1) {<br /><br />ENCODER_EVENT( speed );<br /><br />;<br />}<br />}<br /><br />void my_encoder( int8_t dir, int8_t w ) {<br /><br />wynik += w;<br />LCD_clr();<br />LCD_setCursorXY(30,0);<br />LCD_put_int(wynik);<br />}<br /><br />void enc_switch( void ) {<br /><br /><br />PORTB^=(1&lt;&lt;PB2);<br /><br />}[/syntax]<br />MK_ENCODER.h<br />[syntax=c]/*<br /> * mk_encoder.h<br /> *<br /> *  Created on: 15-04-2013<br /> *      Author: Mirosław Kardaś<br /> */<br />#ifndef MK_ENCODER_H_<br />#define MK_ENCODER_H_<br /><br />// definicja pinów enkodera<br />#define ENC_PH_A (1&lt;&lt;PA1)<br />#define ENC_PH_B (1&lt;&lt;PA4)<br />#define ENC_PORT A<br /><br />// definicja pinu przycisku enkodera<br />#define ENC_SW(1&lt;&lt;PA0)<br />#define ENC_SWPORTA<br /><br />//-----------------------------------<br /><br />// wybór timera 0 lub 2<br />#define TIMER2<br />//-----------------------------------<br /><br /><br />#define PHASE_A         (PIN(ENC_PORT) &amp; ENC_PH_A)<br />#define PHASE_B         (PIN(ENC_PORT) &amp; ENC_PH_B)<br /><br />#if TIMER == 0<br />#define ENCODER_vect TIMER0_COMP_vect<br />#endif<br /><br />#if TIMER == 2<br />#define ENCODER_vect TIMER2_COMP_vect<br />#endif<br /><br /><br /><br /><br />// Makra upraszczające dostęp do portów<br />// *** PORT<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) SPIN(x)<br />#define SPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br /><br /><br />void register_enc_callback( void (*callback)( int8_t dir, int8_t cnt ) );<br />void register_sw_callback( void (*callback)( void ) );<br /><br />void ENCODER_EVENT( int8_t res );<br /><br />void encoder_init( uint8_t on_off );<br /><br /><br />#endif /* MK_ENCODER_H_ */[/syntax]<br />MK_ENCODER.c<br />[syntax=c]/*<br /> * mk_encoder.c<br /> *<br /> *  na podstawie biblioteki z:<br /> *  http://www.mikrocontroller.net/articles/Drehgeber<br /> *  Author: Peter Dannegger<br /> *<br /> *  Created on: 15-04-2013<br /> *      modification: Mirosław Kardaś<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;mk_encoder.h&quot;<br /><br /><br />volatile int8_t ed;<br /><br />volatile int8_t enc_cnt;<br />volatile uint8_t enc_flag;<br /><br /><br />//const int8_t table&#91;16&#93; PROGMEM = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0}  {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};<br />const int8_t table&#91;16&#93; PROGMEM ={0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0} ;<br /><br />// obsługa enkodera<br />void (*enc_callback)( int8_t dir, int8_t cnt );<br /><br />void register_enc_callback( void (*callback)( int8_t dir, int8_t cnt ) ) {<br />enc_callback = callback;<br />}<br /><br />// obsługa klawisza<br />void (*sw_callback)( void );<br /><br />void register_sw_callback( void (*callback)( void ) ) {<br />sw_callback = callback;<br />}<br /><br />void encoder_init( uint8_t on_off ) {<br /><br />if( !on_off ) {<br />#if TIMER == 0<br />TCCR0 &amp;= ~((1&lt;&lt;CS01)|(1&lt;&lt;CS00));        // stop timer0<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0);// disable interrupt<br />#endif<br /><br />#if TIMER == 2<br />TCCR2 &amp;= ~(1&lt;&lt;CS22);        // stop timer2<br />TIMSK &amp;= ~(1&lt;&lt;OCIE2);// disable interrupt<br />#endif<br />return;<br />}<br /><br />PIN(ENC_PORT)  &amp;= ~(ENC_PH_A|ENC_PH_B);<br />PORT(ENC_PORT) |= ENC_PH_A|ENC_PH_B;<br /><br />PIN(ENC_SWPORT) &amp;= ~ENC_SW;<br />PORT(ENC_SWPORT) |= ENC_SW;<br /><br /><br />#if TIMER == 0<br />TCCR0 = (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS01)|(1&lt;&lt;CS00);         // prescaler 64<br />OCR0 = (uint8_t)(F_CPU / 64 / 1000 );           // 1ms  --&gt; poprawka do VIDEO<br />TIMSK |= (1&lt;&lt;OCIE0);<br />#endif<br /><br />#if TIMER == 2<br />TCCR2 = (1&lt;&lt;WGM21);// tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22);        // prescaler 64<br />OCR2 = 249;           // 1ms --&gt; poprawka do VIDEO<br />TIMSK |= (1&lt;&lt;OCIE2);<br />#endif<br /><br />}<br /><br />void ENCODER_EVENT( int8_t res ) {<br />uint8_t sreg;<br />int8_t ecnt;<br />static uint8_t key_lock;<br /><br />// obsługa zdarzeia enkodera<br />if( enc_callback &amp;&amp; enc_flag  ) {<br /><br />sreg = SREG;<br />cli();<br />ecnt = ed&gt;&gt;2; ed &amp;= 3;<br />//ecnt = ed; ed = 0;<br />SREG = sreg;<br />//sei();<br />if(ecnt&gt;=1) ecnt=1;<br />if(ecnt&lt;=-1) ecnt=-1;<br /><br />if(!res) res=1;<br /><br />if(ecnt) enc_callback( ecnt*-1, ecnt*res );<br /><br />enc_flag=0;<br />}<br /><br />// obsługa zdarzenia przycisku<br />if( sw_callback ) {<br />if( !key_lock &amp;&amp; !(PIN(ENC_SWPORT) &amp; ENC_SW) ) {<br />key_lock=1;<br /><br />// reakcja na wcinięcie klawisza<br />sw_callback();<br />}<br />else if( key_lock &amp;&amp; (PIN(ENC_SWPORT) &amp; ENC_SW ) ) {<br />if( !++key_lock ) {<br /><br />// ewentualnie reakcja na zwolnienie klawisza ;)<br />//sw_callback();<br />}<br />}<br />}<br /><br />}<br /><br /><br /><br />// Przerwanie timera co 1 ms<br />ISR( ENCODER_vect , ISR_NOBLOCK ) {<br /><br />    static int8_t last;<br />    static int8_t last_ed;<br /><br />    last = (last &lt;&lt; 2)  &amp; 0x0F;<br />    if (PHASE_A) last |=2;<br />    if (PHASE_B) last |=1;<br />    ed += pgm_read_byte( &amp;table&#91;last&#93; );<br /><br />    if( last_ed != ed ) enc_flag=1;<br /><br />    last_ed=ed;<br /><br />}[/syntax]<br /><br />Po zmianach w pliku MK_ENCODER.c<br />[syntax=c]//const int8_t table&#91;16&#93; PROGMEM ={0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0} ;<br />const int8_t table&#91;16&#93; PROGMEM ={0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0} ;[/syntax]<br />[syntax=c]//ecnt = ed&gt;&gt;2; ed &amp;= 3;<br />ecnt = ed; ed = 0;[/syntax]<br /><br />Zlicza raz na dwa kliknięcia. Może ktoś zetknął się z podobną sytuacją lub po prostu jest lepszy ode mnie w te klocki i wie jak to rozwiązać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=587">Paszo</a> — 3 cze 2014, o 15:56</p><hr />
]]></content>
</entry>
</feed>