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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-12T20:49:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7393&amp;mode</id>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-12T20:49:22+01:00</updated>
<published>2014-06-12T20:49:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84268#p84268</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84268#p84268"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84268#p84268"><![CDATA[
Sterownik już ogarnięty. Inlinowanie tych najbardziej niskopoziomowych funkcji skracało wykonanie kodu o kilka cykli. Co już było dla sterownika zbyt krótko. Po prostu nie spełniało to kryteriów czasowych wymaganych przez układ LC 7981.<br />Tak czy inaczej dorobiłem do biblioteki obsługę busy flag <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> A delay'e na poziomie 500ns muszę w pewnych miejscach pozostać.<br />Dorobię trochę funkcji i się podzielę. LC 7981 nie jest może jakiś bardzo popularny, ale można spotkać wyświetlacze z tym sterownikiem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 12 cze 2014, o 20:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T18:20:05+01:00</updated>
<published>2014-06-11T18:20:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84153#p84153</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84153#p84153"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84153#p84153"><![CDATA[
Teraz wygląda tak:<br />[syntax=c]inline void lcd_strobe(void)  {<br />// czekanie 3 cykle<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br /><br /><br /><br />// impuls na linii E<br />lcd_en_high();<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />lcd_en_low();<br />// koniec impulsu<br /><br /><br />//checking busy flag<br />lcd_rw_high();<br />LCD_DATA &amp;= ~(1&lt;&lt;7);<br />LCD_DATA_DDR &amp;= ~(1&lt;&lt;7);<br />while( (LCD_DATA_PIN &amp; (1&lt;&lt;7)) );<br />lcd_rw_low();<br />LCD_DATA_DDR |= (1&lt;&lt;7);<br /><br />}[/syntax]<br /><br />I oczywiście działa.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br /><div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Tyle pamiętam.... jak się rąbnołem w literce, to przepraszam... <br />Jak tym ,,gąbki nie wyciśniesz&quot; to zostaje głębokie przeprojektowanie lub asembler i ,,babranie się w bitach&quot; :-/<br /></div><br /><br />Jeju, ale tych atrybutów jest... Dobrze to wiedzieć. Ale ja zbym mało znam asemblera, żeby widzieć dokładnie istotę tych różnic.<br />Bo nawet jak nie piszemy w asm, to ostatecznie sposób pracy kompilatora się przekłada na to i trzeba wiedzieć, co do czego.<br />I tak jakoś (dzięki Mirkowi) nie przeraża mnie już widok pliku .lss <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Ale obecnie jestem niemal pewny, że po inline'owaniu funkcji lcd_strobe() stan wysoki na linii E pojawiał się zbyt szybko i transmisja się &quot;rozjeżdżała&quot;. Nie które bajty były odbierane poprawnie przez sterownik a niektóre nie.<br />Przyglądam się timeingom trasmisji z noty PDF:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1589/bcce3b1524c24d2085acbd334531c846.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1589/bcce3b1524c24d2085acbd334531c846.PNG" alt="Obrazek" /></a><br /><br />Czas po którym (przy zapisie) powinno pojawić się E to jest minimum 90ns po ustawieniu lini RS i RW<br />Zanik E minimum 10ns przez zmianą na liniach RS i RW.<br />Ale procesor chodzi na 10MHz więc jeden cykl trwa 100ns. Więc teoretycznie nie powinno to przeszkadzać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 18:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T17:52:02+01:00</updated>
<published>2014-06-11T17:52:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84145#p84145</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84145#p84145"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84145#p84145"><![CDATA[
Inline'owanie lcd_strobe() powoduje problem. Static usunąłem, on tam jest bo ta funkcja nie jest udostępniana poza poza plikiem. <br />Jak sądzę jest to związane właśnie z obsługą linii E. Widzę, że występują teraz poważne błędy w transmisji / odczycie danych przez sterownik.<br />Tak sobie myślę, że ten CALL (gdy nie ma inline) powoduje odsuniecie w czasie momentu w którym wystawiany jest sygnał E. I wtedy jest dobrze. Zapewne tam jest jakaś krytyczna zależność czasowa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 17:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-11T17:41:47+01:00</updated>
<published>2014-06-11T17:41:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84143#p84143</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84143#p84143"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84143#p84143"><![CDATA[
<div class="quotetitle">sq8dsr napisał(a):</div><div class="quotecontent"><br />Autor tak dziwnie makra zdefiniował, że wyglądają jak funkcje.<br /></div><br /><br />a no właśnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo jakby były dużymi literami napisane to od razu można byłoby się domyśleć że to proste makra i łatwiej myśleć o ich inline'owaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ale skoro to jednak takie makra proste to dziwne że jak dasz inline na siłę to coś nie działa.<br /><br />Próbowałeś np najpierw jedną z tych funkcji (najprosztą) zinlajnować i sprawdzić postępy ? poza tym wywalasz wtedy ten specyfikator static ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 cze 2014, o 17:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T17:28:26+01:00</updated>
<published>2014-06-11T17:28:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84138#p84138</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84138#p84138"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84138#p84138"><![CDATA[
To jest tylko makro.<br />[syntax=c]// Macros for (un)setting the control pins<br />#define lcd_rs_high() (LCD_CTRL |= (1 &lt;&lt; LCD_RS))//!&lt; Set the Register-Select pin high<br />#define lcd_rs_low() (LCD_CTRL &amp;= ~(1 &lt;&lt; LCD_RS))//!&lt; Set the Register-Select pin low<br /><br />#define lcd_rw_high() (LCD_CTRL |= (1 &lt;&lt; LCD_RW))//!&lt; Set the Read-Write-Select pin high<br />#define lcd_rw_low() (LCD_CTRL &amp;= ~(1 &lt;&lt; LCD_RW))//!&lt; Set the Register-Select pin low<br /><br />#define lcd_en_high() (LCD_CTRL |= (1 &lt;&lt; LCD_EN))//!&lt; Set the strobe pin high<br />#define lcd_en_low() (LCD_CTRL &amp;= ~(1 &lt;&lt; LCD_EN))//!&lt; Set the strobe pin low[/syntax]<br /><br />Biblioteka nie jest moja. Ja się staram ją nieco udoskonalić. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Autor tak dziwnie makra zdefiniował, że wyglądają jak funkcje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 17:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-11T16:54:13+01:00</updated>
<published>2014-06-11T16:54:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84129#p84129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84129#p84129"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84129#p84129"><![CDATA[
a co robią u ciebie takie funkcje jak np:<br /><br />lcd_rw_low();<br /><br />??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 cze 2014, o 16:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T16:45:09+01:00</updated>
<published>2014-06-11T16:45:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84128#p84128</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84128#p84128"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84128#p84128"><![CDATA[
Obecnie funkcje wyglądają tak:<br /><br />[syntax=c]static void lcd_strobe(void)  {<br />lcd_en_high();<br />lcd_en_low();<br /><br />//checking busy flag<br />lcd_rw_high();<br />LCD_DATA &amp;= ~(1&lt;&lt;7);<br />LCD_DATA_DDR &amp;= ~(1&lt;&lt;7);<br />while( (LCD_DATA_PIN &amp; (1&lt;&lt;7)) );<br />lcd_rw_low();<br />LCD_DATA_DDR |= (1&lt;&lt;7);<br /><br />}[/syntax]<br /><br />[syntax=c]static void lcd_write_command(uint8_t cmd, uint8_t data) {<br />lcd_rw_low();<br />lcd_rs_high();<br />LCD_DATA = cmd;<br />lcd_strobe();<br /><br />lcd_rs_low();<br />LCD_DATA = data;<br />lcd_strobe();<br /><br />}[/syntax]<br /><br />Ja widać nie ma inline... Gdy je zrobiłem jako INLINE wyświetlacz zaczął się niepoprawnie zachowywać.<br />Zuważyłem to przy działaniu funkcji clear. Która wykonuje po prostu zapisanie spacjami całego obszaru pamięci sterownika. Rozpoczynając od pozycji 0,0. Kasowanie nie dochodzi do końca. Kilkanaście ostatnich bajtów pozostaje nietkniętych.<br />Gdy funkcje są bez INLINE, tak jak powyżej, wszystko jest OK.<br />Ma to jakiś związek z czasem trwania stanu wysokiego na linii E. Gdy tam wstawię opóźnienie o 3 cykle zegara wszystko działa dobrze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 16:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-11T16:12:12+01:00</updated>
<published>2014-06-11T16:12:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84121#p84121</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84121#p84121"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84121#p84121"><![CDATA[
<div class="quotetitle">sq8dsr napisał(a):</div><div class="quotecontent"><br />Sprawdzam po prostu BF w pętli while<br /></div><br /><br />a, no to dokładnie najlepszy sposób niż delaje<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 cze 2014, o 16:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T15:55:03+01:00</updated>
<published>2014-06-11T15:55:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84117#p84117</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84117#p84117"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84117#p84117"><![CDATA[
To prawda, kod urośnie mocno. Bo to jest wołane przecież przy każdej okazji. CALL to chyba 5 cykli i RET kolejne 5 cykli. Więc 10 cykli cykli zegarowych. To jest jakieś 500 - 600 ns. Najdłuższe czasy reakcji tego sterownika są na poziomie 250ns. <br /><br />Te delay'e, szczególnie ten 30us, już usunąłem. Sprawdzam po prostu BF w pętli while. W trybie tekstowym (bo to ma własny tryb tekstowy, zresztą dość ciekawy) to nie jest tab bardzo odczuwalne, ale w trybie graficznym prędkość rysowania wzrosła masakrycznie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 15:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-11T15:35:43+01:00</updated>
<published>2014-06-11T15:35:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84115#p84115</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84115#p84115"/>
<title type="html"><![CDATA[Re: Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84115#p84115"><![CDATA[
No to są funkcje KOBYŁY i powiem ci że dodatkowy narzut CALL jest niczym przy ich budowie <br /><br />ale gdybyś się uparł to jest taki atrybut<br /><br />[syntax=c]void lcd_strobe(void) __attribute((always_inline));<br />void lcd_strobe(void) { ...[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 cze 2014, o 15:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-06-11T14:59:07+01:00</updated>
<published>2014-06-11T14:59:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84102#p84102</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84102#p84102"/>
<title type="html"><![CDATA[Funkcja INLINE w funkcji INLINE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7393&amp;p=84102#p84102"><![CDATA[
Witam<br /><br />Zagadnienie jak w temacie. <br />Staram się dopracować bibliotekę do obsługi wyświetlacza opartego o sterownik SANYO LC7981.<br />Biblioteka jest autorstwa Sebastian Schumb'a.<br /><br />W kodzie znajduję że tak powiem elementarne najbardziej niskopoziomowe fukcje odpowiadające za wysłanie komendy do sterownika oraz za &quot;pyknięcie&quot; linią E (wykonanie komendy).<br />Biblioteka nie posiadała obsługi flagi zajętości. Więc ją dorobiłem. <br />Jako, że jest to wyświetlacz graficzny, szybkość wykonywania operacji ma znaczenie dużo większe niż w przypadku 44780.<br />Dodatkowo przeglądając notę sterownika okazało się czasy wykonania komend są dość krótkie (ns), więc obecność delay'ow na poziomie 30 us w tak elementarnych funkcjach wydaje się nie na miejscu.<br /><br />Autor fukcje napisał tak:<br />[syntax=c]static inline void lcd_write_command(uint8_t cmd, uint8_t data) {<br />_delay_us(30);<br />lcd_rw_low();<br />lcd_rs_high();<br />LCD_DATA = cmd;<br />_delay_us(1);<br />lcd_strobe();<br /><br />lcd_rs_low();<br />LCD_DATA = data;<br />_delay_us(1);<br />lcd_strobe();<br /><br />}[/syntax]<br /><br />[syntax=c]static inline void lcd_strobe(void) {<br />lcd_en_high();<br />        _delay_us(1)<br />lcd_en_low();<br />}[/syntax]<br /><br />Jak widać fukcje są rodzaju INLINE i to zagnieżdżone.<br />Niestety w pliku lss nie zostały one rozwinięte. I wykonywany jest rozkaz call.<br />Wiem, że specyfikator INLINE nie jest dla kompilatora obligatoryjny i może on go nie zrealizować.<br />Funkcję strobe() (gdzie umieściłem sprawdzanie BF) oczywiście mogę literalnie (ręcznie) wkleić do lcd_write_command().<br /><br />Ale czy da się jakoś zmusić kompilator, żeby jednak wykonał kompilację z uwzględnieniem specyfikatora INLINE?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 11 cze 2014, o 14:59</p><hr />
]]></content>
</entry>
</feed>