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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-02-12T16:56:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5953&amp;mode</id>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2014-02-12T16:56:15+01:00</updated>
<published>2014-02-12T16:56:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70142#p70142</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70142#p70142"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70142#p70142"><![CDATA[
Hehe, przyznam się, że w jednym z urządzeń, które kiedyś zaprojektowałem, ze względu na wyciskanie ostatnich potów w Bascomie musiałem przenieść kilka timerów z przerwań do pętli głównej i dla nich zostawiłem tam tylko jedno taktowanie. Było to o tyle możliwe do zrobienia, że ich główne zadanie to miganie diodkami, lub jakieś mało istotne z punktu śrubowania czasowego pętelki opóźniające, itp. Tak więc jeśli się wie co się robi i zdaje sprawę z ograniczeń to jak najbardziej wszystkie chwyty dozwolone, a czasem wręcz niezbędne (jak w moim przypadku)... <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=1922">SylwekK</a> — 12 lut 2014, o 16:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-12T14:24:36+01:00</updated>
<published>2014-02-12T14:24:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70112#p70112</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70112#p70112"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70112#p70112"><![CDATA[
Ech... prosta sprawa <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" />  Najtrudniej dochodzi się do prostych rozwiązań. Przyznam się, że promocja do int gdzieś mi przemknęła przez myśl ale potem jakoś mi to umknęło. <br />Poza tym nie wziąłem po uwagę liczb ujemnych.<br /><br />Mirku jak zwykle rzeczowe wytłumaczenie problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Pomijając już fakt, że wyrażenie nie działa w warunku (w bascomie to normalne, ale tu to ciekawostka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) to taki sposób generacji odcinków czasowych jest skrajnie niedokładny. Wystarczy, że parę instrukcji przyblokuje pętle główną (i nie mówią tu nawet o delay, itp), a licznik w tym czasie doliczy do 78 i następne jego odświeżenie może być np. kiedy doliczy do 160... i wtedy podział czasu nie będzie 10ms tylko ponad 20ms. No ale chyba liczysz się z takim błędem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br />Doskonale zdaję sobie sprawę z ograniczeń tego rozwiązania. I normalnie timery programowe robię na przerwaniach a to traktuję jako ciekawostkę, która pokazuje jak można inaczej wykorzystać liczniki Timerów. Chociaż czasem taki sposób może się też przydać w wyjątkowych sytuacjach.<br /><br />Dziękuje wszystkim za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 lut 2014, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-02-12T11:03:45+01:00</updated>
<published>2014-02-12T11:03:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70072#p70072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70072#p70072"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70072#p70072"><![CDATA[
a co będzie gdy <br /><br />[syntax=c]if( (TCNT0 - timer_val) &gt;= 78 )[/syntax]<br /><br />przyjmą np takie wartości?<br /><br />[syntax=c]if( (5 - 250 ) &gt;= 78 )[/syntax]<br /><br />???<br /><br />pewnie w wyniku domyślnej promocji do int w IF pojawi się -245 i już ten warunek nigdy się nie spełni - zatrzyma się wszystko na amen no bo nawet gdy TCNT0 zwiększy się w końcu nawet do 255 to i tak nigdy nie będzie wartość &gt;= 78 prawda ?<br /><br />dlatego gdy zrobimy rzutowanie:<br /><br />[syntax=c]if( (uint8_t)(TCNT0 - timer_val)  &gt;= 78 )[/syntax]<br /><br />albo<br /><br />[syntax=c]uint8_t temp;<br /> <br />temp = TCNT0 - timer_value;[/syntax]<br /><br />to pomijamy domyślną promocję do INT i rzutujemy wynik do typu uint8_t w związku z czym w IF porównywana jest z wartością 78 wartość wyrażenie, którego wynikiem będzie ZAWSZE liczba bez znaku , która wciąż się zwiększa<br /><br />po prostu rozpisz sobie na kartce kilka przypadków np gdy TCNT0 ma wartości: 5, 100, 150, 200<br /><br />i sam zobaczysz o co chodzi <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> — 12 lut 2014, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2014-02-12T10:00:49+01:00</updated>
<published>2014-02-12T10:00:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70062#p70062</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70062#p70062"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70062#p70062"><![CDATA[
Pomijając już fakt, że wyrażenie nie działa w warunku (w bascomie to normalne, ale tu to ciekawostka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) to taki sposób generacji odcinków czasowych jest skrajnie niedokładny. Wystarczy, że parę instrukcji przyblokuje pętle główną (i nie mówią tu nawet o delay, itp), a licznik w tym czasie doliczy do 78 i następne jego odświeżenie może być np. kiedy doliczy do 160... i wtedy podział czasu nie będzie 10ms tylko ponad 20ms. No ale chyba liczysz się z takim błędem <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=1922">SylwekK</a> — 12 lut 2014, o 10:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-11T23:06:08+01:00</updated>
<published>2014-02-11T23:06:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70023#p70023</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70023#p70023"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70023#p70023"><![CDATA[
Ze zmienną timer_value jako <strong>volatile</strong> też nie działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 lut 2014, o 23:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[afrikanerhart]]></name></author>
<updated>2014-02-11T22:39:49+01:00</updated>
<published>2014-02-11T22:39:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70018#p70018</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70018#p70018"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70018#p70018"><![CDATA[
Zmienna timer_val  powinna być zadeklarowana jako volatile.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1233">afrikanerhart</a> — 11 lut 2014, o 22:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-11T21:32:04+01:00</updated>
<published>2014-02-11T21:32:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70002#p70002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70002#p70002"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=70002#p70002"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Nie możesz tych timerów normalnie w przrwaniach zrobić?<br /></div><br />Oczywiście, że mogę ale chciałem dla testu zrobić inaczej. I jeden wariant warunku if nie działa a dwa inne warianty działają. I ciekawi mnie dlaczego? <br /><br />Niestety przy moim stanie wiedzy raczej do tego nie dojdę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 lut 2014, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2014-02-11T21:24:53+01:00</updated>
<published>2014-02-11T21:24:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69999#p69999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69999#p69999"/>
<title type="html"><![CDATA[Re: Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69999#p69999"><![CDATA[
A zrób timer1 volatile <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Aaaa, chyba nie wiele to da w sumie. Nie zobaczyłem reszty kodu (na tablecie dziwnie mi się ogląda). Nie możesz tych timerów normalnie w przrwaniach zrobić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 11 lut 2014, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-11T21:06:29+01:00</updated>
<published>2014-02-11T21:06:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69992#p69992</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69992#p69992"/>
<title type="html"><![CDATA[Warunek if - dlaczego się nie wykonuje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5953&amp;p=69992#p69992"><![CDATA[
Witam.<br /><br />Napisałem prościutki programik. Trochę inne wykorzystanie timera sprzętowego do &quot;napędzania&quot; timerów programowych<br />[syntax=c]/*<br /> * main.c<br /> *<br /> * Atmega8<br /> * 8MHz<br /> *<br /> *  Created on: 10-02-2014<br /> *      Author: Jacek<br /> */<br /><br />#include &lt;avr/io.h&gt;<br /><br />uint16_t Timer1, Timer2;<br />uint8_t timer_val;<br /><br />void prog_timer(void);<br /><br />int main(void)<br />{<br />//PD6 i PD7 jako wyjścia - diody LED<br />DDRD |= (1&lt;&lt;PD6) | (1&lt;&lt;PD7);<br /><br />//załączenie preskalera<br />//Timer0 zaczyna liczyć impulsy taktujące podzielone przez 1024<br />//licznik TCNT0 jest zwiększany co 128us<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);//preskaler 1024<br /><br />//sei();<br />//przypisanie do zmiennej timer_val<br />//aktualnej wartości licznika TCNT0<br />timer_val = TCNT0;<br />while(1)<br />{<br />prog_timer();<br /><br />//timer programowe<br />if(!Timer1)<br />{<br />Timer1 = 80;<br />PORTD ^= (1&lt;&lt;PD6);<br />}<br /><br />if(!Timer2)<br />{<br />Timer2 = 8;<br />PORTD ^= (1&lt;&lt;PD7);<br />}<br />}<br />}<br /><br />void prog_timer(void)<br />{<br />uint16_t n;<br /><br />//jeśli różnica między zliczającym w górę licznikiem TCNT0<br />//a wartością zmiennej timer_value<br />//jest większa od 78, to oznacza że minęło ok. 10ms (128us * 78)<br />if( (TCNT0 - timer_val) &gt;= 78 )<br />{<br />//załaduj znową aktualną wartość TCNT0 do timer_value<br />//aby znów liczyć różnicę między TCNT0 a timer_value<br />timer_val = TCNT0;<br /><br />//zmniejszenie wartości liczników<br />//timerów programowych co ok. 10ms<br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br /><br />n = Timer2;/* 100Hz Timer1 */<br />if (n) Timer2 = --n;<br />}<br />}[/syntax]<br />Program ma działać w ten sposób.<br />Ustawiamy preskaler dla Timera0. Od tego momentu Timer0 zaczyna liczyć impulsu taktujące wstępnie podzielone przez 1024. Co przy taktowaniu 8MHz daje nam zwiększanie licznika TCNT0 co 128us. Następnie aktualna wartość TCNT0 jest przepisana do zmiennej timer_value.<br />W funkcji prog_timer() obliczana jest różnica miedzy stale zwiększającą się wartością TCNT0 a wcześniej zapisana wartością timer_value. Jeśli ta różnica jest większa od 78 to ma wykonać się kod w ciele warunku if. Czyli przypisanie aktualnej wartości TCNT0 do zmiennej timer_value i zmniejszenie wartości liczników timerów programowych. Wg założeń if ma się wykonywać co ok. 10ms.<br /><br />No ale w takiej postaci[syntax=c]if( (TCNT0 - timer_val) &gt;= 78 )[/syntax]warunek się nie wykonuje.<br /><br />Natomiast w takiej[syntax=c]uint8_t temp;<br /><br />temp = TCNT0 - timer_value;<br />if( temp &gt;= 78 )[/syntax]już tak. Warunek wykonuje się co ok. 10ms i timery programowe pięknie działają.<br /><br />Przypomniałem sobie, że podobny mechanizm widziałem w źródłach do Usbasp i tam było zrobione rzutowanie w taki sposób [syntax=c]if( (uint8_t)(TCNT0 - timer_val)  &gt;= 78 )[/syntax]To oczywiście też działa.<br /><br />Czy ktoś mógłby mi wytłumaczyć dlaczego pierwszy warunek nie działa a dwa pozostałe działają?<br /><br />Przeglądałem też pliki *.lss ale za cienki jestem z asm i niewiele mi to wyjaśniło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 lut 2014, o 21:06</p><hr />
]]></content>
</entry>
</feed>