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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-08-22T21:08:56+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3908&amp;mode</id>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-22T21:08:56+01:00</updated>
<published>2013-08-22T21:08:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46724#p46724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46724#p46724"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46724#p46724"><![CDATA[
<div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />rozwiazanie dziala ale chac przerobic program aby w zadnym miejscu nie bylo 'blokad' i kod wykonywal sie jak najszybciej chyba korzystanie z for jest srednio fajne.<br />Dlatego z wszystkie for chce zastapic if'ami.<br /></div> Całego opisu urządzenia nie podałeś, ale zrób coś takiego:<br />Zwiększaj jakąś zmienną z każdym przejściem pętli głównej programu, a co sekundę (timerek sobie do tego dodaj). Wyświetlaj uzyskaną wartość i zeruj tą zmienną. Może to Ci uzmysłowi ile taki procek ma mocy przerobowych i czy naprawdę potrzebujesz walki o każdy cykl zegara. Zwłaszcza, że jeżeli nie piszesz w Asemblerze to liczenie cykli zegarowych jest bez sensu.<br /><div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />Kolory rozswietlaja sie poprawnie lecz czy da sie to jakos napisac oszczedniej/lepiej np bez wykorzystania kolejnej zmiennej, u mnie 'n' ?<br /></div> Nie znając kontekstu tego kodu, nie jestem w stanie tego ocenić. Jeżeli jednak nie jesteś na styk z zasobami, albo czasem to nie ma sensu dążyć do &quot;idealnej&quot; formy. Jeżeli działa i nie blokuje to nie ruszaj.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=973">barney</a> — 22 sie 2013, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-22T17:27:42+01:00</updated>
<published>2013-08-22T17:27:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46679#p46679</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46679#p46679"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46679#p46679"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />W ten sposób zapewniasz sobie &quot;przyjazne&quot; nazwy timerów/flag (można je wykorzystywać i tak i tak) oraz łatwość dodania następnej: zwiększasz ILE_TIMER_MS o 1 i dopisujesz kolejne makro tworzące przyjazną nazwę (dzięki której od razu wiesz, do czego timer służy).<br /></div><br />Podejscie ciekawe, w sumie robi dokladnie to samo tylko jest przejrzyściej zapisane.<br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />I tutaj dla 255 będzie już warunek spełniony. Zauważ, że ręcznie wychodzę z pętli, bo inaczej licznik by się &quot;przekręcił&quot; na 0 i pętla okazała by się nieskończoną<br /></div><br />rozwiazanie dziala ale chac przerobic program aby w zadnym miejscu nie bylo 'blokad' i kod wykonywal sie jak najszybciej chyba korzystanie z for jest srednio fajne. <br />Dlatego z wszystkie for chce zastapic if'ami. Ponizej kod ktory to robi. W roznym czasie kolejno tylko jedna diode rozjasniam: czerwona, zielona i niebieska. Kolory rozswietlaja sie poprawnie lecz czy da sie to jakos napisac oszczedniej/lepiej np bez wykorzystania kolejnej zmiennej, u mnie 'n' ?<br /><br />[syntax=c]void rgb_rozjasnianie()<br />{<br /><br />if (!Timer2_R)<br />{<br />Timer2_R = 30;  <br />if (n == 1)  // n - zmienna globalna, okresla ktora dioda ma byc rozjasniana<br />{<br />r--;  // zmienna globalna<br />OCR1A = r;<br />}<br />if (r == 0&amp;&amp; n == 1)<br />{<br />n = 2;   // przejdz do rozswietlania diody zielonej<br />OCR1A = 255;  // zgas diode czerwona<br /><br />}<br /><br />}<br />           // postepuje analogiczniej jak wyzej<br />if (!Timer2_G)<br />{<br />Timer2_G = 40;<br />if (n == 2)<br />{<br />                        g--; <br />OCR1B = g;<br />}<br />if (g == 0 &amp;&amp; n == 2)<br />{<br />n = 3;<br />OCR1B = 255;<br /><br />}<br /><br />}<br />if (!Timer2_B)<br />{<br />Timer2_B = 50;<br />if (n == 3)<br />{<br />                        b--;<br />OCR0 = b;<br />}<br />if (b == 0 &amp;&amp; n == 3)<br />{<br />n = 1;<br />OCR0 = 255;<br /><br />}<br /><br />}<br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 22 sie 2013, o 17:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-21T22:03:06+01:00</updated>
<published>2013-08-21T22:03:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46586#p46586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46586#p46586"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46586#p46586"><![CDATA[
Bo zapewne wykonuje się wiele razy, a nie raz. Ja timery obsługuję w taki sposób (dosyć uniwersalny):<br /><br />makra.h<br />[syntax=c]#defineILE_TIMER_MS3<br />#define TIMER_MS_STRZALKAtimer_ms&#91;0&#93;<br />#define TIMER_MS_BUZZtimer_ms&#91;1&#93;<br />#define TIMER_MS_BMPtimer_ms&#91;2&#93;[/syntax]<br />main.c<br />[syntax=c]volatileu16timer_ms&#91;ILE_TIMER_MS&#93;;<br /><br />ISR (TIMER1_COMPA_vect,ISR_NOBLOCK)<br />{<br />for (u08 zmniejsz=0; zmniejsz&lt;ILE_TIMER_MS; zmniejsz++) if (timer_ms&#91;zmniejsz&#93;) timer_ms&#91;zmniejsz&#93;--;<br />}[/syntax]<br /><br />I sprawdzanie pojawienia się jakiejś &quot;flagi&quot;:<br />[syntax=c]if (!TIMER_MS_BUZZ)<br />{<br />TIMER_MS_BUZZ=200;   // ponowne ustawienie timera<br /><br />... // instrukcje do wykonania<br />}[/syntax]<br /><br />W ten sposób zapewniasz sobie &quot;przyjazne&quot; nazwy timerów/flag (można je wykorzystywać i tak i tak) oraz łatwość dodania następnej: zwiększasz ILE_TIMER_MS o 1 i dopisujesz kolejne makro tworzące przyjazną nazwę (dzięki której od razu wiesz, do czego timer służy).<br /><br /><div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />Przerobilem jak pisales i teraz po wpisaniu 255 diody sie nie swieca ale teraz pojawil sie problem z petla for - jak zrobie warunek for (i = 0; i &lt;= 255; i++ to caly czas petla sie zapetla i nie przechodzi dalej a dla kodu ponizej po wyskoczeniu z petli w OCR0 znajduje sie 1 <br /><br />[syntax=c]for (i = 0; i &lt; 255; i++)<br />{<br />OCR0 = i;<br /><br />_delay_ms(50);<br />}<br /><br />_delay_ms(2000);[/syntax]<br /><br />i musze po  tej petli wpisywac do rejestru OCR0 = 255; aby dioda calkowicie zgasla. Czy to jakis bug czy ja zle kojarze jak to powinno dzialac tzn 255 daje nam 11111111 a po kolejnym przeladowaniu wartosc osiaga 0 i for jest konczony ?<br /></div><br />Zauważ, że z samego warunku pętli ( i &lt; 255 ) wynika, że dla tych 255 (0xFF) jest niespełniony. Pętla więc się nie wykona i nie będzie przypisania OCR0 = i;<br />Spróbuj tak:<br />[syntax=c]for (i = 0; i &lt;= 255; i++)<br />{<br />OCR0 = i;<br /><br />_delay_ms(50);<br />if (i==0xFF) break;<br />}<br /><br />_delay_ms(2000);[/syntax]<br />I tutaj dla 255 będzie już warunek spełniony. Zauważ, że ręcznie wychodzę z pętli, bo inaczej licznik by się &quot;przekręcił&quot; na 0 i pętla okazała by się nieskończoną <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=973">barney</a> — 21 sie 2013, o 22:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-21T07:13:22+01:00</updated>
<published>2013-08-21T07:13:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46492#p46492</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46492#p46492"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46492#p46492"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />1. albo podłącz diody LED odwrotnie (katodą i anodą) ... dzięki czemu glitch w trakcie pełnego zapalenia NIGDY nie będzie zauważony przez oko ludzkie<br /></div><br />Tego nie moge zrobic bo plytke z wyprowadzeniami juz mam oraz korzystam z diod rgb ze wspolna anoda wiec zgodnie z tym co pisales w ksiazce podlaczenie rezystorow bedzie bledne.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />2. odwróć fazę za pomocą bitów COMxA i uzyskasz ten sam efekt, chociaż dla pełnego wypełnienia będziesz musiał wpisywać odwrotną wartość - no ale można sobie to nadrzędnym makrem załatwić<br /></div><br />Przerobilem jak pisales i teraz po wpisaniu 255 diody sie nie swieca ale teraz pojawil sie problem z petla for - jak zrobie warunek for (i = 0; i &lt;= 255; i++ to caly czas petla sie zapetla i nie przechodzi dalej a dla kodu ponizej po wyskoczeniu z petli w OCR0 znajduje sie 1 <br /><br />[syntax=c]for (i = 0; i &lt; 255; i++)<br />{<br />OCR0 = i;<br /><br />_delay_ms(50);<br />}<br /><br />_delay_ms(2000);[/syntax]<br /><br />i musze po  tej petli wpisywac do rejestru OCR0 = 255; aby dioda calkowicie zgasla. Czy to jakis bug czy ja zle kojarze jak to powinno dzialac tzn 255 daje nam 11111111 a po kolejnym przeladowaniu wartosc osiaga 0 i for jest konczony ?<br /><br /><br /><br />Dalej mecze sie z timerami sprzetowymi. Dziala metoda pokazana w ksiazce(Timer2_1) ale ja chcialbym zrobic dodatkowo flage przerwania np co 50ms (Timer2_50ms) i w petli glownej sprawdzam <br />if (!Timer2_50ms) nie chce to dzialac poprawnie tylko dlaczego ?<br /><br />[syntax=c]ISR( TIMER2_COMP_vect )<br />// przerwanie co 5 ms - 200 Hz<br />{<br /><br />uint16_t t1 = Timer2_1; /* 5ms Timer1 */<br />if (t1)<br />Timer2_1 = --t1;<br /><br />Timer2_50ms++;<br />if (Timer2_50ms == 10)<br />Timer2_50ms = 0;<br />}[/syntax]<br />Timer2_50ms to zmienna globalna zadeklarowana tak: volatile uint8_t Timer2_50ms;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 21 sie 2013, o 07:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-20T23:22:56+01:00</updated>
<published>2013-08-20T23:22:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46486#p46486</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46486#p46486"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46486#p46486"><![CDATA[
pomyśl sobie - przez te if'y nigdy w efekcie do końca nie wygasisz diod LED.<br /><br />Piszesz że masz Bluebooka - więc masz tam opisane jak sobie prosto można poradzić z tymi glitch'ami ale sprzętowo a nie programowo.<br /><br />1. albo podłącz diody LED odwrotnie (katodą i anodą) ... dzięki czemu glitch w trakcie pełnego zapalenia NIGDY nie będzie zauważony przez oko ludzkie<br /><br />2. odwróć fazę za pomocą bitów COMxA i uzyskasz ten sam efekt, chociaż dla pełnego wypełnienia będziesz musiał wpisywać odwrotną wartość - no ale można sobie to nadrzędnym makrem załatwić<br /><br />a te IF'y są po prostu zupełnym wtedy nieporozumieniem i niepotrzebne jak zobaczysz to w praktyce<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 sie 2013, o 23:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-20T23:02:23+01:00</updated>
<published>2013-08-20T23:02:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46483#p46483</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46483#p46483"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46483#p46483"><![CDATA[
Na forum znalazlem informacje, ze dla amegi przy fast PWM dla ustawienia  pojawiaja sie szpilki i dlatego widac lekkie 'jazenie' diod. <br />Rozwiazaniem ma byc wylczanie timerow. Dla koloru czerwonego i niebieskiego dziala jak powinno ale przy zielonym jest cos nie tak. Czy ponizsze zatrzymywanie timerow jest poprawne ?<br />[syntax=c]if (!OCR1A )  // if (OCR1A == 0)<br />TCCR1A &amp;= (1 &lt;&lt; COM1A1) &amp; ~(1 &lt;&lt; COM1B1) &amp; ~(1 &lt;&lt; WGM10);<br />else<br />TCCR1A |= (1 &lt;&lt; COM1A1) | (1 &lt;&lt; COM1B1) | (1 &lt;&lt; WGM10);<br /><br />if (!OCR1B )<br />TCCR1B &amp;= ~(1 &lt;&lt; WGM12);<br />else<br />TCCR1B |= (1 &lt;&lt; CS10) | (1 &lt;&lt; WGM12);<br /><br />if (!OCR0 )<br />TCCR0 &amp;= ~(1 &lt;&lt; WGM01) &amp; ~(1 &lt;&lt; WGM00);<br />else<br />TCCR0 |= (1 &lt;&lt; WGM01) | (1 &lt;&lt; WGM00);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 20 sie 2013, o 23:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-20T19:23:21+01:00</updated>
<published>2013-08-20T19:23:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46432#p46432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46432#p46432"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46432#p46432"><![CDATA[
Konfiguracja timera wygląda ok. Jako, że pracuje w trybie 8-bitowym to możesz zapisywać wartości do rejestrów OCR1xL (niższych połówek). Użycie wcześniej wyliczonych wartości to dobry pomysł, ale najprawdopodobniej będziesz musiał je dostosować do konfiguracji sprzętowej (u mnie z powodu pojemności układu 0% było już od ~15/256 dla 31kHz). Wrzuć tylko te wartości jako stałe do FLASHa - raczej nie będziesz ich zmieniać, a nie ma sensu marnować RAMu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=973">barney</a> — 20 sie 2013, o 19:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-20T12:56:03+01:00</updated>
<published>2013-08-20T12:56:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46367#p46367</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46367#p46367"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46367#p46367"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Brzmi ok. Ustaw sobie Timer 16-bitowy w trybie 8-bitowym (TOP na 0x00FF) to odpadnie Ci różnica częstotliwości taktowania i różne wartości dla kwadratowego prawa ściemniania<br /></div><br />Timer1 domentacja jest troche zawila wiec prosze o potwierdzenie, czy dobrze go ustawiam aby dzialal tak samo jak Timer0.<br /><br />[syntax=c]TCCR1A = (1&lt;&lt;COM1A1)|(1&lt;&lt;COM1B1)|(1&lt;&lt;WGM10);     //konfiguracja trybu<br />     TCCR1B = (1&lt;&lt;CS10)|(1&lt;&lt;WGM12);     //konfiguracja trybu i prescalera = 1<br /><br />     OCR1A = 200;     //wartość określająca współczynnik wypełnienia dla PD5<br />     OCR1B = 200;     //wartość określająca współczynnik wypełnienia dla PD4[/syntax]<br /><br />Czy to wystarczy aby w glownej petli manewrowac wpisem do  OCR1A oraz  OCR1B w zakresie od 0 do 255 i tym regulowac jasnosc swiecenia diod na tych portach ?<br /><br />Co do prawa sciemniania to znalazlem rozwiazanie z wykorzystaniem stalych wartosci w tablicy a konkretnie<br />[syntax=c]//tabela przechowujaca wartosci OCR1A wyznaczone funkcja x^2  <br />uint8_t pwm_lookup_table&#91;&#93; ={1, 2, 4, 6, 8, 11, 15, 19, 23, 28, 33, 39, 45, 52,  <br />        59, 66, 74, 83, 92, 101, 111, 121, 132, 143, 155,   <br />       167, 180, 193, 207, 221, 235, 250};[/syntax]<br />a w glownej petli programu <br />[syntax=c]OCR1A = pwm_lookup_table&#91;licznik&#93;;[/syntax]<br />i teraz inkrementujac zmienna licznik np za pomoca przerwania od timera co powiedzmy 10 - 100 ms jestem w stanie regulowac jak szybko bedzie zmienial sie dany kolor oraz w 31 ktokach jego jasnosc.<br />Czy idę dobra sciezka czy widzicie jakas lepsza metode na regulacje RGB ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 20 sie 2013, o 12:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-20T09:21:47+01:00</updated>
<published>2013-08-20T09:21:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46349#p46349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46349#p46349"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46349#p46349"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />A ten komentarz to już odebrałem jako personalny atak na mnie.<br /></div><br /><br />Jeśli tak odebrałeś - to przepraszam ciebie uprzejmie (bez żadnej ironii) ... na pewno nie miałem tego na celu ...<br /><br />i nie strzelam focha ...<br /><br />za to można dopytać co ktoś ma na myśli a nie pisać, że źle coś tłumaczę ok? <br /><br />poza tym - to miało znaczyć tylko to - że takie przykłady nic nikomu nie dadzą - że opiszesz sobie co ty tam nie zrobiłeś bo ja też mógłbym tak opisywać i inni - i za chwilę byłaby tu elektroda - wszyscy spece coś robią tylko ci, którzy proszą o pomoc nie wiedzą co i jak.<br /><br />Każdy z nas ma inne podejście do tego jak pomagać - i ja wcale nie mówię, że mam najlepsze - ale gdy ktoś pomaga komuś w temacie to nie dziw się reakcji jak wchodzisz i piszesz:<br /><br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Przerwanie co 1ms (1kHz) to strzał w stopę? Przecież to aż 8k cykli zegarowych (dla wewnętrznego generatora 8Mhz). Przy normalnym, nieblokującym kodzie to przecież jest wieczność...<br /></div><br /><br />co można wprost odebrać tak jakbyś powiedział że ja jakieś głupoty gadam ... <br /><br />na to chciałem ci zwrócić uwagę a nie jakieś personalne ataki tu stosować .... <br /><br />więc jeszcze raz ... jeśli coś źle odebrałeś z mojej wypowiedzi to bardzo przepraszam<br /><br />a dalej poprowadź gomesa - bo może jemu chodzi o coś innego i może to ja nie mam racji<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 27 minutach ]</span></strong><br /><br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Osobiście nie rozumiem tego strachu przed dużą ilością kodu w przerwaniach albo w przerwaniach kaskadowych/zachodzących. Jakiś straszny z tego jest temat tabu (tak sam jak z GOTO). Jeżeli wie się co się robi i jakie są tego konsekwencje (w danym układzie) to nie widzę żadnych przeciwwskazań do stosowania takich konstrukcji...<br /></div><br /><br />widzisz to jest tak - ja wiem, ba! nawet jestem przekonany, że wiesz dużo więcej ode mnie .... (żadnej nie ma w tym ironii) ...<br /><br />ale niestety nie zgodzę się z tobą, że masz dobry sposób na przekazywanie swojej wiedzy .... szczególnie jak chodzi o te zdania cytowane wyżej....<br /><br />zresztą wystarczy przeczytać to co masz w stopce:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Nie pisz komentarzy - dobry kod komentuje się sam.<br /></div><br /><br />I nie obraź się proszę, że ja rozszerzyłbym go jeszcze o takie punkty:<br /><br />- nie używaj symboli bitów w rejestrach tylko zapisuj wartości HEX ?<br />- nie stosuj wcięć w kodzie bo po co ?<br />- używaj goto ile wlezie<br />- zawsze stosu ISR_NOBLOCK<br /><br />-------------------------------------------<br /><br />sorry - ale prezentujesz CAŁKOWICIE odmienne podejście niż to którego ja się sam uczę od innych , od lepszych od siebie i to które staram się przekazywać w książce początkującym.<br /><br />Jeśli więc będziesz starał się na siłę stanąć na przekór tego to nie dziw się, że będę reagował i to stanowczo.<br /><br />Bo już chociażby brak komentarzy w kodzie - nie przeze mnie, ale przez wszystkich jest uważany wręcz za błąd - i to poważny jeśli chodzi o dobry styl programowania. Powiem więcej w niektórych firmach - tacy freelancerzy uparci, którzy robią po swojemu a nie potrafią dostosować się do zespołu tracą pracę .... to nie jest mój wymysł.<br /><br />Reasumując tym bardziej będę się sprzeciwiał takiemu przekazywaniu wiedzy na tym forum i koniec.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 sie 2013, o 09:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-20T08:53:07+01:00</updated>
<published>2013-08-20T08:53:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46347#p46347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46347#p46347"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46347#p46347"><![CDATA[
<div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />Jak optymalnie to wykonac zakladajac, ze skorzystam z 3 x sprzetowy pwm ?<br />Potrzebuje 3 wyjsc a w uc mam OC0 I OC2 8 bitowe oraz OC1A i OC1B 16 bitowe. Potrzebuje 3 wyjsc oraz jednego timera do zastapienia delayow wiec moze OC0 oraz OC1A i OC1B jako wyjscia dla rgb a OC2 jako precyzyjny odmierzacz czasu ?<br /></div> Brzmi ok. Ustaw sobie Timer 16-bitowy w trybie 8-bitowym (TOP na 0x00FF) to odpadnie Ci różnica częstotliwości taktowania i różne wartości dla kwadratowego prawa ściemniania <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br /><div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />Dodatkowo przy kodzie jak ponizej nawet na sztywno ustawione OCR0 = 0; i pozniej _delay_ms(1000); nie wygaszaja diody do konca ( gdzies w innym watku czytalem, ze potrzebny jest na to pewien czas a tutaj daje az 1 sek i dalej widac, ze lekko swieci).<br /></div>Tryb Fast PWM ma to do siebie, że nie idzie ustawić 0% oraz 100% (albo jedną z tych wartości idzie, a drugiej nie, doczytaj w PDFie). Najwięcej co uzyskasz to 1/rozdzielczość jako 0% i rozdzielczość-1/rozdzielczość jako 100%. Jeżeli chcesz mieć prawdziwe 0% i 100% to zobacz tryb Phase Correct. Możesz też w sytuacjach granicznych wyłączać Timer i ustawiać 0/1 jak zwykły pin I/O <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />@mirekk36: Gomes miał gotowy obwód oraz problem z uruchomieniem PWM dla diod. Ty nie przedstawiłeś żadnego rozwiązania problemu nie wymagającego znaczącej ingerencji w obwód, a ja pokazałem, że się da, ale łatwo nie będzie, a i procek będzie musiał działać na ile pójdzie.<br />A 20MHz dla AVR jest jak najbardziej OK częstotliwością, jeżeli nie robimy jakiegoś układu profesjonalnie/do ludzi.<br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Kłopot w tym, że w ogóle nie wiesz o co chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... tzn nie zrozum mnie mnie źle - nie wiesz o co mi chodzi i o czym mówię<br /><br />a na pewno nie chodzi o przerwanie co 1ms ....<br /></div> No może i nie wiem... ale powiedz mi jak mam interpretować to zdanie:<br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Zapomnij w C o ustawianiu <strong>rozdzielczości</strong> czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp<br /></div><br />dla mnie rozdzielczość to najmniejsza jednostka jaką można zmienić/uzyskać w danej sytuacji.<br />Jeżeli ktoś mi powie, że AVR ma ADCka o rozdzielczości 10 bitów to zrozumiem, że wartość napięcia jest przedstawiania za pomocą 10 wartości, z których każda z nich mogłaby funkcjonować samodzielnie i nie możliwe jest podzielenie każdej z osobna na mniejszą jednostkę w danej aplikacji (czyli po prostu bitów - 0/1). No ale jak już powiedziałem, nie do końca byłem pewien czy o to Ci chodzi - jeżeli nie to wyjaśnij, bo nie wiem co o tym sądzić. Nie rozumiem po co od razu &quot;strzelać focha&quot; i rezygnować z udzielania się w temacie. <br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />więc cały twój wywód odnośnie moich wypowiedzi wyżej .... szkoda mówić - no ale ok .... spróbuj dalej poprowadzić kolegę gomes'a<br /></div> Zwłaszcza, że to gomes ucierpi, a nie ja, bo to gomes będzie miał przedstawioną mniejszą ilość opcji/pomysłów...<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent">Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...<br /></div><br />Wiesz jak ja bym tak zaczął opowiadać co ja mam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... ooo boże <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to byśmy się pewnie ścigali kto bardziej do pieca dowala, wpadłby jeszcze ktoś inny i zacząłby opowiadać, że to nic co my we dwóch robimy, że on to dopiero dowala do pieca .... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div> A ten komentarz to już odebrałem jako personalny atak na mnie. Nie wolno podzielić się doświadczeniami z użyciem częstych przerwań z dużą ilością kodu? Osobiście nie rozumiem tego strachu przed dużą ilością kodu w przerwaniach albo w przerwaniach kaskadowych/zachodzących. Jakiś straszny z tego jest temat tabu (tak sam jak z GOTO). Jeżeli wie się co się robi i jakie są tego konsekwencje (w danym układzie) to nie widzę żadnych przeciwwskazań do stosowania takich konstrukcji...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=973">barney</a> — 20 sie 2013, o 08:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-20T07:55:43+01:00</updated>
<published>2013-08-20T07:55:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46343#p46343</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46343#p46343"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46343#p46343"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Dodatkowo zejdź z rozdzielczością do 64 kroków - uzyskasz przerwanie co 512 cykli (PWM zajmie z ~20% czasu procesora), albo do 128 kroków (40%). Jeszcze lepiej jak pogonisz na 20MHz (20% szybciej to od razu lepiej).<br /></div><br />Nie bylem wczesniej swiadomy tego zamulenia i nie jestem przekonany, czy docelowy uklad moze sobie na to pozwolic. <br /><br />Dlatego ewentualnie na plytce moge wykonac druciarstwo i dolutowac dwa przewody.<br /><br />Mirku, nawet jak korzystam ze sprzetowego pwm to i tak potrzebuje jakiegos dodatowego timera do zastapienia tych delay_ms <br /><br />[syntax=c]for (i = 0; i &lt; 255; i++)<br />                {<br />                        OCR0 = i; // ta dioda będzie ulegała rozjasnianiu w tej pętli<br />                        _delay_ms(10);<br /> <br />                        if (i &gt; 50)<br />                                _delay_ms(3);<br />                        else<br />                                _delay_ms(10);<br /> <br />                }[/syntax]<br /><br />Dodatkowo przy kodzie jak ponizej nawet na sztywno ustawione OCR0 = 0; i pozniej _delay_ms(1000); nie wygaszaja diody do konca ( gdzies w innym watku czytalem, ze potrzebny jest na to pewien czas a tutaj daje az 1 sek i dalej widac, ze lekko swieci).<br /><br />[syntax=c]//<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />int main(void)<br />{<br />//***** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) *******<br />// ustawienie końcówki OC0 (PB3) sprzętowy PWM jako WYJŚCIE<br />DDRB |= (1 &lt;&lt; PB3);<br />// ustawienia TIMER0 w Fast PWM<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 = 127; // wygaszenie diody w kanale PWM<br /><br />DDRB |= (1 &lt;&lt; PB0);<br />PORTB |= (1 &lt;&lt; PB0);<br /><br />sei();<br />// odblokowanie globalne przerwań<br />uint8_t i; // definicja zmiennej i na potrzeby pętli for()<br /><br /><br />while (1)<br />{<br /><br />for (i = 0; i &lt; 255; i++)<br />{<br />OCR0 = i; // ta dioda będzie ulegała rozjasnianiu w tej pętli<br />_delay_ms(10);<br /><br />if (i &gt; 50)<br />_delay_ms(3);<br />else<br />_delay_ms(10);<br /><br />}<br /><br />_delay_ms(500);<br /><br />// pętla stopniowo ściemniająca 6 diod LED<br />for (i = 255; i; i--)<br />{<br />_delay_ms(10);<br />OCR0 = i; // ta dioda będzie ulegała sciemnianiu w tej pętli<br /><br /><br />if (i &gt; 50)<br />_delay_ms(3);<br />else<br />_delay_ms(10);<br /><br />}<br /><br />OCR0 = 0; <br />_delay_ms(1000);<br /><br />}<br />}[/syntax]<br /><br />Jak optymalnie to wykonac zakladajac, ze skorzystam z 3 x sprzetowy pwm ?<br />Potrzebuje 3 wyjsc oraz jednego timera do zastapienia delayow wiec moze OC0 oraz OC1A i OC1B jako wyjscia dla rgb a OC2 jako precyzyjny odmierzacz czasu ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 20 sie 2013, o 07:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-20T06:04:38+01:00</updated>
<published>2013-08-20T06:04:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46338#p46338</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46338#p46338"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46338#p46338"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Przerwanie co 1ms (1kHz) to strzał w stopę?<br /></div><br /><br />Kłopot w tym, że w ogóle nie wiesz o co chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... tzn nie zrozum mnie mnie źle - nie wiesz o co mi chodzi i o czym mówię<br /><br />a na pewno nie chodzi o przerwanie co 1ms ....<br /><br />więc cały twój wywód odnośnie moich wypowiedzi wyżej .... szkoda mówić - no ale ok .... spróbuj dalej poprowadzić kolegę gomes'a<br /><br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Wszystkie pozostałe przerwania muszą mieć atrybut ISR_NOBLOCK, np:<br /></div><br /><br />No a ta porada dla początkującego to już jest masakra <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> przykro mi ..... <br /><br />Jak dobrze spojrzeć na to co piszesz - to wg ciebie aby rozwiązać jakikolwiek błahy problem to najlepiej: wziąć kwarc 20MHz albo i więcej jak jeszcze źle działa, wszystkie przerwania typu ISR_NOBLOCK - czyli dowalić do pieca. Fajnie fajnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> oby tak dalej.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br /><div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...<br /></div><br /><br />Wiesz jak ja bym tak zaczął opowiadać co ja mam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... ooo boże <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to byśmy się pewnie ścigali kto bardziej do pieca dowala, wpadłby jeszcze ktoś inny i zacząłby opowiadać, że to nic co my we dwóch robimy, że on to dopiero dowala do pieca .... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Tylko początkujący popatrzyłby na te gadki i sobie poszedł .... tak w skrócie mówiąc<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 sie 2013, o 06:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-20T00:26:42+01:00</updated>
<published>2013-08-20T00:26:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46336#p46336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46336#p46336"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46336#p46336"><![CDATA[
8ns to nie jest jeszcze tak źle. Jak pogonisz procka na co najmniej 16MHz to będziesz miał przerwanie co 8*16=128 cykli - bardzo na styk, zamulisz cały procesor. Dodatkowo zejdź z rozdzielczością do 64 kroków - uzyskasz przerwanie co 512 cykli (PWM zajmie z ~20% czasu procesora), albo do 128 kroków (40%). Jeszcze lepiej jak pogonisz na 20MHz (20% szybciej to od razu lepiej).<br /><br />Według mnie optymalnym rozwiązaniem będzie procek na 20MHz, ISR co 200 cykli (50-70%), 64 kroki.<br />Fisr=Fcpu/200=20 000 000 / 200 = 100 000 Hz<br />Fpwm=Fisr/S= 100 000 Hz / 64 = 1562,5 Hz (jeszcze nie taka tragedia)<br />Praktyczne jasności PWMa strzelisz sobie na 64-16-4-1-0 (dla oczu 100-50-25-~10-0%).<br /><br />Wszystkie pozostałe przerwania muszą mieć atrybut ISR_NOBLOCK, np:<br />ISR (TIMER1_COMPA_vect,ISR_NOBLOCK) {}<br />aby wykonywanie innych przerwań nie zatrzymywało wykonywania regulacji PWM (nie było szarpań/przebłysków). &quot;Dowali&quot; to oczywiście to pieca i wymusi kolejne 10-20B na stos, no ale jak już masz board to cóż zrobić...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=973">barney</a> — 20 sie 2013, o 00:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-20T00:14:04+01:00</updated>
<published>2013-08-20T00:14:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46335#p46335</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46335#p46335"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46335#p46335"><![CDATA[
<div class="quotetitle">barney napisał(a):</div><div class="quotecontent"><br />Jeżeli chcemy płynnie regulować jasność diody to 500Hz to jest absolutne minimum dla oświetlenia stacjonarnego<br /></div><br />czyli 1 / 500 daje nam 2 ms. Z dalszego wywodu rozumiem, ze ta wartosc jeszcze trzeba podzielic przez 256 krokow co daje nam 8ns. <br />Upierajac sie przy wykonaniu tego na programowym pwm jestem w stanie to osiagnac ? Mam juz gotowa plytke i wyprowadzenia z tranzystorami na diode nie sa przypisane do portow timerow sprzetowych dlatego chcialbym to zrealizowac jak jak wyzej. <br />Przy projektowaniu plytki bralem pod uwage kod z niebieskiej ksiazki (05_PWM) gdzie korzystajac z delay_ms moglem pod dowolny pord uc podlaczyc diody i wszystko smigalo tak, jak powinno bez korzystania ze sprzetowych timerow.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 20 sie 2013, o 00:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[barney]]></name></author>
<updated>2013-08-19T23:47:31+01:00</updated>
<published>2013-08-19T23:47:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46334#p46334</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46334#p46334"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46334#p46334"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Zapomnij w C o ustawianiu rozdzielczości czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp<br /></div><br />Przerwanie co 1ms (1kHz) to strzał w stopę? Przecież to aż 8k cykli zegarowych (dla wewnętrznego generatora 8Mhz). Przy normalnym, nieblokującym kodzie to przecież jest wieczność...<br /><br />Sam w stacji pogodowej poganiam procek na 20Mhz i mam przerwania co 250ns (4kHz / 5k cykli). W przerwaniu mam jednocześnie multipleksowanie klawiatury matrycowej + multipleksowanie wyświetlacza IW18 + obsługę timerów programowych. Nic się nie blokuje, wszystko się wyrabia, żadnych hard-codowych cudów robić nie musiałem...<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />po co ci rozdzielczość 1ms dla diody - co ty chcesz nią migać co 1ms ??? zobaczysz to ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div> <br />Jeżeli chcemy płynnie regulować jasność diody to 500Hz to jest absolutne minimum dla oświetlenia stacjonarnego (żeby oczy i nerwy nie wysiadły). Jest to jednak bardzo niska częstotliwość i np. wentylator będzie nam pięknie migotał/przerywał przed oczami. Przy oświetleniu rowerowym ~3kHz to jest granica dla lubiących swoje zęby...<br /><br /><div class="quotetitle">gomes napisał(a):</div><div class="quotecontent"><br />jak mam to zrealizowac aby nie bylo migotania?<br /></div><br />Jeżeli jasność oświetlenia chcemy regulować za pomocą PWM to podstawą jest wysoka częstotliwość, potrzebna do &quot;oszukania&quot; oczu. Drugą ważną sprawą jest rozdzielczość, która definiuje ile różnych poziomów jasności możemy uzyskać. Zauważ, że sprzętowy PWM na timerze 8bit oferuje 256 różnych poziomów jasności dzieląc częstotliwość taktowania przez 256*prescaler. Gdyby był 6 bitowy to miałbyś tylko 64 poziomy jasności, ale częstotliwość byłaby już 256/64=4 razy większa.<br /><br />A tak w skrócie to częstotliwość przerwań (Fisr) to iloczyn częstotliwość PWM (Fpwm) oraz ilości stopni  jasności (S).<br />Fisr = Fpwm*S<br />Powinieneś dążyć do jak najwyższego Fpwm, aby światło tak modulowane jak najmniej męczyło oczy. Możesz to uzyskać ustawiając większą częstotliwość przerwań (Fisr) oraz zmniejszając ilość dostępnych poziomów jasności (s). W praktyce musisz ustawić częstotliwość przerwań (Fisr) do oporu oraz wybrać ilość stopni zapewniających wystarczającą ilość poziomów jasności (oczywiście należy tutaj dostosować kwadratowe prawo ściemniania do PWMa, który jest liniowym sposobem regulacji).<br />Najprościej będzie po prostu znaleźć potrzebne sprzętowe PWM, albo wyrzucić to na zewnętrzny osprzęt (jak będzie trzeba to nawet małe przystawki w postaci T13/T25).<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 18 minutach ]</span></strong><br /><br />Tak patrzę i jeden T25 (albo T45/T85 - jedna cholera, jedynie więcej FLASHa, RAMu i EEPROMu) + soft TWI to będzie to czego potrzebujesz <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=973">barney</a> — 19 sie 2013, o 23:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-19T23:34:53+01:00</updated>
<published>2013-08-19T23:34:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46332#p46332</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46332#p46332"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46332#p46332"><![CDATA[
Hm,<br />teraz to juz naprawde nic nie rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Ja chce przy uzyciu jednego timera sprzetowego (tutaj timer2) sterowac jasnoscia oraz dlugoscia swiecenia diody RGB. <br />Na stronie 229 opisujesz jak mozna nawet przy 9 bitowym programowym PWM oszukac wzrok(o ile o tym cwiczeniu pisales) i regulowac jasnoscia diody wiec sadzilem, ze mozna zrobic trzy takie programowe timery i tym regulowac dioda RGB na dowolnym porcie mikrokontrolera.  Z ostatniego postu by wynikalo, ze do tego naduje sie tylko timer sprzetowy czyli wykorzystanie portow z oznaczeniami OC0, OC1A i OC1B lub OC2  ? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 19 sie 2013, o 23:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-19T23:08:43+01:00</updated>
<published>2013-08-19T23:08:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46330#p46330</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46330#p46330"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46330#p46330"><![CDATA[
ale o jakim ty migotaniu piszesz ? ... coś czuję że pokręciło ci się wszystko dokumentnie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />posłuchaj ty pewnie chcesz go użyć do jakiegoś rodzaju PWM'a ???? dobrze myślę ? jeśli tak to jakieś KOSZMARNE nieporozumienie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />timery programowe nie są do ŻADNYCH PWM'ów - zapomnij <br /><br />one są do ot jakichś tam wolnozmiennych procesów - np właśnie (przykład) jedna dioda miga sobie co 50ms a druga co 180ms. A obydwie migają w tym samym czasie w programie i nie używamy ŻADNYCH delajów<br /><br />i dlatego jeszcze raz ci powtarzam że jak timer programowy to MINMILANA rozdzielczość czasowa to 10ms ale lepiej 20ms albo i więcej<br /><br />a ty widzę próbujesz schodzić w dół bo ci się zachciało na nim PWM'a zrobić co ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />PWM'a programowego zostawiasz sobie na timerze sprzętowym. A timery programowe działają sobie oddzielnie swoim własnym i mniej dokładnym życiem.<br /><br />No ale tak to jest - jak ktoś nie chce zrobić i zobaczyć ćwiczenia z książki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... jeszcze raz mówię - zrób to ćwiczenie - zobacz jak działa i o co w tym chodzi i że to nie ma nic wspólnego z żadnymi PWM'ami .... timery programowe do CAŁKIEM innych celów służą, ok? <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=54">mirekk36</a> — 19 sie 2013, o 23:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-19T22:48:41+01:00</updated>
<published>2013-08-19T22:48:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46327#p46327</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46327#p46327"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46327#p46327"><![CDATA[
Czegos w tym miganiu diodami jednak nie rozumiem.<br />Przy wykorzystaniu kodu przedstawionego poprzednio dla kodu<br /><br />[syntax=c]if (!Timer3)<br /> {<br /> Timer3=4 ;<br /><br /> PORTB ^=  (1 &lt;&lt; PB3);<br /> }[/syntax]<br />Cos mi sie nie zgadza: <br />przerwanie mam co 4 ms (dziala poprawnie jak pisalem wczesniej) wiec przy ustawieniu Timer3=4  port zmienia swoja wartosc co 16 ms a ja dalej widze migotanie diody (wczesniej zakladalem, ze bedzie to 24 ms). Dopiero przy ustawieniu  Timer3=3 migotania nie widze ( 3 * 4 = 12 ms). <br />Jak ustawie timer jak sugerujesz na 50 czy 100 ms to jak mam to zrealizowac aby nie bylo migotania?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 19 sie 2013, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-19T22:26:32+01:00</updated>
<published>2013-08-19T22:26:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46325#p46325</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46325#p46325"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46325#p46325"><![CDATA[
Zapomnij w C o ustawianiu rozdzielczości czasowej timera programowego na 1ms - bo to tak jakbyś sam strzelił sobie w kolano i dziwił się dlaczego cię ono boli. W książce dosyć wyraźnie piszę o tym itp<br /><br />A tym bardziej, że ty w tym samym czasie kręcisz programowym PWM'em który zjada mnóstwo czasu procka <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />po co ci rozdzielczość 1ms dla diody - co ty chcesz nią migać co 1ms ??? zobaczysz to ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ustaw sobie rozdzielczość przy twoim projekcie na 50ms a nawet i na 100ms<br /><br />i wtedy się baw ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 19 sie 2013, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-19T22:03:41+01:00</updated>
<published>2013-08-19T22:03:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46322#p46322</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46322#p46322"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46322#p46322"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />gomes zajrzyj wiec prosze do rozdzialu <br /><br />Wstep do systemow czasu rzeczywistego <br /><br />i podejrzyj w kodzie jak jest realizowane tylko miganie dioda LED ok? to duzo ci sie wyjasnj bo chyba ci to umknelo i caly czas na delajach jedziesz<br /></div><br /><br />Mirku, ponownie przeczytalem ten rozdzial i dalej nie moge poradzic sobie z tym swieceniem diody. <br />Zastosowalem sie do rad jaki sa opisane na forum i przestawilem timer na przerwania co 4 ms poniewaz przy 1 ms przy testach z sama dioda procesor nie wyrabial i pojawialy sie losowe swiecenie dioda. Tak jak zostalo to pokazane w ksiazce przedstawia przyklad ponizej - przy odkomentowaniu tego dioda tak jak powinna co sek gasnie po czym zaczyna swiecic wiec timer ustawiony jak zalozylem.<br /><br />[syntax=c]if (!Timer3)<br /> {<br /> Timer3=250 ;<br /><br /> PORTB ^=  (1 &lt;&lt; PB3);[/syntax]<br /><br />Lecac dalej reszta kodu nie dziala juz jak powinna. Jak obliczyc zalezności czasowe aby mozna bylo plynnie regulowac jasnosc swiecenia diody majac w przerwaniu np. flage 4 ms i jego wilelokrotnosc?<br /><br />ponizej caly kod bez ani jednego deleya lecz obecnie dioda zapala sie na ~ 3 sek po czym gasnie na 1 sek zamiast plynnie sie rozjasniac<br />[syntax=c]//<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />volatile uint8_t pwm1, pwm2, pwm3;<br />volatile uint8_t cnt, i, zmienna;<br />volatile uint8_t Timer1, Timer2, Timer3; /* timer programowy 100Hz */<br />// główna funkcja programu main()<br />int main(void)<br />{<br /><br />DDRB |= (1 &lt;&lt; PB1) | (1 &lt;&lt; PB2) | (1 &lt;&lt; PB3);<br />PORTB |= (1 &lt;&lt; PB1) | (1 &lt;&lt; PB2) | (1 &lt;&lt; PB3);<br /><br />TCCR2 |= (1 &lt;&lt; WGM21); // tryb  CTC<br />TCCR2 |= (1 &lt;&lt; CS20) | (1 &lt;&lt; CS22); // preskaler = 128<br />OCR2 = 249; // dodatkowy podział częsttotliwości przez 249<br />TIMSK |= (1 &lt;&lt; OCIE2); // zezwolenie na przerwanie CompareMatch<br /><br />sei();<br /><br />uint8_t i; // definicja zmiennej i na potrzeby pętli for()<br />pwm1 = 255;<br />pwm2 = 255;<br />pwm3 = 255;<br />PORTB &amp;= ~(1 &lt;&lt; PB1);<br />PORTB &amp;= ~(1 &lt;&lt; PB2);<br />PORTB &amp;= ~(1 &lt;&lt; PB3);<br />i = 0;<br /><br />Timer2 = 2;<br />while (1)<br />{<br />/*<br /> if (!Timer3)<br /> {<br /> Timer3=250 ;<br /><br /> PORTB ^=  (1 &lt;&lt; PB3);<br /> }<br /> */<br /><br />if (!Timer2)<br />{<br />i++;<br /><br />pwm1 = i;<br /><br />if (i &gt; 50)<br />//_delay_ms(3);<br />Timer2 = 2;<br />else<br />//_delay_ms(10);<br />Timer2 = 4;<br />}<br /><br />}<br />}<br /><br />ISR( TIMER2_COMP_vect )<br />//przerwanie co 4 ms<br />{<br /><br />uint8_t n, m, s;<br /><br />n = Timer1;<br />if (n)<br />Timer1 = --n;<br /><br />m = Timer2;<br />if (m)<br />Timer2 = --m;<br /><br />s = Timer3;<br />if (s)<br />Timer3 = --s;<br /><br />if (!Timer1)<br />{<br />Timer1 = 6;<br />cnt++;<br /><br /><br />if (cnt &gt; pwm1)<br />PORTB |= (1 &lt;&lt; PB1);<br />else<br />PORTB &amp;= ~(1 &lt;&lt; PB1);<br /><br />}<br />}[/syntax]<br /><br />Poprawcie mnie prosze, jezeli zle rozumiem jak powinno obliczyc sie swiecenie diody. Aby nie bylo widac 'migotania' dioda powinna migac conajmniej 24 razy na sek. Jezeli mamy przerwanie co 4 ms to 24/4 = 6 wiec timer1 powinien byc inicjalizowany ta wartoscia. Teraz wartosc cnt odpowiada za wypelnienie czyli jak mocno bedzie swiecila nasza dioda. Im pwm1 bedzie mialo wieksza wartosc tym dioda bedzie swiecila slabiej. Pomimo tego calosc nie chce dzialac jak powinna i nie mozna plynnie regulowac czasem swiecenia i jasnoscia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 19 sie 2013, o 22:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-19T09:03:08+01:00</updated>
<published>2013-08-19T09:03:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46273#p46273</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46273#p46273"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46273#p46273"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Rzuć okiem na mój temat termopara na atmedze8, tam masz przykład kodu z wykorzystaniem timerów softwerowych.<br />Delay, to używamy tylko i wyłącznie na początku przed pętlą główną programu, by np. czekać na &quot;ustabilizowanie&quot; napięć, inicjację sprzętową itd.<br /></div><br />Kolego, ja to doskonale rozumiem i datego chce wszystkie mozliwe delaye zlikwidowac w glownej petli programu (pokazuje to zamieszczony przezemnie 1 kod gdzie zmiast for dekrementuje zmienna).<br /><br /><div class="quotetitle">MichalXY napisał(a):</div><div class="quotecontent"><br />Słuchaj mnie się wydaje że ty chcesz timer programowy zrobić na timerze 2 który pracuje u ciebie jako programowy PWM. <br />Na twoim miejscu do timera programowego wykorzystał Timer0. W przykładzie z 1-wire masz przykład timera programowego właśnie wykonanego na timer0.<br /></div><br />Co za roznica czy korzystam z 8 bitowego timera 0 czy 2 ?(timer 0 w docelowym ukladzie wlansie bedzie wykorzystywany do odczytu temperatury).<br />Co do kodu to wydaje mi sie, ze dokladnie tak samo kombinuje i przedstawiam w zamieszczonym drugim kodzie. W nim jedynie co zmieniam to przestawienie timera na przerwanie co 1 ms i w obsludze tego przerwania sprawdzam czy minelo juz 25 jego tykniec i wtedy realizuje kod ktory wczesniej ladnie sciemnial diody a to sie rozjechalo. Tylko pytanie dlaczego ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 19 sie 2013, o 09:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-19T09:00:04+01:00</updated>
<published>2013-08-19T09:00:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46272#p46272</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46272#p46272"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46272#p46272"><![CDATA[
gomes zajrzyj wiec prosze do rozdzialu <br /><br />Wstep do systemow czasu rzeczywistego <br /><br />i podejrzyj w kodzie jak jest realizowane tylko miganie dioda LED ok? to duzo ci sie wyjasnj bo chyba ci to umknelo i caly czas na delajach jedziesz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 19 sie 2013, o 09:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MichalXY]]></name></author>
<updated>2013-08-19T08:52:39+01:00</updated>
<published>2013-08-19T08:52:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46270#p46270</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46270#p46270"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46270#p46270"><![CDATA[
Słuchaj mnie się wydaje że ty chcesz timer programowy zrobić na timerze 2 który pracuje u ciebie jako programowy PWM. <br />Na twoim miejscu do timera programowego wykorzystał Timer0. W przykładzie z 1-wire masz przykład timera programowego właśnie wykonanego na timer0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=226">MichalXY</a> — 19 sie 2013, o 08:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-08-19T08:48:47+01:00</updated>
<published>2013-08-19T08:48:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46269#p46269</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46269#p46269"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46269#p46269"><![CDATA[
Rzuć okiem na mój temat termopara na atmedze8, tam masz przykład kodu z wykorzystaniem timerów softwerowych.<br />Delay, to używamy tylko i wyłącznie na początku przed pętlą główną programu, by np. czekać na &quot;ustabilizowanie&quot; napięć, inicjację sprzętową itd.<p>Statystyki: Napisane przez Gość — 19 sie 2013, o 08:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gomes]]></name></author>
<updated>2013-08-19T08:53:15+01:00</updated>
<published>2013-08-19T08:39:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46268#p46268</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46268#p46268"/>
<title type="html"><![CDATA[Re: Jak pozbyć się delay_ms ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3908&amp;p=46268#p46268"><![CDATA[
Dzieki za szybkie odopowiedzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Co do niebieskiej ksiazki oczywiscie posiadam i ciagle z niej korzystam. Wszystkie do tej pory omawiane dzialy w moim odczuciu sa bardzo dobrze opisane i mam nadzieje dobrze zrozumialem lecz caly czas mam problem z tymi timerami programowymi. Co do sprzetowych to wszystko jasne lecz nie moge ich uzyc bo program docelowy caly czas ewouluje i piny od tych timerow sa juz zajete. <br /><br />Co do rozwiazania na timerze 8 bitowym to przerobilem kod Mirka jak ponizej<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />volatile uint8_t pwm1, pwm2, pwm3;<br /><br />// główna funkcja programu main()<br />int main(void)<br />{<br /><br />DDRB |= (1 &lt;&lt; PB1) | (1 &lt;&lt; PB2) | (1 &lt;&lt; PB3);<br />PORTB |= (1 &lt;&lt; PB1) | (1 &lt;&lt; PB2) | (1 &lt;&lt; PB3);<br /><br />// ustawienia 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ł częsttotliwości przez 200<br /> TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br /> */<br />TCCR2 |= (1 &lt;&lt; WGM21); // tryb  CTC<br />TCCR2 |= (1 &lt;&lt; CS22); // preskaler = 64<br />OCR2 = 124; // dodatkowy podział częsttotliwości przez 124<br />TIMSK |= (1 &lt;&lt; OCIE2); // zezwolenie na przerwanie CompareMatch<br /><br />sei();<br /><br />uint8_t i; // definicja zmiennej i na potrzeby pętli for()<br />pwm1 = 255;<br />pwm2 = 255;<br />pwm3 = 255;<br /><br />while (1)<br />{<br /><br />for (i = 0; i &lt; 255; i++)<br />{<br /><br />_delay_ms(10);<br /><br />pwm1 = i;<br /><br />if (i &gt; 50)<br />_delay_ms(3);<br />else<br />_delay_ms(10);<br /><br />}<br />_delay_ms(500);<br />for (i = 0; i &lt; 255; i++)<br />{<br /><br />_delay_ms(10);<br /><br />pwm2 = i;<br /><br />if (i &gt; 50)<br />_delay_ms(3);<br />else<br />_delay_ms(10);<br /><br />}<br /><br />_delay_ms(500);<br />for (i = 0; i &lt; 255; i++)<br />{<br /><br />_delay_ms(10);<br /><br />pwm3 = i;<br /><br />if (i &gt; 50)<br />_delay_ms(3);<br />else<br />_delay_ms(10);<br /><br />}<br />_delay_ms(500);<br /><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, cnt1; // definicja naszego licznika PWM<br /><br />if (cnt1 == 25)<br />{<br />cnt++ ;<br />cnt1 = 0;<br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if (cnt &gt;= pwm1)<br />PORTB |= (1 &lt;&lt; PB1);<br />else<br />PORTB &amp;= ~(1 &lt;&lt; PB1);<br />if (cnt &gt;= pwm2)<br />PORTB |= (1 &lt;&lt; PB2);<br />else<br />PORTB &amp;= ~(1 &lt;&lt; PB2);<br />if (cnt &gt;= pwm3)<br />PORTB |= (1 &lt;&lt; PB3);<br />else<br />PORTB &amp;= ~(1 &lt;&lt; PB3);<br />}<br />cnt1++; // zwiększanie licznika o 1<br />}[/syntax]<br /><br />W tym przykladzie przestawilem timer na przerwanie co 1 sek ( jak dobrze zrozumialem to 8000000 / 64 /124 daje nam 1008 czyli ~ 1 ms). Calosc kodu wczesniej pracowala na przerwaniu co 25 ms dlatego w if sprawdzam, czy timer do tylu zliczyl i wtedy zeruje cnt1 oraz realizuje kod ktory wczesniej dzialal poprawnie na tych 25 ms. <br />Efektem tej zmiany jest zapalanie sie kolejno kolorow ale bardziej na zasadzie wlacz/wylacz niz sciemnianie przez pewien czas kolejnych kolorow. <br />Mikrokontroler nie wyrabia przy tych paru operacjach w przerwaniu (wiem, ze powinno ich tam byc mniej) czy co innego robie zle ?  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=779">gomes</a> — 19 sie 2013, o 08:39</p><hr />
]]></content>
</entry>
</feed>