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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-25T16:30:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17439&amp;mode</id>
<entry>
<author><name><![CDATA[agreitakj]]></name></author>
<updated>2017-01-25T16:17:49+01:00</updated>
<published>2017-01-25T16:17:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180797#p180797</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180797#p180797"/>
<title type="html"><![CDATA[Re: LCD HD44780 przez rejestr przesuwny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180797#p180797"><![CDATA[
Przecież są zapisane w systemie szestnastkowym:<br />hex:      dec:    bin:<br />0x80     128     10000000<br />0x20       64     00100000<br />0x10       16     00010000<br />0x08        8      00001000<br />0x04        4      00000100<br />0x02        2      00000010<br />0x01        1      00000001<br /><br />Każda z tych wartości reprezentuję bajt który należy wysłać do rejestru przesuwnego by ten ustawił jedynkę na danym pinie.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />Zapomniałem zapisać:<br />prototyp funkcji: REJ_WYSYL(uint8_t PIN, uint8_t UstawCzyZeruj) - w pierwszym argumencie podajemy pin/piny, w drugim 1 - jeśli chcemy port ustawić, lub 0 - zerować.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12559">agreitakj</a> — 25 sty 2017, o 16:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Bartek123]]></name></author>
<updated>2017-01-25T15:53:03+01:00</updated>
<published>2017-01-25T15:53:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180792#p180792</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180792#p180792"/>
<title type="html"><![CDATA[Re: LCD HD44780 przez rejestr przesuwny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180792#p180792"><![CDATA[
Tak na pierwszt zut oka zastanawia mnie definicja pinów lcd w pliku hd4470.h  są zapisane w 8emkowym nie powinny być w szesnastkowym?<br />nie powinno być 0x16, 0x32 albo coś w tym stylu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10617">Bartek123</a> — 25 sty 2017, o 15:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[agreitakj]]></name></author>
<updated>2017-01-25T16:30:54+01:00</updated>
<published>2017-01-25T15:28:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180783#p180783</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180783#p180783"/>
<title type="html"><![CDATA[LCD HD44780 przez rejestr przesuwny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17439&amp;p=180783#p180783"><![CDATA[
Witajcie, realizuję ostatnio niewielki projekt, głównie w celach edukacyjnych, by więc z jego pomocą nauczyć się jak najwięcej postanowiłem go nieco utrudnić - mimo pozostawienia na płytce wielu wolnych pinów, wykorzystałem rejestr przesuwny do sterowania wyświetlaczem (HD44780). Znalazłem kilka gotowych projektów, jednak ich użycie byłoby sprzeczne z przyświecającymi mi ideałami. W czasie realizowania napotkałem kilka problemów, lecz powoli zbliżałem się do celu, niestety, na razie utknąłem i jestem zmuszony naginać swoje zasady.  Oto kod:<br /><br />main.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;hd44780.h&quot;     //moja funkcja<br /><br />int main(void)<br />{<br />LCD_INIT();<br /><br />char a&#91;&#93;=&quot;WITAJ SWIECIE!!!&quot;;<br /><br />LCD_TEKST(a);      //to &quot;działa&quot;<br />//_delay_ms(100); //instrukcja która z pozoru nie ma znaczenia dla całości i w dodatku występująca po obsłużeniu <br />                           //ekranu, jednakże gdy ją odremujemy LCD krzaczy.<br />while(1){}<br />}[/syntax]<br /><br />hd33780.h:<br />[syntax=c]//równoległe wyjścia rejestru przesuwnego // Q1 nieużywane<br />#define LCD_RS 0x80     //Q0<br />#define LCD_E 0x20      //Q2<br />#define LCD_DB4 0x10    //Q3<br />#define LCD_DB5 0x08    //Q4<br />#define LCD_DB6 0x04    //Q5<br />#define LCD_DB7 0x02    //Q6<br />#define LCD_PODSW 0x01  //Q7<br /><br />void LCD_INIT(void);                                                    //inicjalizacja LCD<br />void LCD_KOMENDA(uint8_t instrukcja);                        //Wysyła komendę do LCD<br />void LCD_TEKST(char*);                                              //Wysyła tekst do wyświetlenia na ekranie<br />void LCD_WYSLIJ(char Bajt, uint8_t CzyKomenda);        //Dane do LCD. Bajt - bajt do wysłania,                                                                    //CzyKomenda: 1 - komenda, 0 - dane<br />void LCD_ENABLE_PULS(void);                                     //Zegar Enable, włącza i wyłącza linie Enable<br />void REJESTR_BEZP(uint8_t PIN,uint8_t UstawCzyZeruj);        //Bezpośredni dostęp do rejestru[/syntax]<br /><br />hd44780.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;hd44780.h&quot;<br />#include &quot;rejestr_przesuwny.h&quot;<br /><br />void LCD_INIT(void)<br />{<br />REJ_INIT();          //inicjalizacja rejestru przesuwnego<br />_delay_ms(25);       //czas na ustabilizowanie sie napięc na LCD<br />REJ_WYSYL(0x10,1);   //tryb 4 bitowy  //jest to komenda składająca się tylko z jednego półbajtu, więc konieczne było bezpośrednie <br />LCD_ENABLE_PULS();   //odwołanie do rejestru oraz do funkcji LCD_ENABLE_PULS()<br /><br />LCD_WYSLIJ(0x28,1);  //tryb 4bitowy, 2 linie, 5x8 znaków<br />LCD_WYSLIJ(0x0E,1);  //DISP ON  CURSOR ON<br />LCD_WYSLIJ(0x06,1);  //ENTRY SET MODE: INCREMENT SHIFT CURSOR ON DATA WRITE<br />LCD_WYSLIJ(0x01,1);  //CLR<br />REJ_WYSYL(LCD_PODSW,1); //włącza podświetlenie LCD<br />}<br /><br /><br />void LCD_WYSLIJ(char odebrany_bajt, uint8_t CzyKomenda)<br />{<br />    if(CzyKomenda==1)          //ustawia stan niski (instrukcja) lub wysoki (dane do DDRAM) na RS<br />    REJ_WYSYL(LCD_RS,0);<br />    else<br />    REJ_WYSYL(LCD_RS,1);<br /><br />    //analiza pierwszego półbajtu:<br /><br />      if(odebrany_bajt &amp; 0b00010000) REJ_WYSYL(LCD_DB4,1); else REJ_WYSYL(LCD_DB4,0);<br />      if(odebrany_bajt &amp; 0b00100000) REJ_WYSYL(LCD_DB5,1); else REJ_WYSYL(LCD_DB5,0);<br />      if(odebrany_bajt &amp; 0b01000000) REJ_WYSYL(LCD_DB6,1); else REJ_WYSYL(LCD_DB6,0);<br />      if(odebrany_bajt &amp; 0b10000000) REJ_WYSYL(LCD_DB7,1); else REJ_WYSYL(LCD_DB7,0);<br />          LCD_ENABLE_PULS();<br /><br />    //analiza drugiego półbajtu:<br /><br />      if(odebrany_bajt &amp; 0b00000001) REJ_WYSYL(LCD_DB4,1); else REJ_WYSYL(LCD_DB4,0);<br />      if(odebrany_bajt &amp; 0b00000010) REJ_WYSYL(LCD_DB5,1); else REJ_WYSYL(LCD_DB5,0);<br />      if(odebrany_bajt &amp; 0b00000100) REJ_WYSYL(LCD_DB6,1); else REJ_WYSYL(LCD_DB6,0);<br />      if(odebrany_bajt &amp; 0b00001000) REJ_WYSYL(LCD_DB7,1); else REJ_WYSYL(LCD_DB7,0);<br />          LCD_ENABLE_PULS();<br />}<br /><br /><br />void LCD_TEKST(char str&#91;&#93;)  // jak widac funkcja ta wysyła 16 znaków (&quot;nieco&quot; paskudne rozwiązanie), jednak przy                                   //zastosowaniu while(str&#91;i&#93;)<br />{                                       //LCD wyświetla śmieci<br />unsigned char i=0;<br />while(i&lt;16){<br />LCD_WYSLIJ(str&#91;i&#93;,0);<br />++i;<br />}<br />}<br /><br />/*void LCD_KOMENDA(uint8_t instrukcja)    //dopóki jest w komentarzu LCD wyświetla napis inaczej nic nie działa i ekran wyrzuca śmieci<br />{<br />LCD_WYSLIJ(instrukcja,1);<br />}*/<br /><br />void LCD_ENABLE_PULS(void)                //zegar enable, po każdym bajcie wysłanym do rejestru ta funkcja jest uruchamiana.<br />{<br />REJ_WYSYL(LCD_E, 0);<br />_delay_ms(1);<br />REJ_WYSYL(LCD_E, 1);<br />_delay_ms(10);<br />REJ_WYSYL(LCD_E, 0);<br />}<br /><br />void REJESTR_BEZP(uint8_t PIN,uint8_t UstawCzyZeruj)   //bezposredni dostep do rejestru<br />{<br />REJ_WYSYL(PIN,UstawCzyZeruj);<br />}[/syntax]<br /><br />A to lista problemów:<br />- niemożność wykonania jakiejkolwiek instrukcji w pętli głównej.<br />- dziwne zachowanie funkcji sprawdzającej koniec tablicy znaków.<br />- kiedy do mojej biblioteki - HD44780.h dodam jakąkolwiek funkcję, choćby nieużywaną wszystko przestaje działać zupełnie jak w przypadku opisu pierwszego błędu. W przypadku taką funkcją jest LCD_KOMENDA(), wszystko jest w porządku tak długo jak jest ona zaremowana.<br />- po odłączeniu od układu zasilania i ponownym jego przyłączeniu ekran pozostaje pusty. Chociaż inicjalizacja (chyba) jest przeprowadzana poprawnie, sądząc po aktywnych dwóch liniach i tym, że jak wspomniałem pozostaje on pusty (instrukcja CLR), a może nie: nie widać kursora!<br /><br /><br />By nie zaśmiecać posta zdecydowałem się nie dodawać plików odpowiedzialnych za obsługę samego rejestru, to dlatego, że jestem absolutnie pewien jego poprawnego działania, wynika to z wielu testów. Kilka o nim informacji:<br />- inicjalizacja rejestru polega na przypisaniu mu zdefiniowanych w pliku nagłówkowym portów.<br />- REJ_WYSYL(uint8_t bajt) - wysyła bajt informacji informacji na rejestr oraz włącza zatrzask (STCP)<br /><br /><br /><br /><br />ps. <br />zdaję sobie sprawę, że analizę półbajtów można zrealizować w dalece bardziej elegancki sposób, obecne rozwiązanie zastosowałem  by uprościć odszukiwanie błędów, optymalizacją zamierzam zając się na końcu.<br /><br /><br />Za wszelkie próby pomocy/ podanie jakichkolwiek wskazówek dziękuję.<br /><br /><br />Pozdrawiam!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12559">agreitakj</a> — 25 sty 2017, o 15:28</p><hr />
]]></content>
</entry>
</feed>