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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-03-04T23:41:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2496&amp;mode</id>
<entry>
<author><name><![CDATA[jp_elek]]></name></author>
<updated>2013-03-04T23:41:49+01:00</updated>
<published>2013-03-04T23:41:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29856#p29856</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29856#p29856"/>
<title type="html"><![CDATA[Re: Soft_timer x 16 użyteczny ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29856#p29856"><![CDATA[
Dzięki,<br /> Ale w nauce o to właśnie chodzi aby próbować różnego podejścia ,<br /> bo z czasem z pewnością znajdą się jakieś ,może tylko ogólne reguły,<br /> ale zawsze sugerujące mniej i bardziej wydajne sposoby zapisu funkcji,<br /> aby uzyskać podobny efekt , ale za niższą cenę...<br />  dlatego nie obiecuję jeszcze długo&quot; weryfikacji asemblerowej&quot;.<br /> Teraz zamierzam wypraktykować jak zmusić C do użycia np. takiego<br />najszybszego wyboru czy i jaką obsługę wykonać:<br />jakaś tablica wskaźników do funkcji {po kolei po 16 bitów , obsługa zakończenia zliczania Timera0, Timera1...Timera15}<br /><br />a. ładujemy tablicę wskaźników do obsługi np. Tm_Service[16]<br />b. Ładujemy słowo stanu np. Tm_Off -- te które właśnie zakończyły zliczanie<br />c . banalny kod w asemblerze zużyje kilkanaście do 30 cykli<br />np.    lds r16,Tm_Off       // Low byte stanu zakończonego zliczania<br />        sbrc r16,0 <br />          call(rcall) Tm_Service[Timer0]<br />       sbrc r16,1<br />          call (rcall) Tm_Service[Timer1]<br /><br />i tak do ostatniego timera z przeładowaniem r16 na górny bajt słowa stanu po sprawdzeniu pierwszych ośmiu<br />oczywiście dodam jeszcze sprawdzenie iż wskaźnik nie jest zerowy, choć w zdefiniowanym już zakresie używania można po prostu wybrać tylko te które posiadają obsługę, chyba że zaszalejemy ze zróżnicowaną przez kontekst obslugą , <br /> no to nie da się oszczedzić tych paru cykli na sprawdzenie wskaźnika  <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=809">jp_elek</a> — 4 mar 2013, o 23:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-03-04T23:06:19+01:00</updated>
<published>2013-03-04T23:06:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29854#p29854</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29854#p29854"/>
<title type="html"><![CDATA[Re: Soft_timer x 16 użyteczny ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29854#p29854"><![CDATA[
Tak to jeszcze inne ale równie ciekawe podejście i zresztą bardzo cenne - do tworzenia tzw &quot;timerów programowych&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Widzę że kolega jeszcze wciąż stara się porównywać C do asemblera - ale jak widzi kolega - szybko się okaże, że w 99% przypadków będzie można się tego pozbyć, i zająć się już tylko czystym i wygodnym programowaniem w C - bo dobrze sobie radzi z translacją na asemblera <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> — 4 mar 2013, o 23:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jp_elek]]></name></author>
<updated>2013-03-04T22:42:04+01:00</updated>
<published>2013-03-04T22:42:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29851#p29851</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29851#p29851"/>
<title type="html"><![CDATA[Soft_timer x 16 użyteczny ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2496&amp;p=29851#p29851"><![CDATA[
Witam <br />Jeśli ktoś by potrzebował dość znośnego timera sprzętowego ...<br />.. to pierwszy użyteczny programik w C.<br />Ponieważ jestem ledwie początkujący w C , postanowiłem sprawdzić jak to wychodzi w C ,<br /> w zestawieniu do asemblera , po raz pierwszy jestem mile zaskoczony , różnica<br />między szybko napisanym kodem w .asm a implementacją w C wynosi zaledwie dwa cykle zegara na korzyść<br />asemblera  w stosunku do C {266/264 cykle dla wykonania bez żadnego aktywnego timera } <br />oraz również dwa cykle na korzyść asemblera dodatkowo na każdy aktywny-zliczany w danej chwili trimer<br />{14/12 cykli dodatkowo na każdy aktywny timer( te dwa cykle tutaj to już nieco więcej bo ~15%}<br /> Uwaga : timer posiada &quot;na zewnątrz&quot; oprócz liczników dwa 16 bitowe  słowa stanu :<br />Tm_Off - którego ustawione bity od b0 do b15 wskazują przez jeden cykl , który timer zakończył liczenie<br />Tm_ON - którego ustawione bity od b0 do b15 wskazują timery których stan jest różny od zera - jeszcze liczą<br /><br />  Zamiarem było stworzenie szybkiego wzorca ,który umożliwia dołączenie niezależnej obsługi  dla każdego timera<br />w osobnym przerwaniu wymuszonym programowo , po kolei lub osobno.<br />Zawsze znajdzie się niewykorzystane przerwanie sprzętowe , pod które można podwiesić obsługę &quot;wyliczonych &quot;<br />timerów . Użycie osobnych przerwań ułatwia unikanie długotrwałego blokowania przerwań o wyższym priorytecie.<br />   Jeśli komuś się przyda , bardzo proszę ,<br />Jako początkujący jestem gotów na każde gromy i uwagi , <br />Dziękuję J.P.<br />[syntax=c]<br /><br />/*========================================================================================<br /> * Timer 16 soft timerów , info :<br /> * o zakończeniu zliczania w  T_Off == na czas jednego tyknięcia timera<br /> * o trwającym zliczaniu w    T_ON  == tylko na czas zliczania<br /> *<br /> *wymaga definicji :<br /> *tablicy liczników 16 bitowych uint16_t[16] Tm_cnt<br /> *słowa stanów &quot;Zakończyły liczenie&quot; uint16_t Tm_Off<br /> *słowa stanów &quot;Timer aktywny &quot;      uint16_t Tm_ON<br /> *ustawione bity b0 do b15 w słowie stanu wskazują bezposrednio aktywny timer<br /> *są automatycznie zerowane/ aktualizowane po każdym &quot;tyknięciu zegara&quot;<br /> =========================================================================================*/<br />void Tm_Serv_F(void){// 266 cykli zawsze + 12 cykli na każdy zliczjący timer= max 456 cykli<br />register uint8_t cnt,num=0;<br />register uint16_t mask=1,T_Off=0,T_ON=0;<br />uint16_t *Tm_Num;// wskaźnik do<br />Tm_Num = Tm_cnt;// pobierz adres tablicy liczników timerów - 2<br /><br />for (cnt=0;cnt&lt;16;cnt++){// 16 to liczba timerów , jeśli zmienisz na mniej niż 8 to słowa stanu wystarczą 8 bitowe<br />if (*Tm_Num){<br />Tm_cnt[cnt]--;<br />if(!(Tm_cnt[cnt])){// zakończenie liczenia do Tm_Out<br />T_Off |=(T_Off|mask);// tylko na jeden Tick podstawy czasu<br />}<br />else{// trwające zliczanie do Tm_ON<br />T_ON |= (T_ON|mask);// przez cały czas zliczania<br />}<br />}<br />mask=(mask&lt;&lt;1);<br />num++;<br />Tm_Num++;<br />}<br />Tm_Out = T_Off;<br />Tm_ON = T_ON;<br />}<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=809">jp_elek</a> — 4 mar 2013, o 22:42</p><hr />
]]></content>
</entry>
</feed>