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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-11-23T15:32:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9373&amp;mode</id>
<entry>
<author><name><![CDATA[bloniak91]]></name></author>
<updated>2014-11-23T15:32:42+01:00</updated>
<published>2014-11-23T15:32:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105608#p105608</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105608#p105608"/>
<title type="html"><![CDATA[Re: Jak połączyć odbiór RC5 i programowe kanały PWM?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105608#p105608"><![CDATA[
Okej, udało się!<br />funkcję zminiająca zmienną od pwm wsadziłem do timera i tyle. Dziękuje za podpowiedź <img src="https://forum.atnel.pl/images/smilies/icon_e_geek.gif" alt=":geek:" title="Świr" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3841">bloniak91</a> — 23 lis 2014, o 15:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bloniak91]]></name></author>
<updated>2014-11-22T17:40:24+01:00</updated>
<published>2014-11-22T17:40:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105492#p105492</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105492#p105492"/>
<title type="html"><![CDATA[Re: Jak połączyć odbiór RC5 i programowe kanały PWM?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105492#p105492"><![CDATA[
Przeczytałem po raz pierwszy <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br />W zastosowaniu do mojego projektu mam zrobić timer sprzętowy, który będzie moim fikcyjnym _delay_ms()? o to chodzi?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3841">bloniak91</a> — 22 lis 2014, o 17:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-22T15:32:52+01:00</updated>
<published>2014-11-22T15:32:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105471#p105471</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105471#p105471"/>
<title type="html"><![CDATA[Re: Jak połączyć odbiór RC5 i programowe kanały PWM?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105471#p105471"><![CDATA[
<div class="quotetitle">bloniak91 napisał(a):</div><div class="quotecontent"><br />Czy ktoś mógłby mi podsunąć pomysł jak rozwiązać ten konflikt przerwań<br /></div><br /><br />Nie trzeba rozwiązywać żadnego konfliktu przerwań ... trzeba zacząć uczyć się pisać funkcje i programy w sposób nieblokujący ...<br /><br />BB rozdział &quot;Wstęp do systemów czasu rzeczywistego&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lis 2014, o 15:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bloniak91]]></name></author>
<updated>2014-11-22T13:27:33+01:00</updated>
<published>2014-11-22T13:27:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105461#p105461</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105461#p105461"/>
<title type="html"><![CDATA[Jak połączyć odbiór RC5 i programowe kanały PWM?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9373&amp;p=105461#p105461"><![CDATA[
Witam,<br />dziewczyna zaproponowała żeby na mikołajki podarować sobie prezenty z seri handmade, więc wymyśliłem, że zrobię jej lampkę biurkową(cierpi na jej brak:P) z pleksi na bazie diod RGB. Żeby było ciekawiej chcę dorzucić sterowanie lampki z pilota na podczerwień oraz napisać prosty program w C# na winddowsa, dzięki któremu będzie mogła sobie zaprogramować klawisze pilota pod odpowiednie programy świecenia, które sama będzie musiała sobie stworzyć.<br />Zabrałem się do pracy. Efektem jest udana próba uruchomienia odbierania sygnałów z pilota. Uruchomiłem programowy PWM na 3 pinach na timerze 0(tak jak w Bluebooku),a zmieniłem dla testów na Timer2. <br />Problem jaki napotkałem, jest związany z przerwaniami. Otóż odbiór RC5 odbywa się na Timerze1b (tak jak w BB- TIMSK|=(1&lt;&lt;TICIE1);,  a programowy PWM na Timerze0 lub 2. Gdy odbiorę wciśnięcie odpowiedniego klawisza z pilota, jest wywoływana funkcja, która odpowiednio steruje PWM, przykładowo rozjaśnianie i ściemnianie jak w BB. Jeśli program wejdzie w tę pętlę, nie ma możliwości żeby uC odbrał następny kod klawisza, który wywołuje inną funkcję(jeśli jest to while(1), nie odbiorę żadnego syganłu. Dla testów przestawiłem żeby pętla wykonywała się 1 raz i po jej skończeniu odbiór RC5 działa znowu prawidłowo).<br />Próbowałem właśnie zmieniać timery od pwm(jest taka tabelka wektorów przerwań w atmedze, myślałem, że jest to jakiś rodzaj priorytetów(wiem, że w atmegach nie ma możliwości ustawiania priorytetów przerwań), ale nic to nie dało). Ustawiłem również przerwanie zwenętrzne INT0 od zbocza narastającego(wyjście od odbiornika podczerwieni podłączone pod PD2), w którym wywoływałem funkcję odbioru klawisza. Przerwanie zewnętrze działało, odbierałem prawidłowo sygnały z pilota, natomiast PWM przestał działać- dioda w ogóle się nie świeciła.<br />Czy ktoś mógłby mi podsunąć pomysł jak rozwiązać ten konflikt przerwań <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  <img src="https://forum.atnel.pl/images/smilies/icon_idea.gif" alt=":idea:" title="Pomysł" /><br />edit: Myślałem jeszcze żeby na timrze1 i np 2 włączyć sprzętowy pwm, który by sobie cały czas śmigał, a odbiór RC5 prznieść na Timer0. Czy jest coś takiego możliwe?<br />Jest jeszcze opcja żeby połączyć 2 atmegi między sobą po rs, na jednym obsługiwać RC5, wysyłać rozkazy do 2atmegi, która będzie sterowała PWM. Problem w tym, że ma to być lampka biurkowa, i rozbudowa płytki o dodatkową atmegę jest komplikująca konstrukcję, bo ma być ona jak najmniejsza. I tak mam mało czasu, więc układ planuję zmontować na płytce uniwersalnej i zamknąc w jakieś puzdrełko <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />edit2 : kod<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;rs.h&quot;<br />#include &quot;IR_DECODE/ir_decode.h&quot;<br />#define DEF_BAUD 19200<br />volatile uint8_t pwm1, pwm2, pwm3;<br /><br />void PILOT();<br />void funkcja()<br />{<br />uint8_t n = 2;<br />while (n)<br />{<br />uint8_t i;<br />for (i = 0; i &lt; 255; i++)<br />{<br />pwm1 = i;<br />pwm2 = i;<br />pwm3 = i;<br />_delay_ms(5);<br /><br />}<br />n--;<br />}<br /><br />}<br /><br />void funkcja2()<br />{<br />uint8_t n = 2;<br />while (n)<br />{<br />uint8_t i; // definicja zmiennej i na potrzeby pętli for()<br /><br />// pętla stopniowo ściemniająca 6 diod LED<br />for (i = 255; i; i--)<br />{<br />pwm1 = i;<br />pwm2 = i;<br />pwm3 = i;<br />_delay_ms(5);<br />}<br />n--;<br />}<br /><br />}<br /><br />int main(void)<br />{<br /><br />//***** PROGRAMOWY PWM - 6 KANAŁÓW *******<br />// ustawienie pinów kanałów programowych PWM jako WYJŚCIA<br />DDRA |= (1 &lt;&lt; PA0) | (1 &lt;&lt; PA1) | (1 &lt;&lt; PA6);<br /><br />MCUCR |= (1 &lt;&lt; ISC00) | (1 &lt;&lt; ISC01); //konfiguracja przerwania INT0<br />GICR |= 1 &lt;&lt; INT0; //włączenie przerwania INT0<br /><br />// ustawienia TIMER2 w tryb CTC<br />TCCR2 |= (1 &lt;&lt; WGM21); // tryb  CTC<br />TCCR2 |= (1 &lt;&lt; CS20); // preskaler = 1<br />OCR2 = 199; // dodatkowy podział częsttotliwości przez 200<br />TIMSK |= (1 &lt;&lt; OCIE2); // zezwolenie na przerwanie CompareMatch<br /><br />//TCCR0 |= (1 &lt;&lt; WGM01); // tryb  CTC<br />//TCCR0 |= (1 &lt;&lt; CS00); // preskaler = 1<br />//OCR0 = 199; // dodatkowy podział częsttotliwości przez 200<br />//TIMSK |= (1 &lt;&lt; OCIE0); // zezwolenie na przerwanie CompareMatch<br /><br />DDRD &amp;= ~(1 &lt;&lt; PD2);<br />PORTD |= (1 &lt;&lt; PD2);<br /><br />ir_init(); /* inicjalizacja dekodowania IR */<br /><br />RS_SET_BAUD(DEF_BAUD);<br />UCSRC = 1 &lt;&lt; URSEL | 1 &lt;&lt; UCSZ1 | 1 &lt;&lt; UCSZ0; //Inicjacja RS232<br />UCSRB = 1 &lt;&lt; RXEN | 1 &lt;&lt; TXEN; // |1 &lt;&lt; RXCIE;<br />UCSRA = 0;<br /><br />//---------------------------------------------------------------------------------------------------------------------------------------------------//<br />fdevopen(rs_put, rs_get);<br /><br />sei();<br />/* włączamy globalne przerwania */<br />printf(&quot;AAAAA\n\r&quot;);<br />/* pętla nieskończona */<br />while (1)<br />{<br />//printf(&quot;ok&quot;);<br />if (Ir_key_press_flag)<br />{ /* jeśli odebrano prawidłowe kody z pilota */<br />PILOT();<br />}<br /><br />}<br />}<br />// ciało procedury obsługi przerwania Compare Match Timera2<br />ISR( TIMER2_COMP_vect )<br />{<br />static uint8_t cnt; // definicja naszego licznika PWM<br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if (cnt &gt;= pwm1)<br />PORTA |= (1 &lt;&lt; PA0);<br />else<br />PORTA &amp;= ~(1 &lt;&lt; PA0);<br />if (cnt &gt;= pwm2)<br />PORTA |= (1 &lt;&lt; PA1);<br />else<br />PORTA &amp;= ~(1 &lt;&lt; PA1);<br />if (cnt &gt;= pwm3 &amp;&amp; pwm3 != 0)<br />PORTA |= (1 &lt;&lt; PA6);<br />else<br />PORTA &amp;= ~(1 &lt;&lt; PA6);<br /><br />cnt++; // zwiększanie licznika o 1<br />}<br />SIGNAL(SIG_INTERRUPT0) //początek funkcji obsługi przerwania<br />{<br />PILOT();<br />}<br />void PILOT()<br />{<br />//MCUCR &amp;= ~(1 &lt;&lt; ISC00 | 1 &lt;&lt; ISC01); //konfiguracja przerwania INT0<br />//GICR &amp;= ~(1 &lt;&lt; INT0);<br />if (Ir_key_press_flag)<br />{<br />if (command == 57)<br />{<br />if (address == 16)<br />{<br />printf(&quot;CH-&quot;);<br />printf(&quot;\n\r&quot;);<br />funkcja();<br />}<br />}<br />else if (command == 49)<br />{<br />if (address == 16)<br />{<br />printf(&quot;CHANEL&quot;);<br />printf(&quot;\n\r&quot;);<br />pwm3 = 0;<br />}<br />}<br />else if (command == 1)<br />{<br />if (address == 15)<br />{<br />printf(&quot;CH+&quot;);<br />printf(&quot;\n\r&quot;);<br />funkcja2();<br />}<br />}<br />else if (command == 9)<br />{<br />if (address == 15)<br />{<br />printf(&quot;PREV&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 53)<br />{<br />if (address == 0)<br />{<br />printf(&quot;NEXT&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 61)<br />{<br />if (address == 0)<br />{<br />printf(&quot;PLAY/PAUSE&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 62)<br />{<br />if (address == 15)<br />{<br />printf(&quot;VOL-&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 57)<br />{<br />if (address == 19)<br />{<br />printf(&quot;VOL+&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 4)<br />{<br />if (address == 24)<br />{<br />printf(&quot;EQ&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 49)<br />{<br />if (address == 19)<br />{<br />printf(&quot;0&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 59)<br />{<br />if (address == 27)<br />{<br />printf(&quot;100+&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 56)<br />{<br />if (address == 23)<br />{<br />printf(&quot;200+&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 8)<br />{<br />if (address == 8)<br />{<br />printf(&quot;1&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 11)<br />{<br />if (address == 4)<br />{<br />printf(&quot;2&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 48)<br />{<br />if (address == 20)<br />{<br />printf(&quot;3&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 52)<br />{<br />if (address == 7)<br />{<br />printf(&quot;4&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 55)<br />{<br />if (address == 11)<br />{<br />printf(&quot;5&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 12)<br />{<br />if (address == 27)<br />{<br />printf(&quot;6&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 13)<br />{<br />if (address == 31)<br />{<br />printf(&quot;7&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 50)<br />{<br />if (address == 28)<br />{<br />printf(&quot;8&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else if (command == 51)<br />{<br />if (address == 24)<br />{<br />printf(&quot;9&quot;);<br />printf(&quot;\n\r&quot;);<br />}<br />}<br />else<br />{<br />}<br /><br />/* wyzerowanie flagi odbioru oraz wartości odebranych kodów */<br />Ir_key_press_flag = 0;<br />command = 0xff;<br />address = 0xff;<br />//MCUCR |= (1 &lt;&lt; ISC00) | (1 &lt;&lt; ISC01); //konfiguracja przerwania INT0<br />//GICR |= 1 &lt;&lt; INT0; //włączenie przerwania INT0<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3841">bloniak91</a> — 22 lis 2014, o 13:27</p><hr />
]]></content>
</entry>
</feed>