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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-01T00:39:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8345&amp;mode</id>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-09-01T00:39:55+01:00</updated>
<published>2014-09-01T00:39:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93794#p93794</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93794#p93794"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93794#p93794"><![CDATA[
Nie kompilowałem tego więc mogą być błędy ale do głowy przyszło mi coś takiego<br />Gdy otrzymamy przerwanie zewnętrzne odpalamy funkcję która włącza ustawiony wcześniej Timer0.<br />w nieskończonej pętli program sprawdza &quot;warunki przerwań&quot; czyli nasze sztuczne flagi przewanie_int i przerwanie_tim<br />Gdy napotka na przerwanie tim sprawdza &quot;gdzie jest&quot; według zmiennej idx.<br />Program może wymakać poprawek i strasznie przepraszam jeżeli coś poplątałem ale intencje miałem dobre <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pozdrawiam i powodzenia<br />Przemek<br /><br /><br />[syntax=c]#define TIMER0_START TCCR0B |= (1 &lt;&lt; CS00)| (1 &lt;&lt; CS01)// 64 x preskaler 64uS<br />#define TIMER0_STOP TCCR0B &amp;= ~( (1 &lt;&lt; CS00)|(1 &lt;&lt; CS01) )<br /><br />void inicjalizacja(void);<br />void start_cyklu(void);<br />void fazowanie(void);<br /><br />main()<br />{<br />inicjalizacja();<br />volatile uint8_t przerwanie_int=0;<br />volatile uint8_t przerwanie_tim=0;<br />volatile uint8_t idx=0;<br />volatile uint8_t faza&#91;2&#93;;<br />faza&#91;0&#93;=40;<br />faza&#91;1&#93;=70;<br /><br />while(1)<br />{<br />start_cyklu();<br />fazowanie();<br />}<br />}<br /> <br />ISR(INT0_vect)<br />{<br />przerwanie_int = 1;<br />}<br /><br />ISR(TIM0_COMPA_vect){<br />przerwanie_tim=1;<br />}<br /><br />void inicjalizacja(void){<br />// tutaj bym wklepał ustawienia odpowiedzialne za odpowiednią pracę INT0 (zezwolenia na przerwania itp)<br />// oraz częściowe ustawienia Timera0<br />}<br /><br /><br />void start_cyklu(void){<br />if(przerwanie_int)<br />{<br />przerwanie_int = 0;<br />TCNT0=0;<br />OCR0A = faza&#91;idx&#93;;<br />TIMER0_START;<br />idx++;<br />}<br />}<br /><br />void fazowanie(void){<br />if(przerwanie_tim){<br />przerwanie_tim=0;<br />if(idx&gt;=2){<br />TIMER0_STOP;<br />idx=0;<br />}<br />else{<br />OCR0A=faza&#91;idx&#93;;<br />idx++;<br />}<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 1 wrz 2014, o 00:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2014-08-31T21:30:52+01:00</updated>
<published>2014-08-31T21:30:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93776#p93776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93776#p93776"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93776#p93776"><![CDATA[
Unter<br />Dokładnie takie coś.<br /><br />Przeniosłem faza=0 do przerwania INT0 i jest lepiej, ale dlaczego to nie działało w samym przerwaniu CTC, przecież nie jest blokowana zmiana wartości OCR0A podczas przerwania ??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 31 sie 2014, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-08-31T20:31:54+01:00</updated>
<published>2014-08-31T20:31:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93764#p93764</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93764#p93764"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93764#p93764"><![CDATA[
Jeżeli temat jeszcze aktualny ...<br />Czy coś takiego autor miał na myśli ??<br /><br />(przepraszam za jakość ale to mój program &quot;mathpaint&quot; ma małą dokładność)<br /><a href="http://forum.atnel.pl/_obrazki/o/5491/c2cf65f7cebdbc8a9329d8ead9ce8c6d.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5491/c2cf65f7cebdbc8a9329d8ead9ce8c6d.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 31 sie 2014, o 20:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-08-30T20:29:49+01:00</updated>
<published>2014-08-30T20:29:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93527#p93527</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93527#p93527"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93527#p93527"><![CDATA[
Witam,<br /><br />Jak masz przerwanie i licznik dojdzie do wartości porównawczej to zaczyna zliczać od 0, więc nie masz się o co bać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Co do makrodefinicji, spróbuj dać jak podałem, nie wiem jak wygląda ta z triakiem, może tam masz gdzieś błędzik? Tak po macoszowemu to ciężko zgadnąć :/<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 30 sie 2014, o 20:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2014-08-30T20:06:10+01:00</updated>
<published>2014-08-30T20:06:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93524#p93524</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93524#p93524"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93524#p93524"><![CDATA[
Wielkie dzięki. No trochę mi wytłumaczyłeś co miałem na myśli <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Tylko jest taki myk:<br />- że ja wartość w OCR0A będę wpisywał różną ponieważ chcę mieć różne czasy załączania i wyłączania. - dlatego wpisuję TCNT0 = 0 aby mieć pewność, że timer ruszy liczyć od zera po ponownym wystartowaniu a nie od jakiejś tam wartości<br /><br />Mój zamysł sekwencji jest mniej więcej taki:<br />- przerwanie zew INT0<br />- startuje timer z jakąś tam wart OCR0A<br />- przerwanie CTC od timera, wystawienie wys. stanu na wyj i wpisanie nowej wartości do OCR0A<br />- po upływie pewnego czasu od załączenia &quot;drugie niejako&quot; przerwanie od timera i skasowanie wyjścia<br />i czekamy na kolejne INT0 aby zacząć całą procedurę od nowa<br /><br />Mam taki błąd, że to &quot;kasowanie&quot; w drugim przerwaniu odbywa się tak jakby co drugi raz.<br />Tak jakby wartość OCR0A nie była wpisywana za pierwszym przerwaniem od timera.<br /><br />Nie wiem czy wyjaśniłem czy bardziej zakręciłem, ale mniej więcej tak to ma działać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 30 sie 2014, o 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-08-30T19:50:48+01:00</updated>
<published>2014-08-30T19:50:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93523#p93523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93523#p93523"/>
<title type="html"><![CDATA[Re: Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93523#p93523"><![CDATA[
Witam,<br /><br />Kurcze ciężko mi zajarzyć co autor ma na myśli :/ No dobra ale powalczmy:<br /><br />1. Po otrzymaniu sygnału z zewnątrz:<br />[syntax=c]if(faza==0){<br />        TRIAK_ON;<br />        TIMER0_STOP; // to nie ma większego sensu?<br />        TCNT0=0; //przy korzystaniu z CTC korzystamy z OCRx<br />        OCR0A = 40; //przy CTC ustalamy 1 raz podczas konfiguracji Timera<br />        TIMER0_START;//to ma być przy przerwaniu zewnętrznym<br />        faza=1;<br />        }[/syntax]<br /><br />2. Skoro faza = 1, to przy następnym przerwaniu na pewno będzie else:<br />[syntax=c]else {<br />        TIMER0_STOP;//zatrzyma Twój licznik<br />        TRIAK_OFF;<br />        faza=0;//po przerwaniu zewnętrznym spełniony będzie if<br />        GIMSK |= (1 &lt;&lt; INT0);   // odblokowanie INT0 i czekamy na nastepne INT0<br />        }[/syntax]<br />3. Teraz przerwanie zewnętrzne:<br />[syntax=c]ISR(INT0_vect)<br />{<br /><br />        GIMSK &amp;= ~(1&lt;&lt;INT0);     //Po co tak kombinować skoro wyłączasz 1 bit<br />        char temp;<br />                    /*Filter it to makes sure it was not only noise*/<br />                    for (temp = 0;temp &lt; 5;)          //Five samples noise filter<br />                        {<br />                        if(!(PINB &amp; (1&lt;&lt;PB2)))temp++; //to się wykona jeżeli masz stan niski na tym pinie od przerwania w stanie niskim przez ten czas,<br />                        else{<br />                                        temp = 100;<br />                                        GIMSK |= (1 &lt;&lt; INT0);<br />                                }<br />                        }<br />                     if(temp != 100)<br />                                {<br />                        TCNT0=0; // po co to?<br />                        OCR0A = 40;// po co to?<br />                        TIMER0_START;<br />                            }<br /><br />}[/syntax]<br />Generalnie ja bym to dał do funkcji głównej programu a w przerwaniu od int tylko ustawiał flagę.<br /><br />Tyle co można powiedzieć do tego kodu, jak by była całość to może więcej by się coś doradziło.<br /><br />Ale przerwanie to zrobiłbym to na zasadzie:<br />[syntax=c]main()<br />{<br /> while(1)<br />  {<br />    if(przerwanie_int)<br />     {<br />       przerwanie_int = 0;<br />       ....//tu Twoje instrukcje<br />     }<br />  }<br />}<br /><br />ISR(INT0_vect)<br />{<br /> przerwanie_int = 1;<br />}[/syntax]<br /><br />Jak chcesz więcej wskazówek i rozwiązania problemu daj cały kod, czyli definicję zmiennych i we/wy pinów. A makrodefinicje nie wiem czy nie powinny być ujęte w cudzysłowie, żeby to tak zadziałało jak masz?<br /><br />[syntax=c]#define TIMER0_START &quot;TCCR0B |= (1 &lt;&lt; CS00)| (1 &lt;&lt; CS01)&quot;[/syntax]<br />Bez średnika na końcu.<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 30 sie 2014, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2014-08-30T17:15:24+01:00</updated>
<published>2014-08-30T17:15:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93502#p93502</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93502#p93502"/>
<title type="html"><![CDATA[Obsługa Timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8345&amp;p=93502#p93502"><![CDATA[
Witam forumowiczów<br /><br />Mam taki problem.<br /><br />Mam ATtiny 24 i timer0 8bit. Ustawiłem go w tryb CTC. Chcę aby wystartować timer zew. przerwaniem INT0 i po przyjściu przerwania od TIM0_COMPA włączam wyjście i po pewnym czasie chciałbym je wyłączyć w tym samym przerwaniu  więc wpisuje inną wartość w OCR0A. Jednak zachowuje mi sie to totalnie nieprzewidywalnie. Kod poniżej:<br />[syntax=c]#define TIMER0_START TCCR0B |= (1 &lt;&lt; CS00)| (1 &lt;&lt; CS01);  // 64 x preskaler 64uS<br />#define TIMER0_STOP TCCR0B &amp;= ~( (1 &lt;&lt; CS00)|(1 &lt;&lt; CS01) );<br />TIMSK0 |= (1&lt;&lt;OCIE0A);<br /><br />TCCR0A |= (1 &lt;&lt; WGM01);<br /><br /><br />ISR(INT0_vect)<br />{<br />GIMSK = GIMSK &amp; ~(1&lt;&lt;INT0);    //Disable external int 0<br />char temp;<br /><br />    /*Filter it to makes sure it was not only noise*/<br />    for (temp = 0;temp &lt; 5;)          //Five samples noise filter<br />    {<br />if(!(PINB &amp; (1&lt;&lt;PB2)))temp++;<br /><br />        else{<br />        temp = 100;<br />        GIMSK |= (1 &lt;&lt; INT0);<br />        }<br />    }<br />     if(temp != 100)<br />        {<br />        TCNT0=0;<br />        OCR0A = 40;<br />        TIMER0_START;<br />               }<br />}<br /><br />ISR(TIM0_COMPA_vect){<br /><br />if(faza==0){<br />TRIAK_ON;<br />TIMER0_STOP;<br />TCNT0=0;<br />OCR0A = 40;<br />TIMER0_START;<br />faza=1;<br />}<br />else {<br />TIMER0_STOP;<br />TRIAK_OFF;<br />faza=0;<br />GIMSK |= (1 &lt;&lt; INT0); // odblokowanie INT0 i czekamy na nastepne INT0<br /><br />}<br />}[/syntax]<br /><br />Dodam, że taktuje 1MHz więc zwiększanie timera (i co za tym idzie porównywanie wartości TCNT0 z OCR0A) powinno być co 64 us przy danym preskalerze.<br />Czy dobrze kombinuje czy coś pominąłem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 30 sie 2014, o 17:15</p><hr />
]]></content>
</entry>
</feed>