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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-28T20:17:59+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12146&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-06-28T20:17:59+01:00</updated>
<published>2015-06-28T20:17:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133144#p133144</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133144#p133144"/>
<title type="html"><![CDATA[Re: PWM kolorowa dioda LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133144#p133144"><![CDATA[
Najlepiej jakbyś zrezygnował z tych opóźnień i użył timera do odmierzania czasu, wtedy reakcja byłaby natychmiastowa. Jak używa się timera to program tylko sprawdza czy ma coś zrobić teraz czy nie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 cze 2015, o 20:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[buc]]></name></author>
<updated>2015-06-27T19:19:38+01:00</updated>
<published>2015-06-27T19:19:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133072#p133072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133072#p133072"/>
<title type="html"><![CDATA[Re: PWM kolorowa dioda LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133072#p133072"><![CDATA[
Witam ponownie<br />Dziękuję za pomoc na szczęście mi się udał to zrobić. Próbowałem z instrukcją break na początku funkcji while(1)już wcześniej, jak to sugerował kolega Krauser lecz aby przerwać funkcję musiałem czekać aż cała się wykona i zacznie od początku. Rozwiązałem to w taki sposób że wstawiłem instrukcję break w każdej pętli for dzięki czemu mogę zmienić stan diod w dowolnym momencie.<br /><br />pozdrawiam<br />Konrad<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10310">buc</a> — 27 cze 2015, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-06-27T18:24:15+01:00</updated>
<published>2015-06-27T18:24:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133063#p133063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133063#p133063"/>
<title type="html"><![CDATA[Re: PWM kolorowa dioda LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133063#p133063"><![CDATA[
<div class="quotetitle">buc napisał(a):</div><div class="quotecontent"><br />Mam pytanie w jaki sposób mogę przerwać działanie tej pętli w dowolnym momencie, po naciśnięciu przycisków KEY1 - KEY7<br /></div><br />Instrukcja break służy do przerywania pętli.<br />[syntax=c]if( KEY8_DOWN)<br />{<br />   _delay_ms(80);<br />   if(KEY8_DOWN)<br />   while(1)<br />   {<br />      if( KEY1_DOWN) break;  //wyjście z pętli while<br />      //rozjasnianie diody R i sciemnianie diody B<br />      //...<br />   }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 27 cze 2015, o 18:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2015-06-27T15:13:02+01:00</updated>
<published>2015-06-27T15:13:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133036#p133036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133036#p133036"/>
<title type="html"><![CDATA[Re: PWM kolorowa dioda LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133036#p133036"><![CDATA[
tak na szybko bez jakiejkolwiek optymalizacji zrobiłbym to tak:<br /><br />pseudo kod :<br />[syntax=c]if(KEY8_DOWN){<br />  _delay_ms(80);<br />  while( KEY8_DOWN ) ; //czekam na puszczenie klawisza<br />  while(KEY8_UP) {<br />    // tutaj automatyka ściemniania / rozjaśniania<br />    <br />   }<br />  _delay_ms(80); //opóźnienie związane z drganiami styków po wyjściu z pętli automatyki<br />  while(KEY8_DOWN); //ewentualne poczekanie na zwolnienie przycisku<br />}[/syntax]<br /><br />Zdaję sobie sprawę że ten przykład nie jest w ogóle optymalny<br />potraktuj to jako wskazówkę i dopracuj jeśli zadziała <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 27 cze 2015, o 15:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[buc]]></name></author>
<updated>2015-06-27T14:52:10+01:00</updated>
<published>2015-06-27T14:52:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133035#p133035</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133035#p133035"/>
<title type="html"><![CDATA[PWM kolorowa dioda LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12146&amp;p=133035#p133035"><![CDATA[
Witam<br />Napisałem prosty program do zmiany kolorowej diody LED RGB. Chciałbym za pomocą przycisków wybrać manualnie kolory, a po naciśnięciu ostatniego przycisku nastąpiła stopniowa zmiana kolorów. Wszystko działa tak jak powinno lecz gdy włącza się pętla trybu automatycznego zmiany kolorów nie można powrócić do manualnej zmiany przyciskami. Mam pytanie w jaki sposób mogę przerwać działanie tej pętli w dowolnym momencie, po naciśnięciu przycisków KEY1 - KEY7? Poniżej przedstawiam kod programu:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 27 cze 2015<br /> *      Author: Konrad<br /> */<br />/*<br /> * main.c<br /> *<br /> *  Created on: 26 cze 2015<br /> *      Author: Konrad<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 />//definicje zmiennych do sterowania 6 kanałami PWM<br /> volatile uint8_t pwm1, pwm2, pwm3;<br /><br />//klawisz 1<br />#define KEY1_PIN (1&lt;&lt;PA0)<br />#define KEY1_DOWN !(PINA &amp; KEY1_PIN)<br /><br />//klawisz 2<br />#define KEY2_PIN (1&lt;&lt;PA1)<br />#define KEY2_DOWN !(PINA &amp; KEY2_PIN)<br /><br />//klawisz 3<br />#define KEY3_PIN (1&lt;&lt;PA2)<br />#define KEY3_DOWN !(PINA &amp; KEY3_PIN)<br /><br />//klawisz 4<br />#define KEY4_PIN (1&lt;&lt;PA3)<br />#define KEY4_DOWN !(PINA &amp; KEY4_PIN)<br /><br />//klawisz 5<br />#define KEY5_PIN (1&lt;&lt;PA4)<br />#define KEY5_DOWN !(PINA &amp; KEY5_PIN)<br /><br />//klawisz 6<br />#define KEY6_PIN (1&lt;&lt;PA5)<br />#define KEY6_DOWN !(PINA &amp; KEY6_PIN)<br /><br />//klawisz 7<br />#define KEY7_PIN (1&lt;&lt;PA6)<br />#define KEY7_DOWN !(PINA &amp; KEY7_PIN)<br /><br />//klawisz 8<br />#define KEY8_PIN (1&lt;&lt;PA7)<br />#define KEY8_DOWN !(PINA &amp; KEY8_PIN)<br /><br /><br /><br />//główna funkcja programu<br />int main(void)<br />{<br /><br />// sprzetowy PWM 1 kanał OC0(PB3)<br />//ustawie końcówki OC0 (PB3), sprzętowy PWM jako wyjście<br />DDRB |= (1&lt;&lt;PB3);<br /><br />// ustawienie TIMER0 w Fast PWM<br /><br />TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);//tryb Fast PWM<br />TCCR0 |= (1&lt;&lt;COM01);//clear at TOP<br />TCCR0 |= (1&lt;&lt;CS00);//preskaler = 1<br />OCR0 = 255;// wygaszenie diody w kanale PWM<br /><br />//porgramowy PWM<br />// ustawienie pinów kanałów programowych PWM jako wyjścia<br /><br />DDRC |= (1&lt;&lt;PC0)|(1&lt;&lt;PC1)|(1&lt;&lt;PC2);<br /><br />//wygaszenie diod podłączonych katodami do wyjśc<br /><br />PORTC |= (1&lt;&lt;PC0)|(1&lt;&lt;PC1)|(1&lt;&lt;PC2);<br /><br />// ustawienie TIMER2 w tryb CTC<br /><br />TCCR2 |= (1&lt;&lt;WGM21);//tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20);//preskaler = 1<br />OCR2 = 200;//dodatkowy podział przez 200<br />TIMSK |= (1&lt;&lt;OCIE2);//zezwolenie na przerwanie Compare Match<br /><br />DDRA &amp;= ~KEY1_PIN;<br />PORTA |= KEY1_PIN;<br /><br />DDRA &amp;= ~KEY2_PIN;<br />PORTA |= KEY2_PIN;<br /><br />DDRA &amp;= ~KEY3_PIN;<br />PORTA |= KEY3_PIN;<br /><br />DDRA &amp;= ~KEY4_PIN;<br />PORTA |= KEY4_PIN;<br /><br />DDRA &amp;= ~KEY5_PIN;<br />PORTA |= KEY5_PIN;<br /><br />DDRA &amp;= ~KEY6_PIN;<br />PORTA |= KEY6_PIN;<br /><br />DDRA &amp;= ~KEY7_PIN;<br />PORTA |= KEY7_PIN;<br /><br />DDRA &amp;= ~KEY8_PIN;<br />PORTA |= KEY8_PIN;<br /><br />sei();<br /><br />volatile uint8_t r;<br />volatile uint8_t g;<br />volatile uint8_t b;<br /><br />while(1)<br />{<br />if( KEY1_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY1_DOWN)<br />{<br />pwm1=255;<br />pwm2=0;<br />pwm3=0;<br />_delay_ms(200);<br />}<br />}<br /><br />if( KEY2_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY2_DOWN)<br />{<br />pwm1=127;<br />pwm2=127;<br />pwm3=0;<br />_delay_ms(200);<br />}<br />}<br />if( KEY3_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY3_DOWN)<br />{<br />pwm1=0;<br />pwm2=255;<br />pwm3=0;<br />_delay_ms(200);<br />}<br />}<br /><br />if( KEY4_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY4_DOWN)<br />{<br />pwm1=0;<br />pwm2=127;<br />pwm3=127;<br />_delay_ms(200);<br />}<br />}<br /><br />if( KEY5_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY5_DOWN)<br />{<br />pwm1=0;<br />pwm2=0;<br />pwm3=255;<br />_delay_ms(200);<br />}<br />}<br /><br /><br />if( KEY6_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY6_DOWN)<br />{<br />pwm1=127;<br />pwm2=0;<br />pwm3=127;<br />_delay_ms(200);<br />}<br />}<br /><br />if( KEY7_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY7_DOWN)<br />{<br />pwm1=255;<br />pwm2=255;<br />pwm3=255;<br />_delay_ms(200);<br />}<br />}<br /><br /><br />if( KEY8_DOWN)<br />{<br />_delay_ms(80);<br />if(KEY8_DOWN)<br /><br /><br />while(1)<br />{<br />//rozjasnianie diody R i sciemnianie diody B<br />for(r=0; r&lt;255; r++)<br />{<br /><br />pwm1 = r;<br /><br /><br />if(r&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />for(b=255; b; b--)<br />{<br /><br />pwm3 = b;<br />if(b&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />pwm1 = 255;<br />pwm2 = 0;<br />pwm3 = 0;<br /><br /><br />//rozjasnianie diody G i sciemnianie diody R<br />for(g=0; g&lt;255; g++)<br />{<br /><br />pwm2 = g;<br /><br /><br />if(g&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />for(r=255; r; r--)<br />{<br /><br />pwm1 = r;<br />if(r&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />pwm1 = 0;<br />pwm2 = 255;<br />pwm3 = 0;<br /><br />//rozjasnianie diody B i sciemnianie diody G<br />for(b=0; b&lt;255; b++)<br />{<br /><br />pwm3 = b;<br /><br /><br />if(b&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />for(g=255; g; g--)<br />{<br /><br />pwm2 = g;<br />if(g&gt;10) _delay_ms(6);<br />else _delay_ms(30);<br />}<br />pwm1 = 0;<br />pwm2 = 0;<br />pwm3 = 255;<br /><br /><br /><br />}<br /><br /><br />}<br /><br /><br />}<br /><br /><br /><br /><br /><br /><br /><br />}<br />//ciało obsługi przerwania<br />ISR( TIMER2_COMP_vect)<br />{<br />static uint8_t cnt;<br />if(cnt&gt;=pwm1) PORTC |= (1&lt;&lt;PC0); else PORTC &amp;= ~(1&lt;&lt;PC0);<br />if(cnt&gt;=pwm2) PORTC |= (1&lt;&lt;PC1); else PORTC &amp;= ~(1&lt;&lt;PC1);<br />if(cnt&gt;=pwm3) PORTC |= (1&lt;&lt;PC2); else PORTC &amp;= ~(1&lt;&lt;PC2);<br /><br /><br />cnt++;<br /><br />}[/syntax]<br /><br /><br />z góry dziękuję za pomoc i serdecznie pozdrawiam<br />Konrad<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10310">buc</a> — 27 cze 2015, o 14:52</p><hr />
]]></content>
</entry>
</feed>