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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-07-02T20:48:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7655&amp;mode</id>
<entry>
<author><name><![CDATA[Jarosław J]]></name></author>
<updated>2014-07-02T20:48:29+01:00</updated>
<published>2014-07-02T20:48:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86511#p86511</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86511#p86511"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie porównania w  przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86511#p86511"><![CDATA[
Sprawdzałem to  też Obie zmienne o które pytasz są typu  volatile static uint16_t  nie wiem o  jakie klasy pamięci Ci chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=786">Jarosław J</a> — 2 lip 2014, o 20:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarosław J]]></name></author>
<updated>2014-07-02T20:27:54+01:00</updated>
<published>2014-07-02T20:27:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86507#p86507</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86507#p86507"/>
<title type="html"><![CDATA[Dziwne zachowanie porównania w  przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7655&amp;p=86507#p86507"><![CDATA[
Hej. Już jakiś czas zmagam się z takim problemem.  <br />Chcę zrobić opóźnienie czasowe przy pomocy sprzętowego Timera1, regulowane przy pomocy  potencjometru podłączonego do  jednego  z przetworników ADC.    <br />Pomysł swój  realizuję w  ten sposób. <br />Najpierw deklaruję sobie zmienną o nazwie &quot;wynik&quot;  która w zależności od położenia potencjometru przyjmuje  wartość od 0 - 1023<br />Ta zmienna  jest  zadeklarowana w ten sposób:<br />volatile static uint16_t wynik;<br /><br />Następnie w pętli głównej  odczytuję wartość ADC  w zwyczajny sposób <br />wynik = pomiar(PC4);<br />Fakt  że dzieje się to  bardzo szybko ale mój program nie ma  zbyt wiele do roboty. Funkcja odczytująca  uwzględnia flagę  która mówi o gotowości wyniku, tak  więc mam pewność że za każdym razem  otrzymuję właściwy  wynik pomiaru. Z resztą obserwuję tę zmienną  na wyświetlaczu  LCD. <br /><br />Następnie jako przerwanie od Timera1 mam taką funkcję:<br /><br />[syntax=actionscript]ISR(TIMER1_OVF_vect)// liczy od 0 do 20831<br />{<br />        licznik_pulsacji++;<br />if (licznik_pulsacji&gt;= wynik)// programowy preskaler<br />{<br />          licznik_pulsacji=0;TCNT1=0;LED1_TOG;<br />}<br />}[/syntax]<br />Tutaj  na początku  zwiększam zmienną licznik pulsacji  a za tym daję warunek, jeśli zmienna &quot;licznik pulsacji&quot; będzie większa lub równa  zmiennej   odczytanej  z ADC,  wówczas niech zresetuje się  zmienna licznik pulsacji,  dalej  niech  zresetuje się  licznik  TCNT1  oraz  zmieni stan na przeciwny  dioda LED.  <br /><br />Wszystko teoretycznie wygląda OK  jednak   tak  na prawdę dioda LED  działa nierównomiernie.  Czasami da się zauważyć że  dioda wykona dwa cykle &quot;TOGGLE&quot;  podczas jednego cyklu  wykonania  warunku IF  z przerwania.  Próbowałem już wielu  sposobów  wszystkie zmienne  (nawet te szybkozmienne)  monitoruję na wyświetlaczu  LCD  i wszystko wygląda  OK.  Kiedy  w  warunku IF  w przerwaniu wpiszę  jakąś cyfrę  zamiast  wyniku  ADC  wtedy  wszystko działa OK.  <br /><br />To  sprowadziło  mnie  na taki  ślad, że  zmienna  wynik, która bywa że waha się o  jedną najmniej znaczącą cyfrę, kiedy  ślizg potencjometru  jest  na jakimś skraju dwóch  wartości  może wprowadzać te zakłócenia.<br />Z drugiej strony  jednak  przy  tak  częstym wykonywaniu przerwania i przy  tak  krótkich  czasach  nie sądzę  żeby  takie małe wahanie jednej  cyfry mogło  dać wizualne wrażenie nierównomiernej pracy. <br />Czy ma ktoś jakiś pomysł jak to ustabilizować? Niecierpliwie czekam na Wasze wskazówki.<br /><br />Przed chwilą zrobiłem takie karkołomne działanie <br />if (licznik_pulsacji&gt;= (wynik|(wynik+1)|(wynik-1)))// programowy preskaler<br />przez co wydaje mi się wyeliminowałem takie drgania   jednak  problem pozostał. Nadal  nie mam pomysłu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=786">Jarosław J</a> — 2 lip 2014, o 20:27</p><hr />
]]></content>
</entry>
</feed>