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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-03-15T21:58:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=23655&amp;mode</id>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-15T21:58:40+01:00</updated>
<published>2021-03-15T21:58:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231456#p231456</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231456#p231456"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231456#p231456"><![CDATA[
Tak. Panowie właśnie uświadomiliście mi, że przerwania to 'rzecz' sprzętowa i mogą wystąpić w dowolnym momencie pętli while(1). Nie wiem co mi się ubzdurało, że zakładałem, że przerwanie zawsze powinno być na początki while(1). A co za tym idzie IFy zawsze powinny być wykonywane w takiej kolejności jakiej są napisane.<br /><br />Więc wyglądało to tak, że np. dwa razy pod rząd mógł wykonać się odczyt temperatury (co zajmowało ~3ms) i było to już widoczne jako migotanie. A że zdarza się dość często to i migotanie jest widoczne. Za jakiś czas mogły wykonać się dwa wyświetlnia pod rząd (co akurat nie miałoby konsekwencji). Czasami mogły wykonywać się pokolei itd... Generalnie wszystkie możliwie kombinacje z których najgorsza ze względu na wyświetlanie jest kombinacja w której następuje odczyt temperatury 2x pod rząd.<br /><br />W moim przypadku używam tylko tego jednego przerwania, więc rzeczywiście mógłbym wstawić 'wyświetlanie' do przerwania, ale dla czytelności pozostawię je w while(1) w IFie (czyli tak jak miałem przed napisaniem tego posta).<br />Myślę, że na tą chwilę wszystko jest jasne. <br />Dzięki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 15 mar 2021, o 21:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-15T18:17:12+01:00</updated>
<published>2021-03-15T18:17:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231449#p231449</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231449#p231449"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231449#p231449"><![CDATA[
<div class="quotetitle">adamma25 napisał(a):</div><div class="quotecontent"><br />W zasadzie to mógłbyś obydwie funkcje umieścić w przerywaniu<br /></div><br />Nie jest to dobre rozwiązanie. Czas wykonywania przerwania powinien być jak najkrótszy.<br />W przypadku AVR'ów, gdzie nie można ustawić priorytetów przerwań, kod umieszczony w przerwaniu blokuje inne przerwania.<br />Przy bardziej  wymagających projektach takie podejście może być źródłem problemów.<br />W przypadku tego projektu, obsługę LCD w przerwaniu ze względu na wysoki priorytet da się jeszcze obronić, natomiast wrzucanie do przerwania jeszcze obsługi odczytu temperatury nie jest już najlepszym pomysłem. (Co nie znaczy, że to nie będzie działać). <br />Rozwiązanie autora z jednym if'em jest lepszym rozwiązaniem. Eliminuje problem migania LCD, a nie blokuje innych przerwań o ile takich używa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 15 mar 2021, o 18:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-03-15T16:36:15+01:00</updated>
<published>2021-03-15T16:36:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231448#p231448</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231448#p231448"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231448#p231448"><![CDATA[
A gdybyś funkcję wyświetl () umieścił w procedurze obsługi przerwania? Wtedy zawsze wykona się w odpowiednim czasie ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />W zasadzie to mógłbyś obydwie funkcje umieścić w przerywaniu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 15 mar 2021, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-13T20:26:32+01:00</updated>
<published>2021-03-13T20:26:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231435#p231435</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231435#p231435"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231435#p231435"><![CDATA[
Spróbuję jeszcze raz Ci to wyjaśnić.<br />Przerwanie timera może wystąpić w dowolnym momencie pętli głównej.<br />Jeżeli trafisz, że wywoła się przed 1 if'em lub za 2-gim to wszystko jest zgodnie z twoim założeniem, najpierw wywoła się if nr 1 potem nr 2.<br />Natomiast jeżeli przerwanie trafi się pomiędzy if'ami. Pierwszy if się już nie wykona. W międzyczasie zmieniają się wartości zmiennych timer. Drugi If' już jest spełniony i wywołuje funkcje z drugiego warunku, w twoich przypadkach obsługa odczytu temperatury. Następuje kolejny obieg pętli i dopiero wtedy wykonuje się pierwszy z if'ów z obsługą wyświetlacza.<br />Stąd oba if'y zawsze się wykonują. Kolejność uzależniona od miejsca w którym wywoła się przerwanie.<br />Dla zobrazowania wstawiam info o miejscu przerwania w kodzie:<br />[syntax=c]while (1) {<br />        if(!test) {<br />                wyswietl();            //wywolanie tej funkcji nastąpi dopiero w kolejnym obiegu pętli po wystąpieniu przerwania<br />                test=1;<br />        }<br /> // Tu może pojawić się przerwanie - które zamienia kolejność wywołania if'ów//<br />        if (!test1) {<br />                odczytajTemperatury();    // wtedy najpierw wywoła się  ta funkcja<br />                test1 = 1;<br />        }[/syntax]<br /><br />Niestety w twoim przypadku czas wykona procedury odczytu temperatury zakłóca wówczas obsługę LCD.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 13 mar 2021, o 20:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2021-03-13T20:13:50+01:00</updated>
<published>2021-03-13T20:13:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231434#p231434</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231434#p231434"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231434#p231434"><![CDATA[
Nie wykonują się w losowy sposób! &quot;Zmiana&quot; jest wtedy, kiedy &quot;wyzeruje&quot; Ci się zmienna test1 pomiędzy sprawdzeniem warunków, czyli if(!test) -&gt; przerwanie, w którym test=0 i test1=0 -&gt; if(!test1)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 13 mar 2021, o 20:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-13T20:07:53+01:00</updated>
<published>2021-03-13T20:07:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231433#p231433</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231433#p231433"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231433#p231433"><![CDATA[
<div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">Powyższe zachowanie jest wynikiem zmiany kolejności wykonywania IFów. Ale jak pisałem powyżej, one nie są 'gubione' tylko wykonywane są tak jakby w losowy sposób ale zawsze oba.<br /></div><br />Już Ci napisałem z czego to wynika.<br /><br />Aby się tego pozbyć możesz zrobić tak:<br />[syntax=c]main() {<br />volatile uint16_t test, test1;<br />    ...<br />.<br />while (1) {<br />        if(!test) {<br />                wyswietl();<br />                if (!test1) {<br />                      odczytajTemperatury();<br />                      test1 = 400;<br />                }<br />                test=1;<br />        }[/syntax]<br /><br />Oczywiście musisz zmienić procedurę odczytu temperatury.</div><br /><br />No właśnie nie zabardzo widzę z czego to wynika  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> To co napisałeś jest obejściem problemu. Podobne obejście przedstawiłem powyżej tj:<br />[syntax=c]while (1) {<br />        if(!test) {<br />                wyswietl();<br />                odczytajTemperatury();<br />                test=1;<br />        }[/syntax]<br /><br />To też działa bardzo dobrze (temperatury się odczytują wyświetlacz nie miga) i nie muszę nic zmieniać. Tak miałem zanim napisałem ten post.<br /><br />Chciałbym aby ktoś mi wyjaśnił to, to co napisałem w poście -&gt; &quot;Napisane: wczoraj, o 23:23&quot;. W skrócie: dlaczego dwa IFy które nic nie robią (oprócz 'delay' aby było widać w analizatorze) wykonują się w losowy sposób ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 13 mar 2021, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-13T12:57:34+01:00</updated>
<published>2021-03-13T12:57:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231431#p231431</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231431#p231431"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231431#p231431"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Powyższe zachowanie jest wynikiem zmiany kolejności wykonywania IFów. Ale jak pisałem powyżej, one nie są 'gubione' tylko wykonywane są tak jakby w losowy sposób ale zawsze oba.<br /></div><br />Już Ci napisałem z czego to wynika.<br /><br />Aby się tego pozbyć możesz zrobić tak:<br />[syntax=c]main() {<br />volatile uint16_t test, test1;<br />    ...<br />.<br />while (1) {<br />        if(!test) {<br />                wyswietl();<br />                if (!test1) {<br />                      odczytajTemperatury();<br />                      test1 = 400;<br />                }<br />                test=1;<br />        }[/syntax]<br /><br />Oczywiście musisz zmienić procedurę odczytu temperatury.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 13 mar 2021, o 12:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-13T12:31:04+01:00</updated>
<published>2021-03-13T12:31:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231430#p231430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231430#p231430"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231430#p231430"><![CDATA[
Spróbuję to rozwiąć.<br />Podstawa czasu 2.5ms jest graniczną dla wyświetlacza (8 sztuk 7segmentów). Każdy case x: z odczytTemeratury(); (kod powyżej) zajmuje ~0.5ms - więc spokojnie się mieści w podstawie czasu 2.5ms<br /><br />Powinno być tak:<br />pierwszyIF -&gt; wyswietl(); + drugiIF-&gt;odczytTemeratury(); + pozostały czas do następnego przerwania. I tak powinno być cały czas.<br /><br />Ale jeżeli:<br />pierwszyIF-&gt;wyswietl(); + drugiIF-&gt;odczytTemeratury(); + pozostały czas do następnego przerwania<br />I teraz jeśli z jakiś powodów znowu:<br />drugiIF-&gt;odczytTemeratury(); [to 'zabiera on' 0.5ms] + pierwszyIF-&gt;wyswietl(); + pozostały czas do następnego przerwania<br /><br />Dwa 'drugieIFy' powyżej trwają łącznie 3ms i to już jest widoczne jako migotanie.<br />Albo inaczej pisząc na wykonanie 'pierwszychIFów' powyżej trzeba czekać powyżej 3ms, co jest już widoczne jako migotanie.<br />Powyższe zachowanie jest wynikiem zmiany kolejności wykonywania IFów. Ale jak pisałem powyżej, one nie są 'gubione' tylko wykonywane są tak jakby w losowy sposób ale zawsze oba.<br /><br />Nie wiem czy bardziej wyjaśniłem czy zamotałem ale starałem się jak mogłem.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br /><div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">qutrit napisał(a):</div><div class="quotecontent">Ta zmiana kolejności wykonywania ifów w rzeczywistości powoduje migotanie LED. Dlaczego ta zamiana występuje ? Zawsze wykonywane są oba ify, tylko czasami następuje zmiana kolejności ich wykonywania.<br /></div><br />Sama zmiana kolejności sterowań przekaźnikami, przy takim kodzie jest możliwa.<br />Jeżeli przerwanie wykona się po pierwszym if'ie najpierw wywoła się obsługa przekaźnika2, a w następnym obiegu pętli dopiero obsługa przekażnika1.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 36 minutach ]</span></strong><br /><br />Powinieneś trochę zmienić podejście do obsługi zadań związanych z wyświetlaczem i odczytem danych.<br />Jeżeli masz wyświetlacz LCD, który obsługujesz przez multipleksowanie, to priorytetem jest obsługa tego wyświetlacza a nie odpytywanie temperatury.<br />W zależności od czujnika i czemu to ma służyć, temperaturę możesz odpytać np. raz na sekundę (przy DS18B20 i tak nie wiele szybciej możesz to zrobić). Szkoda zakłócać wyświetlacz obsługą DS'a. <br />Same if'y zostaw tak jak masz i będzie dobrze.<br />Ustaw tylko wartość test1 nie na 1 a np. na 400 i daj znać jaki jest efekt.</div><br /><br />wlacz/wylaczPrzekaznikx() - służuły mi teraz to podłaczenia analizatora. Same przekaźniki na ten czas były oczywiście odłączone. Tylko nazwy funkcji pozostały. <br />Generalnie muszę odczyt temepratury podzielić na fragmenty, bo na raz się nie da. Tzn. wykonując wszystkie komendy raz/sekunde będę miał migotanie co sekunde (może i rzadziej niż teraz ale za to bardziej widzoczne).<br />&quot;Ustaw tylko wartość test1 nie na 1 a np. na 400 i daj znać jaki jest efekt.&quot; Coś podobnego realizuję w 'case KONWERSJA_CZAS' w funkcji odczytTemeratury() (kod powyżej) ale też zamieszczam poniżej:<br />[syntax=c]case KONWERSJA_CZAS:<br />                if (++zmiennaPomocnicza &gt; 400) { // czekamy na konwert ~400x2.5ms = 1000 ms)<br />                        zmiennaPomocnicza = 0;<br />                        czyKonwertowac = 0;<br />                        procedura = RESET;<br />                }<br />                break;[/syntax]<br /><br />To znaczy zanim przejdzie mi do następnego case ( w tym przypadku powrót do case RESET:) to ten case KONWERSJA_CZAS wykona się 400 razy. Co w sumie i tak sprowadza się do odczytu temepratury co ~1sekunde. <br />Jak zauważyłem to zmiana kolejności wykonywania IFów następuje głównie w momencie wysyłania/odbierania danych z DSa. Przyczym jak pisałem powyżej IFy nie są gubione.<br />Tak jak pisałem powyżej. Jeżeli to migotanie w jakiś sposób zależałoby od funkcji wyswietl(); i odczytTemeratury(); to efekt byłby widoczy również w sytuacji gdy obie funkcjie umieszcze są w jednym IFie. A w tym przypadku <span style="text-decoration: underline">efekt migotania nie występuje</span>. Pojawia sie tylko po umieszceniu tych funkcji w osobnych IFach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 13 mar 2021, o 12:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-13T10:53:28+01:00</updated>
<published>2021-03-13T10:53:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231429#p231429</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231429#p231429"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231429#p231429"><![CDATA[
<div class="quotetitle">qutrit napisał(a):</div><div class="quotecontent"><br />Ta zmiana kolejności wykonywania ifów w rzeczywistości powoduje migotanie LED. Dlaczego ta zamiana występuje ? Zawsze wykonywane są oba ify, tylko czasami następuje zmiana kolejności ich wykonywania.<br /></div><br />Sama zmiana kolejności sterowań przekaźnikami, przy takim kodzie jest możliwa.<br />Jeżeli przerwanie wykona się po pierwszym if'ie najpierw wywoła się obsługa przekaźnika2, a w następnym obiegu pętli dopiero obsługa przekażnika1.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 36 minutach ]</span></strong><br /><br />Powinieneś trochę zmienić podejście do obsługi zadań związanych z wyświetlaczem i odczytem danych.<br />Jeżeli masz wyświetlacz LCD, który obsługujesz przez multipleksowanie, to priorytetem jest obsługa tego wyświetlacza a nie odpytywanie temperatury.<br />W zależności od czujnika i czemu to ma służyć, temperaturę możesz odpytać np. raz na sekundę (przy DS18B20 i tak nie wiele szybciej możesz to zrobić). Szkoda zakłócać wyświetlacz obsługą DS'a. <br />Same if'y zostaw tak jak masz i będzie dobrze.<br />Ustaw tylko wartość test1 nie na 1 a np. na 400 i daj znać jaki jest efekt.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 13 mar 2021, o 10:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-13T10:33:59+01:00</updated>
<published>2021-03-13T10:33:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231428#p231428</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231428#p231428"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231428#p231428"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Jakie masz ustawione próbkowanie analizatora?<br /></div><br /><br />Sample rate: 12MS/s<br /><br />Ale samo próbkowanie to jedno. Drugą kwestią jest to, że widać ten efekt poprzez migotanie LED.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 13 mar 2021, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2021-03-13T07:19:19+01:00</updated>
<published>2021-03-13T07:19:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231426#p231426</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231426#p231426"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231426#p231426"><![CDATA[
Jakie masz ustawione próbkowanie analizatora?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 13 mar 2021, o 07:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-12T23:23:01+01:00</updated>
<published>2021-03-12T23:23:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231424#p231424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231424#p231424"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231424#p231424"><![CDATA[
<div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br />Szukasz błędu nie tam gdzie trzeba.<br />To na pewno nie if'y są przyczyną twoich problemów.<br /></div><br />Właśnie chyba nie do końca. Taki oto kod:<br />[syntax=c]while (1) {<br />if(!test) {<br />wylaczPrzekaznik1();<br />_delay_us(50);<br />wlaczPrzekaznik1();<br />test=1;<br />}<br /><br />if (!test1) {<br />wylaczPrzekaznik2();<br />_delay_us(50);<br />wlaczPrzekaznik2();<br />test1 = 1;<br />}<br />}[/syntax]<br />Daje taki output. Nie wiem dlaczego, co jakiś czas następuje zmiana kolejności wykonywania ifów (pomarańczowa ramka). <br /><a href="https://obrazkiforum.atnel.pl/766/b1b8a1c4baced1b432d7844b53708ea3.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/766/b1b8a1c4baced1b432d7844b53708ea3.png" alt="Obrazek" /></a><br />Ta zmiana kolejności wykonywania ifów w rzeczywistości powoduje migotanie LED. Dlaczego ta zamiana występuje ? Zawsze wykonywane są oba ify, tylko czasami następuje zmiana kolejności ich wykonywania.<br />Takie zachowanie też tłumaczy dlaczego migotania nie ma gdy funkcje odczytTemperatury(); i wyswietl(); umieszczone są w jednym ifie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 12 mar 2021, o 23:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-11T19:58:50+01:00</updated>
<published>2021-03-11T19:58:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231410#p231410</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231410#p231410"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231410#p231410"><![CDATA[
Szukasz błędu nie tam gdzie trzeba.<br />To na pewno nie if'y są przyczyną twoich problemów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 11 mar 2021, o 19:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-11T19:18:24+01:00</updated>
<published>2021-03-11T19:18:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231407#p231407</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231407#p231407"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231407#p231407"><![CDATA[
<div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br />A nie zrobiłeś przypadkiem ISR wewnątrz pętli while() ?<br /></div><br />Nie. Nie zrobiłem ISR wewnątrz pętli. <strong>W moim pierwszym poscie jest błąd</strong>. Ostatnia klamra powinna być nad ISR. Sorry ale chciałem umieścić, to co najistotniejsze i źle usunąłem klamry.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 11 mar 2021, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2021-03-11T18:39:49+01:00</updated>
<published>2021-03-11T18:39:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231402#p231402</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231402#p231402"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231402#p231402"><![CDATA[
A nie zrobiłeś przypadkiem ISR wewnątrz pętli while() ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 11 mar 2021, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-10T23:35:24+01:00</updated>
<published>2021-03-10T23:35:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231398#p231398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231398#p231398"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231398#p231398"><![CDATA[
&quot;A jakie wartości mają nadane zmienne test i test1?&quot; Nawet jak przypiszę wartości test=0 i test1=0 to nic nie zmienia. Nadal jak funkcje są w osobnych ifach to jest migotanie wyświetlaczy.<br /><br />Oto wywoływane funkcje:<br />void odczytajTemperatury(void): <br />W jednym przerwaniu ~2.5ms wykonywany jest jeden case (zwykle case skłąda się z: wysłanie polecenia -&gt; zmiana czujnika -&gt; wysłanie polecenia).<br />Kiedyś mierzyłem i każdy case mieścił się w 2.5ms. Chyba będę musiał jeszcze raz to pomierzyć, jeżeli nikomu nic nie przyjdzie do głowy.<br /><br />[syntax=c]void odczytajTemperatury(void) { // podzielona na case aby byla szansa wyslania/odebrania instrukcji w czasie przerwania tj.~2.5ms<br />static uint8_t czujnik = DS_ZRODLO;<br />static uint8_t daneZCzujnuka&#91;9&#93;;<br />static int16_t temperatura&#91;2&#93; = {BLAD_CZUJNIKA, BLAD_CZUJNIKA};<br />static int16_t zmiennaPomocnicza;<br />static int8_t czyKonwertowac = 1;<br /><br />switch (procedura) {<br />case RESET:<br />resetDS(czujnik);<br />zmienCzujnikPowtorzProcedure(&amp;czujnik);<br />break;<br /><br />case SKIP:<br />wyslijBajt(DS_SKIP, czujnik);<br />zmienCzujnikPowtorzProcedure(&amp;czujnik);<br />break;<br /><br />case KONWERT_POLECENIE:<br />if (czyKonwertowac == 1) {<br />wyslijBajt(DS_CONVERT, czujnik);<br />pasozytStart(czujnik);<br />zmienCzujnikPowtorzProcedure(&amp;czujnik);<br />} else {<br />procedura = ODCZYT_POLECENIE;<br />}<br />break;<br /><br />case KONWERSJA_CZAS:<br />if (++zmiennaPomocnicza &gt; 400) { // czekamy na konwert ~400x2.5ms = 1000 ms)<br />zmiennaPomocnicza = 0;<br />czyKonwertowac = 0;<br />procedura = RESET;<br />}<br />break;<br /><br />case ODCZYT_POLECENIE:<br />wyslijBajt(DS_READ_SCRATCHPAD, czujnik);<br />zmienCzujnikPowtorzProcedure(&amp;czujnik);<br />break;<br /><br />case ODCZYTUJ:<br />daneZCzujnuka&#91;zmiennaPomocnicza&#93; = odczytajBajt(czujnik); // daneWyjsciowe dopoki....<br />if (++zmiennaPomocnicza &gt; 8) { //.... daneWyjscioweasz 9 bajtow , wtedy przejdz do obliczen<br />uint8_t indeksTablica = czujnik == DS_ZRODLO ? ZRODLO : ODBIOR;<br />if (crc8(&amp;daneZCzujnuka&#91;0&#93;, 9) == 0) {//jezeli CRC sie zgadza<br />temperatura&#91;indeksTablica&#93; = (daneZCzujnuka&#91;0&#93; | (daneZCzujnuka&#91;1&#93; &lt;&lt; 8)) * MIEJSCA_PO_PRZECINKU &gt;&gt; 4;<br />} else {<br />temperatura&#91;indeksTablica&#93; = BLAD_CZUJNIKA; // blad CRC- konkretnego czujnika<br />}<br />zmiennaPomocnicza = 0;<br />zmienCzujnikPowtorzProcedure(&amp;czujnik);<br />}<br />break;<br /><br />case POLICZ:<br />temperaturyBledy(temperatura);<br />czyKonwertowac = 1;<br />procedura = RESET;<br />break;<br />}<br />}<br /><br />static void zmienCzujnikPowtorzProcedure(uint8_t *czujnik) {<br />if (*czujnik == DS_ZRODLO) {<br />*czujnik = DS_ODBIOR;<br />} else {<br />*czujnik = DS_ZRODLO;<br />procedura++;<br />}<br />}[/syntax]<br /><br />Oraz funkcja wyswielt(): Wysiwetlacz to jest taki moduł do którego wysyłamy 2 bajty. PIerwszy bajt aktywuje dany wyświetlacz a drugi bajt to dane na ten wyświetlacz.<br />[syntax=c]static inline void wyswielt(void) {<br />static uint8_t wyswietlacz = 0;<br />spiSend16bits(daneSpi(wyswietlacz));<br />if (++wyswietlacz &gt; 7) {<br />wyswietlacz = 0;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 10 mar 2021, o 23:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2021-03-10T15:48:03+01:00</updated>
<published>2021-03-10T15:48:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231389#p231389</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231389#p231389"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231389#p231389"><![CDATA[
A jakie wartości mają nadane zmienne test i test1?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 10 mar 2021, o 15:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Draxter32]]></name></author>
<updated>2021-03-10T11:49:56+01:00</updated>
<published>2021-03-10T11:49:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231384#p231384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231384#p231384"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231384#p231384"><![CDATA[
Zbyt dużo czasu mikrokontroler spędza w procedurze odczytajTemperatury(). Można zrobić profilingm, aby to sprawdzić. Być może procedura ta blokuje multiplexowanie (bo chyba, w taki sposób obsługiwany jest wyświetlacz). Proszę powiedzieć coś więcej o odczytajTemperatury();<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8185">Draxter32</a> — 10 mar 2021, o 11:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-03-10T10:37:32+01:00</updated>
<published>2021-03-10T10:37:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231383#p231383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231383#p231383"/>
<title type="html"><![CDATA[Re: Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231383#p231383"><![CDATA[
Nie wiem, ale coś może być w tych funkcjach. ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 10 mar 2021, o 10:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2021-03-09T20:59:47+01:00</updated>
<published>2021-03-09T20:59:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231380#p231380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231380#p231380"/>
<title type="html"><![CDATA[Timery , podstawa czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23655&amp;p=231380#p231380"><![CDATA[
Witam,<br />Mam taki oto kod - dlaczego w tym przypadku wyświetlacz LED (8xLED) miga ?<br />[syntax=c]main() {<br />volatile uint8_t test, test1;<br />TCCR0A |= (1 &lt;&lt; WGM01);<br />TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00); // 1024<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />OCR0A = 20; //20-&gt; 2.5ms<br />sei();<br />....<br />while (1) {<br />if(!test) {<br />wyswietl();<br />test=1;<br />}<br /><br />if (!test1) {<br />odczytajTemperatury();<br />test1 = 1;<br />}<br />.....<br />ISR(TIM0_COMPA_vect) {<br />uint16_t x;<br />x = test;if (x)test = --x;<br />x = test1;if (x)test1 = --x;<br />      }<br />}[/syntax]<br /><br />a w takim przypadku nie miga:<br />[syntax=c]main() {<br />volatile uint8_t test, test1;<br />TCCR0A |= (1 &lt;&lt; WGM01);<br />TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00); // 1024<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />OCR0A = 20; //20-&gt; 2.5ms //OCR0A = 78; //dla 10ms wychodzi 78 bo 8MHz/preskaler(1024)/odsiwezanie(100Hz)<br />sei();<br />....<br />while (1) {<br />if(!test) {<br />wyswietl();<br />                odczytajTemperatury();<br />test=1;<br />}<br />.....<br />ISR(TIM0_COMPA_vect) {<br />uint16_t x;<br />x = test;if (x)test = --x;<br />      }<br />}[/syntax]<br /><br />Dlaczgo jak wyswietl(); i  odczytajTemperatury(); są wywoływane w osobnych ifach (pierszy kod) to LED miga ?<br />A gdy wyswietl(); i  odczytajTemperatury(); są wywoływane w jednym ife (drugi kod) to LED nie miga ?<br />Dzięki za odpowiedzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 9 mar 2021, o 20:59</p><hr />
]]></content>
</entry>
</feed>