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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-22T19:18:26+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=19667&amp;mode</id>
<entry>
<author><name><![CDATA[Morcinek92]]></name></author>
<updated>2017-11-22T19:18:26+01:00</updated>
<published>2017-11-22T19:18:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199421#p199421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199421#p199421"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199421#p199421"><![CDATA[
Witam Was, <br /><br />Oczywiście macie rację, w kodzie który podałem, źle był skonfigurowany Timer, a to dlatego, że próbowałem wpisywać różne wartości żeby sprawdzić reakcje. Ostatecznie Timer jest ustawiony na preskaler 1 i do rejestru OCRA wpisuje wartość 1300 korzystając z trybu CTC i taktowania procesora 20MHz. <br /><br />Zdecydowałem się na zmianę wartości w funkcji _delay <br /><br />Stosując taki zapis: <br /><br />[syntax=c]for(i=0; i&lt;=MocSchody; i++)<br />{<br />pwm&#91;j&#93; = i;<br />if(i&gt;60) _delay_ms(2);<br />else delay_ms (szybkosc);<br />}<br />pwm&#91;j&#93;= MocSchody;[/syntax]<br /><br />do zmiennej &quot;szybkość&quot; która jest tyupu uint8_t wpisywana jest wartość, która nadlatuje z Uart'a. Natomiast funkcja delay_ms wygląda następująco <br /><br />[syntax=c]void delay_ms(int stop)<br />{<br />int s;<br />for (s = 0; s &lt; stop; s++)<br />{<br />_delay_ms(1);<br />}<br />}[/syntax]<br /><br />Może nie jest to zbyt eleganckie rozwiązanie.. które blokuje pętle główną, ale w moim przypadku sprawdza się i zdaje egzamin. Dziękuję za zainteresowanie i pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<br />Miłego wieczoru<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=903">Morcinek92</a> — 22 lis 2017, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-11-22T11:26:39+01:00</updated>
<published>2017-11-22T11:26:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199393#p199393</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199393#p199393"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199393#p199393"><![CDATA[
Wprawdzie zbyt pobieżnie przeanalizowałem kod i konfiguracja timera nie ma wpływu na szybkość zapalania (zmiany jasności) diod, jednak ogólnie dla działania programu nie jest to całkiem bez znaczenia. Konfiguracja timera będzie miała wpływ na częstotliwość generowania przerwań i pośrednio na częstotliwość PWM. Jeśli częstotliwość ta będzie zbyt mała, może być widoczne migotanie diod. Jeśli będzie zbyt duża, mikrokontroler może nie nadążać z obsługą pozostałej części programu. W tej chwili nie wiadomo, jaka właściwie ta częstotliwość jest, a to, że w tej chwili działa, nie musi oznaczać, że będzie działać po rozbudowaniu programu, kiedy dojdzie obsługa UART, parsowanie i nie wiadomo co jeszcze. Dobrze byłoby więc mieć ten timer pod kontrolą.<br /><br />Trzeba pamiętać, że przy programowym PWM o częstotliwości 100Hz i rozdzielczości 256 dla F_CPU=16MHz przerwania muszą występować co 625 taktów zegara, z czego sama procedura obsługi tego przerwania w tym konkretnym przypadku zajmie ok. 100 taktów, czyli ponad 15% czasu procesora. Czy to dużo czy mało to zależy od stopnia rozbudowania programu, prędkości transmisji UART, optymalności kodu, ogólnej konstrukcji programu itp.<br /><br />Inna sprawa, jaka mi się rzuciła w oczy, to używanie funkcji delay() w programie, który korzysta z przerwań. Czas obsługi przerwań jest doliczany do czasów opóźnień generowanych przez funkcje delay(). Procedury obsługi przerwań nie zawsze trwają tyle samo czasu (bo nie zawsze te same warunki są spełnione lub nie), nie zawsze występują w równych odstępach czasu, więc czasy opóźnień mogą być niedokładne i niestabilne. Tutaj może te opóźnienia nie muszą być jakoś szczególnie dokładne i być może efekty niedokładnych i nierównych opóźnień nie są jakoś szczególnie widoczne, ale nie wiadomo co będzie przy dalszej rozbudowie programu, szczególnie kiedy dojdzie obsługa przerwań od UART, która występuje w przypadkowych momentach, a nie tak jak w przypadku timera regularnie.<br /><br />Osobiście zamiast użyć funkcji led() w pętli głównej programu zrobiłbym to na przerwaniach, ale ja taki jestem czasami zbyt drobiazgowy i się czepiam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Jeśli tam będzie tylko transmisja UART i obsługa prostej klawiatury, to pewnie będzie działać tak jak jest. Dlatego już się nie będę tutaj wymądrzał. Życzę powodzenia <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=14165">andrews</a> — 22 lis 2017, o 11:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-11-21T21:59:20+01:00</updated>
<published>2017-11-21T21:59:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199386#p199386</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199386#p199386"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199386#p199386"><![CDATA[
Hehe ja z kolei wogule nie zagłębiałem się w konfigurację timera bo autor pisał że mu to działa więc z analizie poddałem meritum problemu  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 21 lis 2017, o 21:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-11-21T20:38:59+01:00</updated>
<published>2017-11-21T20:38:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199379#p199379</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199379#p199379"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199379#p199379"><![CDATA[
Kolego <strong>xentis</strong>, jak teraz na to spoglądam, to muszę przyznać Ci rację. Przyznaję, że z pośpiechu nie przeanalizowałem dokładnie kodu (mea culpa) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Nie zmienia to jednak faktu, że timer nie jest skonfigurowany zgodnie z założeniami podanymi w komentarzach, choć faktycznie raczej nie będzie to miało wpływu na szybkość zmian jasności diod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 21 lis 2017, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-11-21T20:07:57+01:00</updated>
<published>2017-11-21T20:07:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199368#p199368</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199368#p199368"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199368#p199368"><![CDATA[
Jeśli dobrze zrozumiałem kolega chce zwiększyć prędkość z jaką diody się zapalają więc gmeranie przy tajmerach raczej nie będzie rozwiązaniem.<br /><br />Aby zwiększyć szybkość zapalania się lub gaszenia musisz przyśpieszyć wykonywanie sekcji która zwiększa lub zmniejsza wartości PWM dla poszczególnych ledów. Czyli w Twoim przypadku odpowiedzialne za to są delaye w funkcji &quot;led&quot;. Większe delaye to wolniejsze wykonywanie się pętli for a co za tym idzie wolniejsze inkrementowanie bądź dekrementowanie wartości PWM.  Gdy zmniejszysz te delaye szybkość wykonywania się  pętli wzrośnie więc i diody szybciej będą się rozjaśniać bądź ściemniać.<br />Innym sposobem na przyśpieszenie procesu będzie inkrementacja o większą liczbę czyli musiałbyś przerobić warunek w pętli z i++ na np. i+=2 tylko musisz przypilnować by warunek kończący pętlę miał szanse zaistnieć (nie wiem jakiego typu jest &quot;i&quot; bo w Twoim kodzie tego zabrakło, jeśli typu int to będzie dobrze ale jeśli uint8_t to już pętla się nie zakończy bo gdy i będzie 254 i przy następnym obiegu zostanie zwiększone o 2 to z powodu ograniczenia 8 - bitowego taka operacja da znów zero czyli warunek prawdziwy i pętla się nie przerwie) - tylko takie rozwiązanie spowoduje spadek płynności rozjaśniania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 21 lis 2017, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-11-21T17:51:16+01:00</updated>
<published>2017-11-21T17:51:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199359#p199359</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199359#p199359"/>
<title type="html"><![CDATA[Re: Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199359#p199359"><![CDATA[
Nie napisałeś, jaki mikrokontroler, ale bity <strong>WGM10</strong> i <strong>WGM11</strong> są raczej zwykle w rejestrze <strong>TCCR1A</strong>, a nie <strong>TCCR1B</strong>. Poza tym ich ustawienie to raczej nie tryb <strong>CTC</strong>, a <strong>Phase Correct 10-bit</strong>, więc wprowadzanie jakiejkolwiek wartości do <strong>OCR1A</strong> nie wpłynie na szybkość generowania przerwań. Dodatkowo ustawienie bitów <strong>CS10</strong> i <strong>CS12</strong> w <strong>TCCR1B</strong> to raczej nie jest preskaler 1, jak masz napisane w komentarzach, ale to bym na razie zostawił.<br /><br />Skonfiguruj porządnie ten timer na odpowiedni tryb (<strong>CTC</strong>) zgodnie dokumentacją techniczną właściwego mikrokontrolera. Zamiast bitów <strong>WGM10</strong> i <strong>WGM11</strong> trzeba będzie prawdopodobnie ustawić tylko bit <strong>WGM12</strong> w rejestrze <strong>TCCR1B</strong>. Ustaw wstępnie wartość OCR!A na ok. 2000 (powinieneś uzyskać podobną częstotliwość migania jak przed poprawkami), a później reguluj za pomocą zmiany wartości <strong>OCR1A</strong>, ewentualnie możesz też zmienić preskaler na mniejszą wartość. Nie wiem, jaki efekt dokładnie chcesz uzyskać, więc musisz sam dobrać odpowiedni preskaler, przy czym nie przesadź z szybkością, bo wykonanie procedury obsługi przerwania trochę trwa, a mikrokontroler ma do wykonania również inne zadania, więc trzeba zapewnić odpowiednie odstępy czasu pomiędzy przerwaniami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 21 lis 2017, o 17:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Morcinek92]]></name></author>
<updated>2017-11-21T15:00:25+01:00</updated>
<published>2017-11-21T15:00:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199342#p199342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199342#p199342"/>
<title type="html"><![CDATA[Zwiększenie szybkości PWM programowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19667&amp;p=199342#p199342"><![CDATA[
Witam, <br /><br />Mam pytanie odnośnie PWM'a programowego.<br /><br />Wszystko działa tak jak chcę Diody ładnie się zapalają od 0 do 255. Ale chciałbym mieć możliwość zwiększenia szybkości  zaplania się ich. I tutaj mam problem nie wiem jak zmienić kod. Wartość szybkości chciałbym wysyłać po uarcie. Ale nie wiem co zmieniać..<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 6 lis 2017<br /> *      Author: Marcin Wójcik<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />// klawisz K1<br />#define KEY_PIN (1&lt;&lt;PC7)<br />#define KEY_RIGHT !(PINC &amp; KEY_PIN)<br /><br />void parse_rs232(char * buf);<br />uint8_t klawisz_wcisniety (uint8_t klawisz);<br />void led (void);<br /><br />uint8_t licznik = 100;<br />uint8_t start = 0;<br />uint8_t Stan_Zmierzchowy = 0;<br />uint8_t i;<br />char pwm &#91;30&#93;;<br />char uart_buf&#91;100&#93;;<br />volatile uint16_t Timer1, Timer2;<br /><br />// ***  STOPNIE ***//  1<br />#define ST1_PIN (1&lt;&lt;PB2)<br />#define ST1_OUT DDRB |= ST1_PIN<br />#define ST1_ON PORTB |= ST1_PIN<br />#define ST1_OFF PORTB &amp;= ~ST1_PIN<br />//  2<br />#define ST2_PIN (1&lt;&lt;PB1)<br />#define ST2_OUT DDRB |= ST2_PIN<br />#define ST2_ON PORTB |= ST2_PIN<br />#define ST2_OFF PORTB &amp;= ~ST2_PIN<br />//  3<br />#define ST3_PIN (1&lt;&lt;PB4)<br />#define ST3_OUT DDRB |= ST3_PIN<br />#define ST3_ON PORTB |= ST3_PIN<br />#define ST3_OFF PORTB &amp;= ~ST3_PIN<br />//  4<br />#define ST4_PIN (1&lt;&lt;PB3)<br />#define ST4_OUT DDRB |= ST4_PIN<br />#define ST4_ON PORTB |= ST4_PIN<br />#define ST4_OFF PORTB &amp;= ~ST4_PIN<br />//  5<br />#define ST5_PIN (1&lt;&lt;PB0)<br />#define ST5_OUT DDRB |= ST5_PIN<br />#define ST5_ON PORTB |= ST5_PIN<br />#define ST5_OFF PORTB &amp;= ~ST5_PIN<br />//  6<br />#define ST6_PIN (1&lt;&lt;PB6)<br />#define ST6_OUT DDRB |= ST6_PIN<br />#define ST6_ON PORTB |= ST6_PIN<br />#define ST6_OFF PORTB &amp;= ~ST6_PIN<br />//  7<br />#define ST7_PIN (1&lt;&lt;PB5)<br />#define ST7_OUT DDRB |= ST7_PIN<br />#define ST7_ON PORTB |= ST7_PIN<br />#define ST7_OFF PORTB &amp;= ~ST7_PIN<br /><br />int main(void)<br />{<br />ST1_OUT; ST2_OUT; ST3_OUT; ST4_OUT; ST5_OUT; ST6_OUT; ST7_OUT;<br />ST1_ON; ST2_ON; ST3_ON; ST4_ON; ST5_ON; ST6_ON; ST7_ON;<br /><br />// Timer 1 - PWM<br />TCCR1B |= (1&lt;&lt;WGM10)|(1&lt;&lt;WGM11); // tryb CTC<br />TCCR1B |= (1&lt;&lt;CS10)|(1&lt;&lt;CS12); // preskaler = 1<br />OCR1A = 6; // dodatkowy podział  (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE1B); // zezwolenie na przerwanie CompareMatch<br /><br />DDRC &amp;= ~KEY_PIN;// kierunek pinu PC6 - wejściowy<br />PORTC |= KEY_PIN;// podciągnięcie pinu do VCC<br /><br /><br />USART_Init(__UBRR);<br /><br />register_uart_str_rx_event_callback( parse_rs232 );<br /><br />sei();<br /><br />while(1)<br />{<br />if (klawisz_wcisniety(KEY_RIGHT))<br />{<br />start = 1;<br />}<br />led ();<br />}<br />}<br /><br />void parse_rs232(char * buf)<br />{<br /><br />}<br /><br />uint8_t klawisz_wcisniety (uint8_t klawisz)<br />{<br />if( (klawisz) )// klawisz wciśnięty ?<br />{<br />_delay_ms(80);// czas drgań styków<br />if (klawisz)  return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />void led (void)<br />{<br />if ( start == 1 )<br />{<br />for (int j=1; j&lt;8;j++)<br />{<br />for(i=0; i&lt;255; i++)<br />{<br />pwm&#91;j&#93; = i;<br />if(i&gt;50) _delay_ms(2);<br />else _delay_ms(5);<br />}<br />pwm&#91;j&#93;= 255;<br />}<br />}<br />start = 0;<br /><br />}<br /><br />ISR(TIMER1_COMPB_vect)<br />{<br />static uint8_t cnt; // definicja naszego licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm&#91;1&#93;) ST3_ON; else ST3_OFF;<br />if(cnt&gt;=pwm&#91;2&#93;) ST4_ON; else ST4_OFF;<br />if(cnt&gt;=pwm&#91;3&#93;) ST1_ON; else ST1_OFF;<br />if(cnt&gt;=pwm&#91;4&#93;) ST2_ON; else ST2_OFF;<br />if(cnt&gt;=pwm&#91;5&#93;) ST5_ON; else ST5_OFF;<br />if(cnt&gt;=pwm&#91;6&#93;) ST6_ON; else ST6_OFF;<br />if(cnt&gt;=pwm&#91;7&#93;) ST7_ON; else ST7_OFF;<br /><br />cnt++;// zwiększanie licznika o 1<br />}[/syntax]<br /><br />Proszę o pomoc <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=903">Morcinek92</a> — 21 lis 2017, o 15:00</p><hr />
]]></content>
</entry>
</feed>