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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-29T19:33:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=14342&amp;mode</id>
<entry>
<author><name><![CDATA[Karbos]]></name></author>
<updated>2016-02-25T19:10:34+01:00</updated>
<published>2016-02-25T19:10:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154716#p154716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154716#p154716"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154716#p154716"><![CDATA[
Dzięki za pomoc, faktycznie problem był związany ze zmienną licznik  <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=12083">Karbos</a> — 25 lut 2016, o 19:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-02-25T01:05:08+01:00</updated>
<published>2016-02-25T01:05:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154632#p154632</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154632#p154632"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154632#p154632"><![CDATA[
W jednym i drugim przerwaniu używasz tej samej zmiennej licznik. A przez to warunek w przerwaniu TIMER0_COMPB nigdy się nie wykona. Dioda LED_1 powinna migać a dioda LED_2 - nie.<br /><br />Jeśli zmienna licznik będzie miała wartość równą 29 to warunki w obydwóch  przerwaniach się nie wykonają. Przy następnym przerwaniu COMPA zmienna licznik zostanie zwiększona o jeden. Warunek się wykona. Stan diody zostanie zmieniony na przeciwny i zmienna zostanie wyzerowana. I tym sposobem warunek w przerwaniu COMPB znów się nie wykona bo przecież zmienna licznik ma wartość zero.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 25 lut 2016, o 01:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Karbos]]></name></author>
<updated>2016-02-25T00:32:20+01:00</updated>
<published>2016-02-25T00:32:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154629#p154629</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154629#p154629"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=154629#p154629"><![CDATA[
Dziękuję za ten artykuł, ponieważ wiele mi wyjaśnił, jednak w celu utrwalenia informacji chciałem powyższy kod trochę zmodyfikować. Założenia były takie, aby dwie diody mrugały co jedną sekundę:<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 />//definicje dla preprocesora<br />#define LED_1 (1&lt;&lt;PC1)<br />#define LED_2 (1&lt;&lt;PC2)<br /><br />//zmienne globalne<br />uint8_t licznik;<br /><br />//główna funcja main<br />int main( void ){<br />//deklaracje portów<br />DDRC |= LED_1 | LED_2;<br /><br />//konfiguracja timera<br />//#####################################<br />TCCR0A |= (1&lt;&lt;WGM01);<br />TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />OCR0A = 255;<br />OCR0B = 128;<br />TIMSK0 |= (1&lt;&lt;OCIE0A) | (1&lt;&lt;OCIE0B);<br />//#####################################<br /><br />//zezwolenie na przerwania globalne<br />sei();<br /><br />//nieskończona pętla while<br />while (1){<br />}<br />}<br /><br />ISR (TIMER0_COMPA_vect) {<br />licznik++;<br />if (licznik &gt;= 30) {<br />PORTC ^= LED_1;<br />licznik = 0;<br />}<br />}<br /><br />ISR (TIMER0_COMPB_vect) {<br />if (licznik &gt;= 30) {<br />PORTC ^= LED_2;<br />licznik = 0;<br />}<br />}[/syntax]<br /><br />Tutaj pojawia się zapewne mój błahy błąd. Otóż pierwsza dioda świeci cały czas, natomiast druga zgodnie z oczekiwaniami.  Czy ktoś jest wstanie nakierować mnie na tenże błąd?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12083">Karbos</a> — 25 lut 2016, o 00:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-31T12:22:31+01:00</updated>
<published>2016-01-31T12:22:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152186#p152186</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152186#p152186"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152186#p152186"><![CDATA[
<div class="quotetitle">1Yokoon napisał(a):</div><div class="quotecontent"><br />Dlaczego licznik liczy dalej skoro TCNT1 = OCR1B, TCNT1=0 liczy od początku<br /></div><br /><br />Licznik liczy dalej bo w trybie CTC jego wartość jest zerowana przy zrównaniu się z rejestrem OCR1A. Zrównanie się z OCR1B nie zeruje TCNT1. Licznik jest jeden a rejestry porównania dwa. Więc może się zerować przy zrównaniu się tylko z jednym z nich.<br /><br />I tym ważniejszym rejestrem jest OCR1A. To ten rejestr określa wartość TOP czyli maksymalną do jakiej może zliczać TCNT1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 31 sty 2016, o 12:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-31T10:33:52+01:00</updated>
<published>2016-01-31T10:33:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152176#p152176</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152176#p152176"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152176#p152176"><![CDATA[
Napiszę jeszcze kilka słów o tym dlaczego obydwa przerwania wykonują się co sekundę skoro wartość w OCR1B jest mniejsza niż w OCR1A.<br /><br />Spójrzmy na poniższy rysunek<br /><a href="https://obrazkiforum.atnel.pl/204/60d5e8f5021229caf71c71e2335f57eb.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/204/60d5e8f5021229caf71c71e2335f57eb.png" alt="Obrazek" /></a><br /><br />Licznik TCNT1 liczy sobie od punktu A do punktu C. W punkcie C zostaje wyzerowany i znów zaczyna liczyć od A do C. W tym czasie mija jedna sekunda i przerwanie Compare Match A zostaje wywoływane co sekundę.<br /><br />A jak działa przerwanie Compare Match B?<br />Licznik TCNT1 zaczyna liczyć w punkcie A. W punkcie B jego wartość jest równa wartości w OCR1B. Minęło pół sekundy. Zostaje wywołane przerwanie. Licznik liczy dalej. Od punktu B do punktu C mija pół sekundy. TCNT1 zostaje wyzerowany i zaczyna liczyć od nowa. Od punktu A do punktu B mija też pół sekundy.<br /><br />Od B do C - pół sekundy i od A do B również pół sekundy. Czyli pierwsze przerwanie Compare Match B wywoła się po upływie pół sekundy ale już każde następne po upływie sekundy.<br /><br />Obydwa przerwania wywołują się co sekundę ale są przesunięte względem siebie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 31 sty 2016, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-31T09:16:56+01:00</updated>
<published>2016-01-31T09:16:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152172#p152172</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152172#p152172"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152172#p152172"><![CDATA[
To co napisałem dotyczy trybu CTC.<br /><br />Spójrz na poniższy program<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 />#define LED1(1&lt;&lt;PC0)<br />#define LED2(1&lt;&lt;PC1)<br /><br />int main(void)<br />{<br /><br />TCCR1B |= (1&lt;&lt;WGM12);//CTC<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10);//preskaler 1024<br />OCR1A = 15624;<br />OCR1B = 7812;<br />TIMSK |= (1&lt;&lt;OCIE1A) | (1&lt;&lt;OCIE1B);<br /><br />//PC0 i PC1 jako wyjścia - LED1 i LED2<br />DDRC |= LED1 | LED2;<br /><br />sei();<br /><br />while(1)<br />{<br /><br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />PORTC ^= LED1;<br />}<br /><br />ISR(TIMER1_COMPB_vect)<br />{<br />PORTC ^= LED2;<br />}[/syntax]<br /><br />Timer1 pracuje w trybie CTC. Wartość w OCR1A została tak dobrana aby przy zegarze 16MHz i preskalerze 1024, przerwanie wywoływało się co jedną sekundę. Dioda LED1 zmienia stan co sekundę.<br /><br />Wartość w OCR1B jest o połowę mniejsza niż wartość w OCR1A. Dioda LED2 również zmienia swój stan co sekundę ale w połowie czasu pomiędzy mignięciami LED1. Obydwie diody migają co sekundę.<br /><br />Natomiast w poniższym programie miga tylko dioda LED1 co pół sekundy bo wartość w OCR1B jest większa niż w OCR1A. <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 />#define LED1(1&lt;&lt;PC0)<br />#define LED2(1&lt;&lt;PC1)<br /><br />int main(void)<br />{<br /><br />TCCR1B |= (1&lt;&lt;WGM12);//CTC<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10);//preskaler 1024<br />OCR1A = 7812;<br />OCR1B = 15624;<br />TIMSK |= (1&lt;&lt;OCIE1A) | (1&lt;&lt;OCIE1B);<br /><br />//PC0 i PC1 jako wyjścia - LED1 i LED2<br />DDRC |= LED1 | LED2;<br /><br />sei();<br /><br />while(1)<br />{<br /><br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />PORTC ^= LED1;<br />}<br /><br />ISR(TIMER1_COMPB_vect)<br />{<br />PORTC ^= LED2;<br />}[/syntax]<br /><br />Przerwanie Compare Match B nie wywołuje się bo licznik TCNT1 zostaje wyzerowany przy zrównaniu się OCR1A (7812) i nie ma możliwości aby doliczył do wartości równej OCR1B (15624).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 31 sty 2016, o 09:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-30T15:36:45+01:00</updated>
<published>2016-01-30T15:36:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152125#p152125</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152125#p152125"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152125#p152125"><![CDATA[
<div class="quotetitle">1Yokoon napisał(a):</div><div class="quotecontent"><br />Pomyliłeś z trybem PWM.<br />W trybie CTC licznik TCNT1A po zrównaniu z rejestrem OCR1A zeruje się i liczy od nowa.<br /></div><br />A w którym miejscu napisałem, że po zrównaniu się licznika TCNT1 z OCR1A licznik liczy dalej?<br /><br />Przecież napisałem<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">Licznik TCNT1, po zrównaniu się z OCR1A, zostaje wyzerowany i zaczyna zliczać od zera do wartości w OCR1A.</div><br />Czyli to samo co ty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 30 sty 2016, o 15:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marek2012r]]></name></author>
<updated>2016-01-29T21:51:41+01:00</updated>
<published>2016-01-29T21:51:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152085#p152085</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152085#p152085"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152085#p152085"><![CDATA[
Bardzo fajnie wszystko wytłumaczone. Temat to zamknięcia. <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=12806">marek2012r</a> — 29 sty 2016, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-08-29T19:33:44+01:00</updated>
<published>2016-01-29T21:39:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152082#p152082</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152082#p152082"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152082#p152082"><![CDATA[
<div class="quotetitle">marek2012r napisał(a):</div><div class="quotecontent"><br />Czy jeżeli korzystam z TCCR1B to w tym rejestrze porównania nie powinno się wpisać OCR1B zamiast OCR1A ?<br /></div><br />Nie.<br /><br />Popełniasz błąd prawie wszystkich początkujących wg których rejestr TCCR1A jest od kanału OCR1A a rejestr TCCR1B - od kanału OCR1B. Timer1 w Atmega8 ma tak dużo trybów pracy, że bity konfiguracyjne nie zmieściły by się w ośmiu bitach jednego rejestru. Aby je pomieścić potrzeba kolejnych ośmiu bitów w kolejnym rejestrze. I dlatego Timer1 ma dwa rejestry konfiguracyjne - TCCR1A i TCCR1B.<br /><br />Co do trybu CTC.<br /><a href="https://obrazkiforum.atnel.pl/204/9c240489bdcd5e61af8b5a92d2176c70.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/204/9c240489bdcd5e61af8b5a92d2176c70.jpg" alt="Obrazek" /></a><br />W tabeli widać, że aby włączyć tryb CTC należy ustawić bit WGM12. <br /><br />A ten bit leży w rejestrze TCCR1B<br /><a href="https://obrazkiforum.atnel.pl/204/9ed9b017e1b0662d0c01d28c75abf199.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/204/9ed9b017e1b0662d0c01d28c75abf199.png" alt="Obrazek" /></a><br /><br />W tabeli widać również, że rejestrem porównania jest rejestr OCR1A. I do tego rejestru należy wpisać liczbę, do której będzie liczył Timer1.<br /><br />Aby Timer zaczął pracować należy jeszcze ustawić m.in. preskaler. Bity preskalera znajdują się w TCCR1B. <br /><br />Podsumowując. Podstawowy tryb CTC korzysta z rejestru porównania OCR1A. Ale żeby go włączyć należy ustawić bity z rejestru TCCR1B. Bo w tym rejestrze bity te umieścił producent.<br /><br />Przeanalizuj dobrze podrozdział &quot;16-bit Timer/Counter Register Description&quot; z noty pdf. A zwłaszcza to jakie bity znajdują się w rejestrach konfiguracyjnych.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />W trybie CTC można również korzystać z rejestru OCR1B i z przerwania od porównania licznika TCNT1 z tym rejestrem. Ale wartość wpisana do OCR1B musi być mniejsza od wartości w OCR1A. <br /><br />Licznik TCNT1, po zrównaniu się z OCR1A, zostaje wyzerowany i zaczyna zliczać od zera do wartości w OCR1A. Jeśli w OCR1A będzie wartość np. 1000 to TCNT1 do liczy do tej wartości i ani jednego impulsu dalej. Więc jeśli w OCR1B byłaby wartość np. 1005 to licznik nigdy by do niej nie doliczył.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 29 sty 2016, o 21:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marek2012r]]></name></author>
<updated>2016-01-29T20:55:47+01:00</updated>
<published>2016-01-29T20:55:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152077#p152077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152077#p152077"/>
<title type="html"><![CDATA[Re: Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152077#p152077"><![CDATA[
To w takim razie mam pytanie do takiego kodu<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">#include &lt;avr/io.h&gt;<br />            #include &lt;avr/interrupt.h&gt;<br />            #define LED (1&lt;&lt;PC1)<br />            #define LED1 (1&lt;&lt;PC2)<br />            #define LED2 (1&lt;&lt;PC3)<br />        volatile uint8_t timer;<br />        uint8_t flaga, flaga2;<br /><br />            int main (void)<br />            {<br />            DDRC |= LED|LED1|LED2;<br />            PORTC |= LED|LED1|LED2;<br />            TCCR1B |= (1&lt;&lt;WGM12);<br />            TCCR1B |= (1&lt;&lt;CS12);<br />            OCR1A = 31249;<br />            TIMSK |= (1&lt;&lt;OCIE1A);<br />            sei();<br />    while(1)<br />            {<br />                    if (timer==0)<br />                    {<br />                     PORTC &amp;= ~LED;<br />                    }<br />                else if (timer==5)<br />                {<br />                PORTC |= LED;<br />                PORTC &amp;= ~LED1;<br />                flaga=1;<br />                }<br />                else if (timer==10 &amp;&amp; flaga==1)<br />                        {<br />                            PORTC |= LED1;<br />                            PORTC &amp;= ~LED2;<br /><br />                            flaga2=1;<br />                        }<br />                else if (timer==15 &amp;&amp; flaga2==1)<br />                {<br />                    PORTC |= LED2;<br />                    flaga=0;<br />                    flaga2=0;<br />                    PORTC &amp;= ~LED;<br />                }<br /><br />            }<br /><br /><br />    }<br />    ISR(TIMER1_COMPA_vect)<br />    {<br />    timer++;<br />    if (timer&gt;15) timer=0;<br /></div><br />Czy jeżeli korzystam z <strong>TCCR1B  </strong> to w tym rejestrze porównania nie powinno się wpisać <strong>OCR1B </strong>zamiast <strong>OCR1A </strong> i w <strong>TIMSK |= (1&lt;&lt;OCIE1B)</strong>;?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12806">marek2012r</a> — 29 sty 2016, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marek2012r]]></name></author>
<updated>2016-01-29T20:10:24+01:00</updated>
<published>2016-01-29T20:10:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152072#p152072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152072#p152072"/>
<title type="html"><![CDATA[Tryb CTC-rejestr porównania?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14342&amp;p=152072#p152072"><![CDATA[
Witam. Mam takie pytanie odnośnie korzystania z trybu CTC na atmega8. W dokumentacji na stronie 97 jest napisane że ten tryb zlicza do rejestru porównania OCR1A. Natomiast na stronie 98 jest coś wspomniane o OCR1B. Jak to z tym jest? Które z nich należy wpisać jako rejestr porównania? Z góry dziękuję za odpowiedź, i przepraszam jeżeli umieściłem w złym dziale i/lub nazwałem źle temat, ale jest to mój pierwszy post.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12806">marek2012r</a> — 29 sty 2016, o 20:10</p><hr />
]]></content>
</entry>
</feed>