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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-08-09T17:49:07+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=12573&amp;mode</id>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-08-09T17:49:07+01:00</updated>
<published>2015-08-09T17:49:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136866#p136866</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136866#p136866"/>
<title type="html"><![CDATA[Re: Pilot IR - konieczność dwukrotnego naciśnięcia przycisku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136866#p136866"><![CDATA[
Może podasz kod, który uruchamiasz a nie ten skopiowany ze storny??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 9 sie 2015, o 17:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dar94k]]></name></author>
<updated>2015-08-08T14:31:36+01:00</updated>
<published>2015-08-08T14:31:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136796#p136796</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136796#p136796"/>
<title type="html"><![CDATA[Re: Pilot IR - konieczność dwukrotnego naciśnięcia przycisku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136796#p136796"><![CDATA[
Poprawione<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8875">dar94k</a> — 8 sie 2015, o 14:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2015-08-07T20:32:56+01:00</updated>
<published>2015-08-07T20:32:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136726#p136726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136726#p136726"/>
<title type="html"><![CDATA[Re: Pilot IR - konieczność dwukrotnego naciśnięcia przycisku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136726#p136726"><![CDATA[
<!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 7 sie 2015, o 20:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dar94k]]></name></author>
<updated>2015-08-08T14:31:11+01:00</updated>
<published>2015-08-07T20:00:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136723#p136723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136723#p136723"/>
<title type="html"><![CDATA[Pilot IR - konieczność dwukrotnego naciśnięcia przycisku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12573&amp;p=136723#p136723"><![CDATA[
Witam, mam pewien problem dotyczący pilota RC5.<br /><br />Korzystam z kodu znalezionego na stronie:<br /><a href="http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=16"  class="postlink">http://hobby.abxyz.bplaced.net/index.php?pid=3&amp;aid=16</a><br /><br />[syntax=c]---------------------------------------------------------------<br />//   Plik &quot;main.c&quot;<br />//<br />//   KURS AVR-GCC (abxyz.bplaced.net)<br />// <br />//   Dekoder  RC5<br />// <br />//   (schemat i opis działania w artykule)<br />//   testowanie na atmega8 (8MHz)<br />//---------------------------------------------------------------<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />// Odbiornik podczerwieni SFH5110  przyłączona do portu  PB0 <br />#define RC5_IN   (PINB &amp; (1&lt;&lt;0))<br /><br />//<br />typedef unsigned char u8;<br />typedef unsigned int  uint;<br /><br />// Zmienne globalne pełnią rolę  programowych zegarów<br />// napędzanych przerwaniem TIMER0_OVF<br />volatile u8 timerL; <br />volatile u8 timerH; <br /><br />//---------------------------------------------------------------<br />// Funkcja konfiguruje i uruchamia Timer0 <br />// oraz włącza przerwanie od przepełnienia timera,<br />// przerwanie powinno występować co 32us.  <br />//---------------------------------------------------------------<br />void init_rc5()<br />{<br />  //atmega8<br />  TCCR0 = (1&lt;&lt;CS00);  // włącza Timer0  <br />  TIMSK = (1&lt;&lt;TOIE0); // włącza przerwanie &quot;Timer0 Overflow&quot;<br /><br />/*<br />  //atmega88<br />  TCCR0B = (1&lt;&lt;CS00);<br />  TIMSK0 = (1&lt;&lt;TOIE0);<br />*/<br />  // Zezwala na przerwania <br />  sei();<br />}<br /><br />//---------------------------------------------------------------<br />// Procedura obsługi przerwania  Timer0 Overflow&quot;<br />//---------------------------------------------------------------<br />ISR(TIMER0_OVF_vect)<br />{<br />   volatile  static u8 inttemp;<br /><br />   // zmienna timerL zwiększa się co 32us<br />   timerL++;<br /><br />   // zmienna timerH  zwiększa się co 8.192ms (32us*256) <br />   inttemp++;<br />   if(!inttemp ) timerH++;<br />}<br /><br />//---------------------------------------------------------------<br />// Funkcja wykrywa i dekoduje  komendę pilota RC5                                             <br />//---------------------------------------------------------------<br /> uint detect()<br /> {<br />    u8 temp;<br />    u8 ref1;<br />    u8 ref2;<br />    u8 bitcnt;<br />    uint command;<br /><br />    timerH  = 0;<br />    timerL  = 0;<br /><br />    // Czeka na okres ciszy na linii wejścia uC trwający  3.5ms<br />    // Jeśli nie wykryje takiego okresu ciszy w ciągu 131ms,<br />    // to kończy działanie funkcji z błędem<br />    while( timerL&lt;110)<br />    {<br />       if(timerH&gt;=16)  return  command = -1;<br /><br />       if(!RC5_IN) timerL = 0;<br />    }<br /><br />    // Czeka na  pierwszy bit startowy. <br />    // Jeśli nie wykryje bitu startowego w ciągu 131ms,<br />    // to kończy działanie funkcji z błędem<br />    while(RC5_IN)  <br />         if(timerH&gt;=16)  return command = -1 ;<br /><br /><br />    // Pomiar czasu trwani niskiego poziom syganłu <br />    // w pierwszym bicie startowym.<br />    // Jeśli nie wykryje rosnącego zbocza sygnału w ciągu  <br />    // 1ms, to kończy działanie funkcji z błędem <br />    timerL = 0;<br />    while(!RC5_IN)<br />         if(timerL&gt;34) return command = -1;<br /><br />    //<br />    temp = timerL;<br />    timerL = 0;<br /><br />    // ref1 - oblicza  3/4 czasu trwania bitu<br />    ref1 =temp+(temp&gt;&gt;1);<br /><br />    // ref2 - oblicza 5/4 czasu trwania bitu<br />    ref2 =(temp&lt;&lt;1)+(temp&gt;&gt;1);<br /><br /> <br />    // Oczekuje na zbocze opadające sygnału w środku drugiego<br />    // bitu startowego.<br />    // Jeśli nie wykryje zbocza w ciągu 3/4 czasu trwania <br />    // bitu, to kończy działanie funkcji z błędem <br />    while(RC5_IN)<br />         if(timerL &gt; ref1) return command = -1;<br /><br />    // W momencie wykrycia zbocza sygnału, synchronizuje<br />    // zmieną timerL dla próbkowania  bitu toggle<br />    timerL = 0;<br /><br />    // Odczytuje dekoduje pozostałe 12 bitów polecenia rc5<br />    for(bitcnt=0, command = 0; bitcnt &lt;12; bitcnt++)<br />    {<br />       // Czeka 3/4 czasu trwania bitu od momentu wykrycia<br />       // zbocza sygnału w połowie poprzedniego bitu <br />       while(timerL &lt; ref1) {};<br /> <br />       // Próbkuje - odczytuje port we  uC<br />       if(!RC5_IN)<br />       {<br />          // Jeśli odczytano 0, zapamiętuje w zmiennej <br />          // &quot;command&quot; bit o wartości 0         <br />          command &lt;&lt;= 1 ;<br /><br />          // Oczekuje na zbocze rosnące sygnału w środku bitu.<br />          // Jeśli nie wykryje zbocza w ciągu 5/4 czasu trwania <br />          // bitu, to kończy działanie funkcji z błędem    <br />          while(!RC5_IN)<br />             if(timerL &gt; ref2) return command = -1;<br />       }<br />       else<br />       {<br />          // Jeśli odczytano 1, zapamiętuje w zmiennej <br />          // &quot;command&quot; bit o wartości 1  <br />          command = (command &lt;&lt;1 ) | 0x01;<br /><br />          // Oczekuje na zbocze opadające sygnału w środku bitu.<br />          // Jeśli nie wykryje zbocza w ciągu 5/4 czasu trwania <br />          // bitu, to kończy działanie funkcji z błędem <br />          while(RC5_IN)<br />             if(timerL &gt; ref2) return command = -1;<br />       }<br /><br />       // W momencie wykrycia zbocza sygnału, synchronizuje<br />       // zmieną timerL dla próbkowania kolejnego bitu<br />       timerL = 0;<br />   }<br /><br />   // Zwraca kod polecenia rc5<br />   // bity 0..5 numer przycisku<br />   // bity 6..10  kod systemu(urządzenia)<br />   // bit 11 toggle bit<br />   return command;<br /> }<br /><br />//---------------------------------------------------------------<br />// GLÓWNA FUNKCJA PROGRAMU                                                   <br />//---------------------------------------------------------------<br />int main(void)<br />{<br />  //<br />  uint cmd;<br />  u8 out;<br /><br />  // Porty PD0..PD6  wyjściami - diody LED<br />  DDRD  = 0x7f;<br />  PORTD = 0x00;<br /><br />  // uruchamia Timer0 i przerwanie<br />  init_rc5();<br /><br />  while (1)<br />  {<br />     // Wykrywa i dekoduje polecenie pilota RC5 <br />     cmd = detect();<br /><br />     // Jeśli odebrano komendę <br />     if(cmd != -1)<br />     {  <br />        // Na sześciu diodach LED pokaże numer polecenia rc5,<br />        // a na siódmej LED - toggle bit<br />        out = (cmd &amp; (1&lt;&lt;11)) &gt;&gt; 5;<br />        out |= cmd &amp; 0x3f;<br />        PORTD = (out);<br />     }<br />  }<br /><br />  return 0;<br />}[/syntax]<br /><br /><br />Wykorzystując ten program spisałem sobie kody dla wszystkich przycisków pilota(używam pilota Philips RC8205).<br /><br />W przedstawionym powyżej kodzie, w funkcji głównej, zamieniłem fragment kodu wewnątrz warunku if na funkcję switch, której zadaniem jest zapalenie odpowiednich diód w przypadku naciśnięcia przycisku: dioda na PD0, gdy wcisnę 1, itd.<br /><br />Zasadniczo program działa, tylko aby zaświeciła się odpowiednia dioda wymagane jest dwukrotne wciśnięcie odpowiedniego przycisku. <br /><br />Ma ktoś jakiś pomysł co może być tego przyczyną?<br /><br />Z góry dziękuję za odpowiedź.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8875">dar94k</a> — 7 sie 2015, o 20:00</p><hr />
]]></content>
</entry>
</feed>