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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-01T18:37:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=19080&amp;mode</id>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2017-09-01T18:37:09+01:00</updated>
<published>2017-09-01T18:37:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194352#p194352</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194352#p194352"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194352#p194352"><![CDATA[
Witam,<br /><br />tak sobie czytam ten wątek i mam pewne spostrzeżenia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />- zakładając, że korzystasz z gcc, musi być __asm volatile (...)  - &quot;__asm&quot; - z dwoma &quot;podłogami&quot; na początku, a &quot;volatile&quot; po spacji - wiadomo, co znaczy, tu chodzi konkretnie o to, aby kompilator, w swej &quot;nieograniczonej mądrości&quot; nie próbował tego optymalizować,<br />- w przypadku rdzeni Cortex, nie do końca jest sensowne liczenie cykli procesora - upraszczając, ze względu na różne czasy dostępu do różnych pamięci, instrukcje niekoniecznie muszą się wykonywać &quot;po kolei&quot; ( kol. <strong>bastik</strong> - poczytaj o instrukcjach dmb, dsb, isb ), więc jeśli już ktoś koniecznie chce robić pętle opóźniające w *.asm, to &quot;ma trochę pod górkę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />,<br />- pobór prądu przez timer jest pomijalny do poboru prądu przez rdzeń jako taki, więc jeśli już potrzebne są precyzyjne opóźnienia, to tego 'delaya' należy zrobić na timerze, można tu wykorzystać SysTicka - to jest peryferium &quot;rdzeniowe&quot;, więc jeśli chodzi o pobór prądu, jest praktycznie &quot;za darmo&quot;,<br />- dla dłuższych opóźnień można skorzystać z RTC, co ma o tyle sens, że RTC pobiera prądu &quot;tyle, co kot napłakał&quot; - nawet razem z generatorem LSI,<br />- zastrzegam, że nie piszę niczego poważnego w *.asm na Cortex-y, nie po to zrezygnowałem z '51, żeby nadal się &quot;w tym babrać&quot; i koledze <strong>bastik</strong> też to polecam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />,<br /><br />Pozdrawiam serdecznie, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 1 wrz 2017, o 18:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2017-09-01T18:10:29+01:00</updated>
<published>2017-09-01T18:10:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194351#p194351</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194351#p194351"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194351#p194351"><![CDATA[
A jakiego używasz kompilatora? Łatwiej chyba będzie pomóc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 1 wrz 2017, o 18:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bastik]]></name></author>
<updated>2017-08-31T17:11:21+01:00</updated>
<published>2017-08-31T17:11:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194295#p194295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194295#p194295"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194295#p194295"><![CDATA[
Próbowałem różnych wariantów i tylko ten bez spacji działa. <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=8145">bastik</a> — 31 sie 2017, o 17:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-08-31T15:51:43+01:00</updated>
<published>2017-08-31T15:51:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194285#p194285</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194285#p194285"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194285#p194285"><![CDATA[
Chyba zabrakło spacji między __asm__ i volatile.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 31 sie 2017, o 15:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bastik]]></name></author>
<updated>2017-08-31T14:23:59+01:00</updated>
<published>2017-08-31T14:23:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194281#p194281</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194281#p194281"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194281#p194281"><![CDATA[
Po wstawieniu [syntax=c]_asm_volatile[/syntax] jeden błąd zniknął, pojawiło się za to ostrzeżenie <div class="codetitle"><b>Code:</b></div><div class="codecontent">warning: implicit declaration of function &quot;_asm_volatile&quot; is invalid in C99</div><br />Niestety pozostał jeszcze jeden błąd:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent"> main.c(38): error:  #18: expected a &quot;)&quot;  &quot;BNE 1b   \n\t&quot; : &#91;loops&#93; &quot;r&quot; : (8*us) &quot;memory&quot; </div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8145">bastik</a> — 31 sie 2017, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-08-31T13:20:01+01:00</updated>
<published>2017-08-31T13:20:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194277#p194277</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194277#p194277"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194277#p194277"><![CDATA[
<div class="quotetitle">bastik napisał(a):</div><div class="quotecontent"><br />Czyli wartość zmiennej loops jest przekazywana do R0, dobrze rozumiem? A co daje tam wstawienie % ?<br /></div><br />Nie wiem jak w assemblerze wyglądają działania na zdefiniowanych zmiennych. Wydaję mi się, że znak %nazwa_zmiennej jest czymś takim jak w języku C *adres_zmiennej. Ten kod który podałem nie jest mojego autorstwa.<br /><br />Te błędy pewnie wynikają z nieprawidłowego dla twojego środowiska i kompilatora pisania wstawek. Spotkałem też gdzieś wstawki rozpoczynające następująco: __asm__ volatile.<br /><br /><br /><div class="quotetitle">bastik napisał(a):</div><div class="quotecontent"><br />Za pomocą timera2 mam zrobione opóźnienie w obsłudze przerwania od przycisku (dokładnie opóźnienie dla eliminacji drgań styków).<br /></div><br />Ciekaw jestem w jaki sposób wykorzystujesz ten timer. Czy wewnątrz obsługi przerwania wywołanego naciśnięciem przycisku, oczekujesz na zakończenie drgań styków? Chodzi mi o to czy w casie oczekiwania blokujesz chwilowo działanie programu?<br /><br />Jeżeli funkcję delay(czas) chciałbyś jednak zbudować w oparciu o timer, to dałoby radę za pomocą jednego timera obsłużyć przyciski jak i delay().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 31 sie 2017, o 13:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bastik]]></name></author>
<updated>2017-08-29T12:47:30+01:00</updated>
<published>2017-08-29T12:47:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194154#p194154</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194154#p194154"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194154#p194154"><![CDATA[
Fakt o tym zapomniałem że jeden obieg pętli, nie musi trwać jednego cyklu, mam parę pytań, znalazłem w necie poradniki podstaw asm ale widać słabo szukałem i nie znalazłem wyjaśnienia tego:<br /> [syntax=asm]&quot;MOV R0,%&#91;loops&#93;\n\t&quot;[/syntax]<br />Czyli wartość zmiennej loops jest przekazywana do R0, dobrze rozumiem? A co daje tam wstawienie % ?<br /><br />I ogólnie mam problem ze swoim testowym programem od diod <br />[syntax=c]#include &quot;stm32f10x.h&quot;<br />void delay_us_ASM(uint32_t us);<br /><br />int main(void){<br />RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPAEN;      /* uruchomienie portu A */<br />GPIOA-&gt;CRL |= GPIO_CRL_MODE7;                 /* wyjscie push-pull */<br />GPIOA-&gt;CRL &amp;= ~GPIO_CRL_CNF7;<br /><br />GPIOA-&gt;CRL |= GPIO_CRL_MODE7;                 /* wyjscie push-pull */<br />GPIOA-&gt;CRL &amp;= ~GPIO_CRL_CNF7;<br />RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPBEN;      <br />GPIOB-&gt;CRL |= GPIO_CRH_MODE9;              <br />GPIOB-&gt;CRL &amp;= ~GPIO_CRH_CNF9;<br />while(1){<br />        GPIOA-&gt;ODR |= GPIO_ODR_ODR7;<br />GPIOB-&gt;ODR |= GPIO_ODR_ODR9;<br /><br />delay_us_ASM (100000);<br /><br />GPIOA-&gt;ODR &amp;= ~GPIO_ODR_ODR7;<br />GPIOB-&gt;ODR &amp;= ~GPIO_ODR_ODR9;<br />}<br />}       <br />void delay_us_ASM(uint32_t us)<br />    {<br />       asm volatile  (<br />                      &quot;MOV R0,%&#91;loops&#93;\n\t&quot;<br />                      &quot;1:             \n\t&quot;<br />                      &quot;NOP            \n\t&quot;<br />                      &quot;NOP            \n\t&quot;<br />                      &quot;SUB R0, #1     \n\t&quot;<br />                      &quot;CMP R0, #0     \n\t&quot;<br />                      &quot;BNE 1b         \n\t&quot; : : &#91;loops&#93; &quot;r&quot; (8*us) : &quot;memory&quot;<br />     );<br />    }[/syntax]<br />No i wyskakuje mi błąd podczas kompilacji <br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">main.c(33): error:  #18: expected a &quot;)&quot; &quot;BNE 1b   \n\t&quot; : : &#91;loops&#93; &quot;r&quot; (8*us) : &quot;memory&quot;</div><br />Sprawdzałem średniki, nawiasy i niby wygląda wszystko że jest dobrze. <br /><br />Zamiast asm volatile dałem samo asm bo wcześniej miałem dodatkowy błąd:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">main.c(26): error:  #20: identifier &quot;asm&quot; is undefined</div><br /><br />Wygląda na to że nawet diodami nie potrafię mrygać <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8145">bastik</a> — 29 sie 2017, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-08-28T21:11:26+01:00</updated>
<published>2017-08-28T21:11:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194126#p194126</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194126#p194126"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194126#p194126"><![CDATA[
<div class="quotetitle">bastik napisał(a):</div><div class="quotecontent"><br />Mam jeszcze takie pytanie, jeżeli taktowanie rdzenia wynosi 64MHz czy okres wynosi ok. 15,6 ns, powiedzmy jak do tej mojej funkcji, jako argument przekażę 100 000 to w teorii to powinno się wykonywać ok 1,6ms, dobrze myślę ?<br /></div><br />W teorii czas wykonywania twojej funkcji zależy od tego jak zostanie ona skompilowana. (Czy wiesz co to są instrukcje kodu maszynowego procesora?) Ty założyłeś że jeden obieg pętli for() będzie się wykonywał przez 1 cykl zegara taktującego. I przy takim założeniu twoje obliczenia się zgadzają, ale w rzeczywistości pętla for() wykonuje się pewnie przez kilka cykli zegara (np. mogą to być 2 instrukcje procesora: dekrementacja zmiennej i skok warunkowy, gdzie każda z tych instrukcji wykonuje się określoną w dokumentacji ilość cykli zegara).<br /><br />Nie wiemy tak bezpośrednio jak kompilator przetłumaczy sobie język C na język maszynowy (assembler). Warto dlatego użyć w naszym kodzie pisanym w języku C, wstawki napisanej w języku Asemblera. Dzięki temu wiemy dokładnie ile cykli będzie wykonywać się pętla opóźniająca. Przetestuj sobie działanie funkcji zawierającej wstawkę ASM którą podaje poniżej:<br />[syntax=c]void delay_us_ASM(uint32_t us)<br />    {<br />            asm volatile (<br />                    &quot;MOV R0,%&#91;loops&#93;\n\t&quot;<br />                    &quot;1:             \n\t&quot;<br />                    &quot;NOP            \n\t&quot;<br />                    &quot;NOP            \n\t&quot;<br />                    &quot;SUB R0, #1     \n\t&quot;<br />                    &quot;CMP R0, #0     \n\t&quot;<br />                    &quot;BNE 1b         \n\t&quot; : : &#91;loops&#93; &quot;r&quot; (8*us) : &quot;memory&quot;<br />            );<br />    }[/syntax]<br />Może mrugaj czymś z częstotliwością 1s: delay_us_ASM(1000000), i daj znać jak działa. <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=1760">wojtekr51</a> — 28 sie 2017, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bastik]]></name></author>
<updated>2017-08-28T19:42:16+01:00</updated>
<published>2017-08-28T19:42:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194123#p194123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194123#p194123"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194123#p194123"><![CDATA[
Za pomocą timera2 mam zrobione opóźnienie w obsłudze przerwania od przycisku (dokładnie opóźnienie dla eliminacji drgań styków). Mam jeszcze takie pytanie, jeżeli taktowanie rdzenia wynosi 64MHz czy okres wynosi ok. 15,6 ns, powiedzmy jak do tej mojej funkcji, jako argument przekażę 100 000 to w teorii to powinno się wykonywać ok 1,6ms, dobrze myślę ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8145">bastik</a> — 28 sie 2017, o 19:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-08-28T18:56:29+01:00</updated>
<published>2017-08-28T18:56:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194118#p194118</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194118#p194118"/>
<title type="html"><![CDATA[Re: [STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194118#p194118"><![CDATA[
Zobacz mój post w którym przedstawiłem pętlę opóźniającą: <a href="http://forum.atnel.pl/topic17576.html"  class="postlink">http://forum.atnel.pl/topic17576.html</a><br />Opóźnienie jest realizowane też przez wykonywanie pętli, ale napisanej w języku asemblera. Czas wykonywania jednego obiegu jest dokładnie obliczony. Jeżeli twoja częstotliwość taktowania rdzenia jest inna niż 32MHz to musiałbyś zmodyfikować podaną tam wstawkę ASM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 28 sie 2017, o 18:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bastik]]></name></author>
<updated>2017-08-28T15:07:30+01:00</updated>
<published>2017-08-28T15:07:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194107#p194107</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194107#p194107"/>
<title type="html"><![CDATA[[STM32F1] Dokładna pętla opóźniająca]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19080&amp;p=194107#p194107"><![CDATA[
Witam<br /><br />Mam do was takie pytanie czy taką pętlę opóźniającą:<br />[syntax=c]void Delay(uint32_t nCount)<br />{<br />  for(; nCount != 0; nCount--);<br />}[/syntax]<br />Można zastąpić czymś bardziej &quot;profesjonalnym&quot;? <br />Potrzebuję wysłać dalej jeden z programów, które opracowałem do projektu. No i w tym programie ogólnie bawiłem się częstotliwością taktowania, sprawdzając przy tym ile prądu zużywa procesor (sterowanie wyświetlaczem 2x16 ze sterownikiem HD44780). Oczywiście żeby było jak najbardziej energooszczędnie starałem się wykorzystać jak najmniej bloków funkcjonalnych (timer2), wykorzystanie linii jedynie z szyny A i tak dalej. Ogólnie rozchodzi mi się o to czy da się opracować taką pętle, która będzie może bardziej dokładna (chodzi o czas wykonania), czy ta jest jednak ok i ja wydziwiam? <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Wiem, że przy wykorzystaniu HSI to o dokładności mogę pomarzyć, ale może da się coś ulepszyć w tym rozwiązaniu.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8145">bastik</a> — 28 sie 2017, o 15:07</p><hr />
]]></content>
</entry>
</feed>