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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-05T19:05:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13120&amp;mode</id>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-05T19:05:44+01:00</updated>
<published>2015-10-05T19:05:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141563#p141563</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141563#p141563"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141563#p141563"><![CDATA[
@anshar - Wielkie dzięki! Z Twoją pomocą program zaczął w końcu działać. Niestety jednak nie do końca rozumiem dlaczego. Wiem, że problemem okazała się być funkcja lcd_read_half(). Nie wiem jednak dlaczego moja wersja tej funkcji była niepoprawna.<br />Moja wersja:<br />[syntax=c]static inline uint8_t lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />uint8_t _odczyt = (PIND &amp; 0x0F);<br />return _odczyt;<br />}[/syntax]<br /><br />Wersja @anshar'a:<br />[syntax=c]static inline uint8_t lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />uint8_t _odczyt = 0;<br />if(PIND &amp; 0x0F) _odczyt |= PIND;<br />return _odczyt;<br />}[/syntax]<br /><br />Różnica jest taka, że ja w swojej funkcji zeruję 4 najstarsze bity zmiennej _odczyt (gdyż tak na prawdę interesują nas tylko 4 najmłodsze bity, bo odczytujemy tu połowę bajtu), a @anshar zostawia te bity. Co to zmienia?<br /><br />Oprócz tego nie rozumiem<br /><br />dlaczego w funkcji lcd_init występuje ustawienie portu D z sumą logiczną.<br />Moja wersja:<br />[syntax=c]DDRD = 0b01111111;[/syntax]<br /><br />Wersja @anshar'a:<br />[syntax=c]DDRD |= 0b01111111;[/syntax]<br /><br /><br />Dzięki za podział na pliki. Chciałem to zrobić na koniec kiedy już mój sterownik będzie kompletny. Dodam jeszcze kilka funkcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 5 paź 2015, o 19:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-10-05T17:39:43+01:00</updated>
<published>2015-10-05T17:39:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141550#p141550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141550#p141550"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141550#p141550"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Błąd ukryty jest więc gdzieś indziej. Mam nadzieję, że Koledzy pomożecie mi go znaleźć.<br /></div><br /><br />Po kilku poprawkach (postaraj się je znaleźć samemu - porównaj z Twoim kodem):<br /><br />[syntax=c]//Przyjmę, że wyświetlacz jest podłączony do portu D (PD6 - PD0 : RS, RW, E, D7, D6, D5, D4)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//MAKRODEFINICJE:<br />#define SET_RS PORTD |= (1 &lt;&lt; 6)<br />#define CLR_RS PORTD &amp;= ~(1 &lt;&lt; 6)<br />#define SET_RW PORTD |= (1 &lt;&lt; 5)<br />#define CLR_RW PORTD &amp;= ~(1 &lt;&lt; 5)<br />#define SET_E PORTD |= (1 &lt;&lt; 4)<br />#define CLR_E PORTD &amp;= ~(1 &lt;&lt; 4)<br />//END MAKRODEFINICJE<br /><br />//KOMENDY LCD (przesyłane poprzez lcd_write_cmd)<br />#define LCDC_CLS0x01//czyści wyświetlacz<br />#define LCDC_HOME0x02//kursor w pozycji początkowej<br />#define LCDC_ENTRY0x04//ustawia bit D2 w celu zmiany trybu Entry Mode Set (z tabeli LCD)<br />#define LCDC_ENTRYR0x02//przesuwanie kursora (lub okna) w prawo (wymaga LCDC_ENTRY)<br />#define LCDC_ENTRYL0//przesuwanie w lewo<br />#define LCDC_MODEMOVE0x01//kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_ENTRY)  -- to samo co LCDC_SHIFTDISP ?<br />#define LCDC_ON0x08//ustawia bit D3 w celu zmiany trybu Dispaly On/Off (z tabeli LCD)<br />#define LCDC_DISPLAYON0x04//włącza wyświetlacz (wymaga LCDC_ON)<br />#define LCDC_CURSORON0x02//włącza kursor (wymaga LCDC_ON)<br />#define LCDC_BLINKON0x01//włącza miganie kursora (wymaga LCDC_ON)<br />#define LCDC_SHIFT0x10//ustawia bit D4 w celu zmiany trybu Cursor/Display Shift (tabela LCD)<br />#define LCDC_SHIFTDISP0x08//kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_SHIFT)  -- to samo co LCDC_MODEMOVE ?<br />#define LCDC_SHIFTR0x04//przesuwanie kursora w prawo (wymaga LCDC_SHIFT)<br />#define LCDC_SHIFTL 0//przesuwanie kursora w lewo (wymaga LCDC_SHIFT)<br />#define LCDC_FUNC0x20//ustawia bit D5 w celu zmiany trybu Function Set (tabela LCD)<br />#define LCDC_FUNC8b     0x10//ustawia 8-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC4b     0   //ustawia 4-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC2L0x08//ustawia tryb 2-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC1L0//ustawia tryb 1-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x100x04//ustawia znaki 5x10 (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x70//suatwia znaki 5x7 (wymaga LCDC_FUNC)<br />#define LCDC_CGA0x40<br />#define LCDC_DDA0x80<br />//KONIEC KOMEND<br /><br />//DEKLARACJE FUNKCJI<br />static inline void data_dir_out (void);<br />static inline void data_dir_in (void);<br />static inline void lcd_send_half (uint8_t _data);<br />void lcd_send_byte(char data);<br />static inline uint8_t lcd_read_half (void);<br />uint8_t lcd_read_byte (void);<br />uint8_t BF_busy (void);<br />void lcd_write_data (uint8_t data);<br />void lcd_write_cmd (uint8_t data);<br />void lcd_init (void);<br />void lcd_clr (void);<br />void lcd_disp_tab (char * tekst);<br /><br /><br />//****************MAIN**************************<br />int main()<br />{<br />lcd_init();      //INICJALIZACJA LCD<br />lcd_clr();<br /><br />char tab&#91;&#93; = &quot;abcd&quot;;  //PRZYKŁADOWY TEKST<br />lcd_disp_tab (tab);   //WYŚWIETL PRZYKŁADOWY TEKST<br /><br />while(1)<br />{<br /><br />}<br />}<br />//****************END OF MAIN***********************<br /><br /><br />//**********FUNKCJE***************<br />void lcd_init (void)      //INICJALIZACJA LCD<br />{<br />DDRD |= 0x7F; //0b01111111;<br /><br />SET_RS;<br />SET_E;<br />SET_RW;<br />_delay_ms(15);<br />CLR_E;<br />CLR_RS;<br />CLR_RW;<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_ms(4.1);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x02);  //tryb 4-bit<br />CLR_E;<br />_delay_us(100);<br /><br />//USTAWIENIA LCD<br />//tryb 4-bit, 2 wiersze, znak 5x7:<br />lcd_write_cmd( LCDC_FUNC | LCDC_FUNC4b | LCDC_FUNC2L | LCDC_FUNC5x7 );<br />//wyłączenie wyświetlacza<br />lcd_write_cmd( LCDC_ON );<br />//włączenie wyświetlacza:<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON );<br />//przesuwanie kurosra w prawo bez przesuwania zawartości ekranu:<br />lcd_write_cmd( LCDC_ENTRY | LCDC_ENTRYR );<br />//czyszczenie ekranu:<br />lcd_clr();<br />}<br /><br />//***********USTAWIENIE IN/OUT<br /><br />static inline void data_dir_out (void)  //ustawia piny D4-D7 jako wyjścia (aby przesłac dane do LCD)<br />{<br />DDRD |= 0x0F;<br />}<br /><br />static inline void data_dir_in (void)   //ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />DDRD &amp;= ~0x0F;   // lub     DDRD &amp;= 0xF0;<br />}<br /><br />//************ZAPIS**************<br />//*******************************<br /><br />static inline void lcd_send_half (uint8_t _data)   //PRZESYŁA 4BIT-Y do wyświetlacza<br />{<br />PORTD = (PORTD &amp; 0xF0) | (_data &amp; 0x0F);<br />}<br /><br />void lcd_send_byte(char data)        //PRZESYŁA CAŁY BAJT do wyświetlacza<br />{<br />data_dir_out();<br /><br />CLR_RW;  //0 na RW (czyli zapis)<br /><br />SET_E;<br />lcd_send_half(data &gt;&gt; 4);  //najpierw starsza częśc bajtu<br />CLR_E;<br /><br />SET_E;<br />lcd_send_half(data);  //później młodsza częśc bajtu<br />CLR_E;<br /><br />while ( BF_busy() );<br />}<br /><br />void lcd_write_data (uint8_t data)  //przeslanie danych<br />{<br />SET_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_write_cmd (uint8_t data)  //przeslanie komendy<br />{<br />CLR_RS;<br />lcd_send_byte(data);<br />}<br /><br /><br />//**********ODCZYT**************<br />//*******************************<br /><br />static inline uint8_t lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />uint8_t _odczyt = 0;<br /><br />if(PIND &amp; 0x0F) _odczyt |= PIND;<br /><br />return _odczyt;<br />}<br /><br />uint8_t lcd_read_byte (void)           //odczytuje cały bajt z wyświetlacza<br />{<br />uint8_t odczyt = 0;<br />data_dir_in();<br /><br />SET_RW;<br /><br />SET_E;<br />odczyt = (lcd_read_half() &lt;&lt; 4);  //odczyt starszej części bajtu<br />CLR_E;<br /><br />SET_E;<br />odczyt |= lcd_read_half();  //odczyt młodszej części bajtu (sterownik LCD wyśle ją &quot;na siłę&quot;, mimo że nie potrzebujemy tej części do odczytu BF)<br />CLR_E;<br /><br />return odczyt;<br />}<br /><br />//*************RESZTA FUNKCJI***************<br />//******************************************<br /><br />uint8_t BF_busy(void)      //zwraca stan BF<br />{<br />CLR_RS;<br />return ( lcd_read_byte() &amp; (1 &lt;&lt; 7) );  //sprawdzamy 7-my bit odcztanego bajtu (czyli BF)<br />}<br /><br />void lcd_clr (void)   //CZYSZCZENIE WYŚWIETLACZA<br />{<br />lcd_write_cmd( LCDC_CLS );<br />}<br /><br />void lcd_disp_tab (char *tekst)    //wyświetla tablice tekst()<br />{<br />while ( *tekst )<br />lcd_write_data( *tekst++ );<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 46 minutach ]</span></strong><br /><br />A niżej masz to samo, ale z podziałem na pliki  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> :<br />main.c:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br /><br />//****************MAIN**************************<br />int main()<br />{<br />lcd_init();      //INICJALIZACJA LCD<br />lcd_clr();<br /><br />char tab&#91;&#93; = &quot;abcd&quot;;  //PRZYKŁADOWY TEKST<br />lcd_disp_tab (tab);   //WYŚWIETL PRZYKŁADOWY TEKST<br /><br />while(1)<br />{<br /><br />}<br />}<br />//****************END OF MAIN***********************[/syntax]<br /><br />lcd.c:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;lcd.h&quot;<br />//**********FUNKCJE***************<br /><br />//***********USTAWIENIE IN/OUT<br /><br />static inline void data_dir_out (void)  //ustawia piny D4-D7 jako wyjścia (aby przesłac dane do LCD)<br />{<br />DDRD |= 0x0F;<br />}<br /><br />static inline void data_dir_in (void)   //ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />DDRD &amp;= 0xF0;<br />}<br /><br /><br />//************ZAPIS**************<br />//*******************************<br /><br />static inline void lcd_send_half (uint8_t _data)   //PRZESYŁA 4BIT-Y do wyświetlacza<br />{<br />PORTD = (PORTD &amp; 0xF0) | (_data &amp; 0x0F);<br />}<br /><br />void lcd_send_byte(char data)        //PRZESYŁA CAŁY BAJT do wyświetlacza<br />{<br />data_dir_out();<br /><br />CLR_RW;  //0 na RW (czyli zapis)<br /><br />SET_E;<br />lcd_send_half(data &gt;&gt; 4);  //najpierw starsza częśc bajtu<br />CLR_E;<br /><br />SET_E;<br />lcd_send_half(data);  //później młodsza częśc bajtu<br />CLR_E;<br /><br />while ( BF_busy() );<br />}<br /><br />void lcd_write_data (uint8_t data)  //przeslanie danych<br />{<br />SET_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_write_cmd (uint8_t data)  //przeslanie komendy<br />{<br />CLR_RS;<br />lcd_send_byte(data);<br />}<br /><br /><br />//**********ODCZYT**************<br />//*******************************<br /><br /><br />static inline uint8_t lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />uint8_t _odczyt = 0;<br /><br />if(PIND &amp; 0x0F) _odczyt |= PIND;<br /><br />return _odczyt;<br />}<br /><br />uint8_t lcd_read_byte (void)           //odczytuje cały bajt z wyświetlacza<br />{<br />uint8_t odczyt = 0;<br />data_dir_in();<br /><br />SET_RW;<br /><br />SET_E;<br />odczyt = (lcd_read_half() &lt;&lt; 4);  //odczyt starszej części bajtu<br />CLR_E;<br /><br />SET_E;<br />odczyt |= lcd_read_half();  //odczyt młodszej części bajtu (sterownik LCD wyśle ją &quot;na siłę&quot;, mimo że nie potrzebujemy tej części do odczytu BF)<br />CLR_E;<br /><br />return odczyt;<br />}<br /><br />uint8_t BF_busy(void)      //zwraca stan BF<br />{<br />CLR_RS;<br />return ( lcd_read_byte() &amp; (1 &lt;&lt; 7) );  //sprawdzamy 7-my bit odcztanego bajtu (czyli BF)<br />}<br /><br />void lcd_init (void)      //INICJALIZACJA LCD<br />{<br />DDRD |= 0x7F; //0b01111111;<br /><br />SET_RS;<br />SET_E;<br />SET_RW;<br />_delay_ms(15);<br />CLR_E;<br />CLR_RS;<br />CLR_RW;<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_ms(4.1);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x02);  //tryb 4-bit<br />CLR_E;<br />_delay_us(100);<br /><br />//USTAWIENIA LCD<br />//tryb 4-bit, 2 wiersze, znak 5x7:<br />lcd_write_cmd( LCDC_FUNC | LCDC_FUNC4b | LCDC_FUNC2L | LCDC_FUNC5x7 );<br />//wyłączenie wyświetlacza<br />lcd_write_cmd( LCDC_ON );<br />//włączenie wyświetlacza:<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON );<br />//przesuwanie kurosra w prawo bez przesuwania zawartości ekranu:<br />lcd_write_cmd( LCDC_ENTRY | LCDC_ENTRYR );<br />//czyszczenie ekranu:<br />lcd_clr();<br />}<br /><br /><br />//*************RESZTA FUNKCJI***************<br />//******************************************<br /><br /><br />void lcd_clr (void)   //CZYSZCZENIE WYŚWIETLACZA<br />{<br />lcd_write_cmd( LCDC_CLS );<br />}<br /><br />void lcd_disp_tab (char *tekst)    //wyświetla tablice tekst()<br />{<br />while ( *tekst )<br />lcd_write_data( *tekst++ );<br />}[/syntax]<br /><br />lcd.h:<br /><br />[syntax=c]#ifndef LCD_LCD_H_<br />#define LCD_LCD_H_<br /><br />//MAKRODEFINICJE:<br />#define SET_RS PORTD |= (1 &lt;&lt; 6)<br />#define CLR_RS PORTD &amp;= ~(1 &lt;&lt; 6)<br />#define SET_RW PORTD |= (1 &lt;&lt; 5)<br />#define CLR_RW PORTD &amp;= ~(1 &lt;&lt; 5)<br />#define SET_E PORTD |= (1 &lt;&lt; 4)<br />#define CLR_E PORTD &amp;= ~(1 &lt;&lt; 4)<br />//END MAKRODEFINICJE<br /><br />//KOMENDY LCD (przesyłane poprzez lcd_write_cmd)<br />#define LCDC_CLS0x01//czyści wyświetlacz<br />#define LCDC_HOME0x02//kursor w pozycji początkowej<br />#define LCDC_ENTRY0x04//ustawia bit D2 w celu zmiany trybu Entry Mode Set (z tabeli LCD)<br />#define LCDC_ENTRYR0x02//przesuwanie kursora (lub okna) w prawo (wymaga LCDC_ENTRY)<br />#define LCDC_ENTRYL0//przesuwanie w lewo<br />#define LCDC_MODEMOVE0x01//kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_ENTRY)  -- to samo co LCDC_SHIFTDISP ?<br />#define LCDC_ON0x08//ustawia bit D3 w celu zmiany trybu Dispaly On/Off (z tabeli LCD)<br />#define LCDC_DISPLAYON0x04//włącza wyświetlacz (wymaga LCDC_ON)<br />#define LCDC_CURSORON0x02//włącza kursor (wymaga LCDC_ON)<br />#define LCDC_BLINKON0x01//włącza miganie kursora (wymaga LCDC_ON)<br />#define LCDC_SHIFT0x10//ustawia bit D4 w celu zmiany trybu Cursor/Display Shift (tabela LCD)<br />#define LCDC_SHIFTDISP0x08//kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_SHIFT)  -- to samo co LCDC_MODEMOVE ?<br />#define LCDC_SHIFTR0x04//przesuwanie kursora w prawo (wymaga LCDC_SHIFT)<br />#define LCDC_SHIFTL0//przesuwanie kursora w lewo (wymaga LCDC_SHIFT)<br />#define LCDC_FUNC0x20//ustawia bit D5 w celu zmiany trybu Function Set (tabela LCD)<br />#define LCDC_FUNC8b0x10//ustawia 8-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC4b0//ustawia 4-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC2L0x08//ustawia tryb 2-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC1L0//ustawia tryb 1-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x100x04//ustawia znaki 5x10 (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x70//suatwia znaki 5x7 (wymaga LCDC_FUNC)<br />#define LCDC_CGA0x40<br />#define LCDC_DDA0x80<br />//KONIEC KOMEND<br /><br />//DEKLARACJE FUNKCJI<br />uint8_t BF_busy (void);<br />void lcd_write_data (uint8_t data);<br />void lcd_write_cmd (uint8_t data);<br />void lcd_init (void);<br />void lcd_clr (void);<br />void lcd_disp_tab (char * tekst);<br /><br />#endif /* LCD_LCD_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 5 paź 2015, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-05T16:59:36+01:00</updated>
<published>2015-10-05T16:59:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141537#p141537</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141537#p141537"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141537#p141537"><![CDATA[
<div class="quotetitle">majster napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent">Błąd ukryty jest więc gdzieś indziej. Mam nadzieję, że Koledzy pomożecie mi go znaleźć.<br /></div><br /><br />Sprawdzałeś czy sam LCD działa ?? Masz BB wgraj Mirka biblioteki i zobacz czy coś się wyświetla na LCD bo może sam on jest ubity ?</div><br /><br />Już tak robiłem i działa z programem Pana Mirka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 5 paź 2015, o 16:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-10-05T16:20:32+01:00</updated>
<published>2015-10-05T16:20:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141534#p141534</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141534#p141534"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141534#p141534"><![CDATA[
<div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent"><br />Błąd ukryty jest więc gdzieś indziej. Mam nadzieję, że Koledzy pomożecie mi go znaleźć.<br /></div><br /><br />Sprawdzałeś czy sam LCD działa ?? Masz BB wgraj Mirka biblioteki i zobacz czy coś się wyświetla na LCD bo może sam on jest ubity ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 5 paź 2015, o 16:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-05T09:03:57+01:00</updated>
<published>2015-10-05T09:03:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141518#p141518</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141518#p141518"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141518#p141518"><![CDATA[
<div class="quotetitle">Nefarious19 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent">zy mógłby kolega podać poprawną postać funkcji data_dir_in()?<br /></div><br /><br />o ile linie danych Twojego LCD są podłączone do pinów PD0 - PD3 to ta funkcja jest ok</div><br /><br />Są tak podłączone (sposób podłączenia napisałem w pierwszym komentarzu programu). <br /><br />Błąd ukryty jest więc gdzieś indziej. Mam nadzieję, że Koledzy pomożecie mi go znaleźć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 5 paź 2015, o 09:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2015-10-05T08:51:11+01:00</updated>
<published>2015-10-05T08:51:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141517#p141517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141517#p141517"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141517#p141517"><![CDATA[
<div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent"><br />zy mógłby kolega podać poprawną postać funkcji data_dir_in()?<br /></div><br /><br />o ile linie danych Twojego LCD są podłączone do pinów PD0 - PD3 to ta funkcja jest ok<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 5 paź 2015, o 08:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-05T08:42:21+01:00</updated>
<published>2015-10-05T08:42:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141516#p141516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141516#p141516"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141516#p141516"><![CDATA[
<div class="quotetitle">majster napisał(a):</div><div class="quotecontent"><br />Tak ale zobacz co kolega wyżej napisał przed 0xF0 brakuje tyldy   <br /><br />Powinno być ~0xF0<br /><br />Namazane ze smarta.<br /></div><br /><br />Czy mógłby kolega podać poprawną postać funkcji data_dir_in()?<br /><br />Nie do końca rozumiem w czym tkwi problem. W swojej funkcji zeruję 4 najmłodsze bity rejestru DDRD, czyli ustawiam 4 najmłodsze piny portu D jako wejścia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 5 paź 2015, o 08:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2015-10-05T08:33:09+01:00</updated>
<published>2015-10-05T08:33:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141515#p141515</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141515#p141515"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141515#p141515"><![CDATA[
<div class="quotetitle">majster napisał(a):</div><div class="quotecontent"><br />Powinno być ~0xF0<br /></div><br /><br />Nie prawda. Rozpisz to sobie. Miało by to racje bytu gdyby kolega napisał coś takiego:<br /><br />[syntax=c]DDRD &amp;= ~0x0F[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />powiedzmy że chcemy ustawić PIN PD0 jako wejśce, dajemy więc taki zapis:<br /><br />DDRD &amp;= ~(1&lt;&lt;PD0)<br /><br />co po rozpisaniu wygląda tak:<br /><br />DDRD = DDRD &amp; ~0b00000001;<br /><br />Czyli:<br /><br />DDRD = DDRD &amp; 0b11111110;<br /><br />czyli wyzeruje się tylko ostatni bit. jeżeli kolega zapisał<br /><br />DDRD &amp;= OxF0<br /><br />to automatycznie oznacza to:<br /><br />DDRD = DDRD &amp; 0b11110000<br /><br />czyli wyzerował 4 ostatnie bity a zatem ustawił je jako wejscia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 5 paź 2015, o 08:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-10-05T08:29:41+01:00</updated>
<published>2015-10-05T08:29:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141514#p141514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141514#p141514"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141514#p141514"><![CDATA[
Tak ale zobacz co kolega wyżej napisał przed 0xF0 brakuje tyldy   <br /><br />Powinno być ~0xF0<br /><br />Namazane ze smarta.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 5 paź 2015, o 08:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-05T06:01:36+01:00</updated>
<published>2015-10-05T06:01:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141506#p141506</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141506#p141506"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141506#p141506"><![CDATA[
<div class="quotetitle">kicajek napisał(a):</div><div class="quotecontent"><br />Witam<br />To jeszcze nie wszystko, ale<br /><div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent">[syntax=c]....//ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />        DDRD &amp;= 0xF0;<br />}[/syntax]<br /></div><br />nie tak się ustawia wejście - brakuje tyldy.<br /><br />Pozdr.</div><br /><br />Kolego, mnie się wydaje, że ta linijka jest poprawna. Chcę ustawić 4 najmłodsze bity jako wejścia, więc robię iloczyn logiczny z 0xF0.<br />DDRD &amp; 0xF0 = xxxx0000 (4 najstarsze bity zostają te takie same jak przed wykonaniem operacji iloczynu logicznego)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 5 paź 2015, o 06:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2015-10-04T22:40:23+01:00</updated>
<published>2015-10-04T22:40:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141499#p141499</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141499#p141499"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141499#p141499"><![CDATA[
Witam<br />To jeszcze nie wszystko, ale<br /><div class="quotetitle">Loreno napisał(a):</div><div class="quotecontent"><br />[syntax=c]....//ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />        DDRD &amp;= 0xF0;<br />}[/syntax]<br /></div><br />nie tak się ustawia wejście - brakuje tyldy.<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 4 paź 2015, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-04T19:39:53+01:00</updated>
<published>2015-10-04T19:39:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141484#p141484</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141484#p141484"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141484#p141484"><![CDATA[
Nie wiem czy dzielenie na pliki coś pomoże, bo właściwie cały ten program jest do obsługi LCD i nie wiem za bardzo na jakiej zasadzie dzielić to na pliki. Cały program jest po kolei napisany wg niebieskiej książki. Mimo to usunąłem nieużywane funkcje i dodałem więcej komentarzy. Mam nadzieję, że program jest bardziej czytelny:<br /><br />[syntax=c]//Przyjmę, że wyświetlacz jest podłączony do portu D (PD6 - PD0 : RS, RW, E, D7, D6, D5, D4)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//MAKRODEFINICJE:<br />#define SET_RS PORTD |= (1 &lt;&lt; 6)<br />#define CLR_RS PORTD &amp;= ~(1 &lt;&lt; 6)<br />#define SET_RW PORTD |= (1 &lt;&lt; 5)<br />#define CLR_RW PORTD &amp;= ~(1 &lt;&lt; 5)<br />#define SET_E PORTD |= (1 &lt;&lt; 4)<br />#define CLR_E PORTD &amp;= ~(1 &lt;&lt; 4)<br />//END MAKRODEFINICJE<br /><br />//KOMENDY LCD (przesyłane poprzez lcd_write_cmd)<br />#define LCDC_CLS      0x01       //czyści wyświetlacz<br />#define LCDC_HOME      0x02      //kursor w pozycji początkowej<br />#define LCDC_ENTRY      0x04     //ustawia bit D2 w celu zmiany trybu Entry Mode Set (z tabeli LCD)<br />#define LCDC_ENTRYR      0x02    //przesuwanie kursora (lub okna) w prawo (wymaga LCDC_ENTRY)<br />#define LCDC_ENTRYL      0       //przesuwanie w lewo<br />#define LCDC_MODEMOVE   0x01     //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_ENTRY)  -- to samo co LCDC_SHIFTDISP ?<br />#define LCDC_ON       0x08       //ustawia bit D3 w celu zmiany trybu Dispaly On/Off (z tabeli LCD)<br />#define LCDC_DISPLAYON   0x04    //włącza wyświetlacz (wymaga LCDC_ON)<br />#define LCDC_CURSORON   0x02     //włącza kursor (wymaga LCDC_ON)<br />#define LCDC_BLINKON   0x01      //włącza miganie kursora (wymaga LCDC_ON)<br />#define LCDC_SHIFT      0x10 //ustawia bit D4 w celu zmiany trybu Cursor/Display Shift (tabela LCD)<br />#define LCDC_SHIFTDISP   0x08    //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_SHIFT)  -- to samo co LCDC_MODEMOVE ?<br />#define LCDC_SHIFTR      0x04    //przesuwanie kursora w prawo (wymaga LCDC_SHIFT)<br />#define LCDC_SHIFTL      0       //przesuwanie kursora w lewo (wymaga LCDC_SHIFT)<br />#define LCDC_FUNC      0x20      //ustawia bit D5 w celu zmiany trybu Function Set (tabela LCD)<br />#define LCDC_FUNC8b      0x10 //ustawia 8-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC4b      0   //ustawia 4-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC2L      0x08    //ustawia tryb 2-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC1L      0       //ustawia tryb 1-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x10   0x4      //ustawia znaki 5x10 (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x7   0         //suatwia znaki 5x7 (wymaga LCDC_FUNC)<br />#define LCDC_CGA      0x40<br />#define LCDC_DDA      0x80<br />//KONIEC KOMEND<br /><br />//DEKLARACJE FUNKCJI<br />void data_dir_out (void);<br />void data_dir_in (void);<br />static inline void lcd_send_half (int _data);<br />void lcd_send_byte(unsigned char data);<br />static inline int lcd_read_half (void);<br />int lcd_read_byte (void);<br />int BF_busy (void);<br />void lcd_write_data (int data);<br />void lcd_write_cmd (int data);<br />void lcd_init (void);<br />void lcd_clr (void);<br />void lcd_disp_tab (char * tekst);<br /><br />//****************MAIN**************************<br />int main()<br />{<br />lcd_init();      //INICJALIZACJA LCD<br /><br />char tab&#91;&#93; = &quot;abcd&quot;;  //PRZYKŁADOWY TEKST<br />lcd_disp_tab (tab);   //WYŚWIETL PRZYKŁADOWY TEKST<br /><br />while(1)<br />{<br /><br />}<br /><br />return 0;<br />}<br />//****************END OF MAIN***********************<br /><br /><br />//**********FUNKCJE***************<br />void lcd_init (void)      //INICJALIZACJA LCD<br />{<br />DDRD = 0b01111111;<br />SET_RS;<br />SET_E;<br />SET_RW;<br />_delay_ms(15);<br />CLR_E;<br />CLR_RS;<br />CLR_RW;<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_ms(4.1);<br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br />SET_E;<br />lcd_send_half(0x02);  //tryb 4-bit<br />CLR_E;<br />_delay_us(100);<br /><br />//USTAWIENIA LCD<br />//tryb 4-bit, 2 wiersze, znak 5x7:<br />lcd_write_cmd( LCDC_FUNC | LCDC_FUNC4b | LCDC_FUNC2L | LCDC_FUNC5x7 );<br />//włączenie wyświetlacza:<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON );<br />//przesuwanie kurosra w prawo bez przesuwania zawartości ekranu:<br />lcd_write_cmd( LCDC_ENTRY | LCDC_ENTRYR );<br />//czyszczenie ekranu:<br />lcd_clr();<br />}<br /><br />//***********USTAWIENIE IN/OUT<br /><br />void data_dir_out (void)  //ustawia piny D4-D7 jako wyjścia (aby przesłac dane do LCD)<br />{<br />DDRD |= 0x0F;<br />}<br /><br />void data_dir_in (void)   //ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />DDRD &amp;= 0xF0;<br />}<br /><br />//************ZAPIS**************<br />//*******************************<br /><br />static inline void lcd_send_half (int _data)   //PRZESYŁA 4BIT-Y do wyświetlacza<br />{<br />PORTD = (PORTD &amp; 0xF0) | (_data &amp; 0x0F);<br />}<br /><br />void lcd_send_byte(unsigned char data)        //PRZESYŁA CAŁY BAJT do wyświetlacza<br />{<br />data_dir_out();<br /><br />CLR_RW;  //0 na RW (czyli zapis)<br /><br />SET_E;<br />lcd_send_half(data &gt;&gt; 4);  //najpierw starsza częśc bajtu<br />CLR_E;<br /><br />SET_E;<br />lcd_send_half(data);  //później młodsza częśc bajtu<br />CLR_E;<br /><br />while ( BF_busy() );<br />}<br /><br />void lcd_write_data (int data)  //przeslanie danych<br />{<br />SET_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_write_cmd (int data)  //przeslanie komendy<br />{<br />CLR_RS;<br />lcd_send_byte(data);<br />}<br /><br /><br />//**********ODCZYT**************<br />//*******************************<br /><br />static inline int lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />int _odczyt = (PIND &amp; 0x0F);<br />return _odczyt;<br />}<br /><br />int lcd_read_byte (void)           //odczytuje cały bajt z wyświetlacza<br />{<br />int odczyt = 0;<br />data_dir_in();<br /><br />SET_RW;<br /><br />SET_E;<br />odczyt = (lcd_read_half() &lt;&lt; 4);  //odczyt starszej części bajtu<br />CLR_E;<br /><br />SET_E;<br />odczyt |= lcd_read_half();  //odczyt młodszej części bajtu (sterownik LCD wyśle ją &quot;na siłę&quot;, mimo że nie potrzebujemy tej części do odczytu BF)<br />CLR_E;<br /><br />return odczyt;<br />}<br /><br />//*************RESZTA FUNKCJI***************<br />//******************************************<br /><br />int BF_busy (void)      //zwraca stan BF<br />{<br />CLR_RS;<br />return ( lcd_read_byte() &amp; (1 &lt;&lt; 7) );  //sprawdzamy 7-my bit odcztanego bajtu (czyli BF)<br />}<br /><br />void lcd_clr (void)   //CZYSZCZENIE WYŚWIETLACZA<br />{<br />lcd_write_cmd( LCDC_CLS );<br />}<br /><br />void lcd_disp_tab (char * tekst)    //wyświetla tablice tekst()<br />{<br />while ( *tekst )<br />lcd_write_data( *tekst++ );<br />}[/syntax]<br /><br />Jeśli chodzi o kontrast, to jest podłączony do masy. Uruchamiałem program Pana Mirka i ładnie widać litery.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 4 paź 2015, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysssztof]]></name></author>
<updated>2015-10-04T18:55:30+01:00</updated>
<published>2015-10-04T18:55:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141468#p141468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141468#p141468"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141468#p141468"><![CDATA[
2 czarne wiersze mówisz ?<br />Próbuj zmienić kontrast - może tak zaczerniłeś, że nic nie widać <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4274">krzysssztof</a> — 4 paź 2015, o 18:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Bartek123]]></name></author>
<updated>2015-10-04T18:47:32+01:00</updated>
<published>2015-10-04T18:47:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141464#p141464</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141464#p141464"/>
<title type="html"><![CDATA[Re: LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141464#p141464"><![CDATA[
O kurde. Wiesz co jak masz bluebooka i przerabiasz go po kolei to powinieneś umieć dzielić projekt na pliki. Kiedy tego nie robisz to ciężko będzie znaleźć babola nam i tobie.Spróbuj podzielić projekt na pliki a gwarantuje ci że lepiej będzie to wyglądać i szybciej my i ty znajdziemy błąd.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10617">Bartek123</a> — 4 paź 2015, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-04T18:40:55+01:00</updated>
<published>2015-10-04T18:40:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141460#p141460</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141460#p141460"/>
<title type="html"><![CDATA[LCD - nic nie wyświetla]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13120&amp;p=141460#p141460"><![CDATA[
Dobry wieczór,<br /><br />Zabrałem się dzisiaj za pisanie sterownika LCD z pomocą niebieskiej książki. Niestety po wgraniu programu do mikrokontrolera, na wyświetlaczu widzę jedynie 2 wiersze czarnych kwadratów. Przeglądałem kod i nawet znalazłem kilka błędów, ale niestety ich eliminacja nic nie pomogła.<br /><br />Oto mój kod:<br />[syntax=c]//Przyjmę, że wyświetlacz jest podłączony do portu D (PD6 - PD0 : RS, RW, E, D7, D6, D5, D4)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//MAKRODEFINICJE:<br />#define SET_RS PORTD |= (1 &lt;&lt; 6)<br />#define CLR_RS PORTD &amp;= ~(1 &lt;&lt; 6)<br />#define SET_RW PORTD |= (1 &lt;&lt; 5)<br />#define CLR_RW PORTD &amp;= ~(1 &lt;&lt; 5)<br />#define SET_E PORTD |= (1 &lt;&lt; 4)<br />#define CLR_E PORTD &amp;= ~(1 &lt;&lt; 4)<br />//END MAKRODEFINICJE<br /><br />//KOMENDY LCD (przesyłane poprzez lcd_write_cmd)<br />#define LCDC_CLS      0x01       //czyści wyświetlacz<br />#define LCDC_HOME      0x02      //kursor w pozycji początkowej<br />#define LCDC_ENTRY      0x04     //ustawia bit D2 w celu zmiany trybu Entry Mode Set (z tabeli LCD)<br />#define LCDC_ENTRYR      0x02    //przesuwanie kursora (lub okna) w prawo (wymaga LCDC_ENTRY)<br />#define LCDC_ENTRYL      0       //przesuwanie w lewo<br />#define LCDC_MODEMOVE   0x01     //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_ENTRY)  -- to samo co LCDC_SHIFTDISP ?<br />#define LCDC_ON       0x08       //ustawia bit D3 w celu zmiany trybu Dispaly On/Off (z tabeli LCD)<br />#define LCDC_DISPLAYON   0x04    //włącza wyświetlacz (wymaga LCDC_ON)<br />#define LCDC_CURSORON   0x02     //włącza kursor (wymaga LCDC_ON)<br />#define LCDC_BLINKON   0x01      //włącza miganie kursora (wymaga LCDC_ON)<br />#define LCDC_SHIFT      0x10 //ustawia bit D4 w celu zmiany trybu Cursor/Display Shift (tabela LCD)<br />#define LCDC_SHIFTDISP   0x08    //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_SHIFT)  -- to samo co LCDC_MODEMOVE ?<br />#define LCDC_SHIFTR      0x04    //przesuwanie kursora w prawo (wymaga LCDC_SHIFT)<br />#define LCDC_SHIFTL      0       //przesuwanie kursora w lewo (wymaga LCDC_SHIFT)<br />#define LCDC_FUNC      0x20      //ustawia bit D5 w celu zmiany trybu Function Set (tabela LCD)<br />#define LCDC_FUNC8b      0x10 //ustawia 8-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC4b      0   //ustawia 4-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC2L      0x08    //ustawia tryb 2-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC1L      0       //ustawia tryb 1-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x10   0x4      //ustawia znaki 5x10 (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x7   0         //suatwia znaki 5x7 (wymaga LCDC_FUNC)<br />#define LCDC_CGA      0x40<br />#define LCDC_DDA      0x80<br />//KONIEC KOMEND<br /><br />//DEKLARACJE FUNKCJI<br />void data_dir_out (void);<br />void data_dir_in (void);<br />static inline void lcd_send_half (int _data);<br />void lcd_send_byte(unsigned char data);<br />static inline int lcd_read_half (void);<br />int lcd_read_byte (void);<br />int BF_busy (void);<br />void lcd_write_data (int data);<br />void lcd_write_cmd (int data);<br />void lcd_init (void);<br />void lcd_clr (void);<br />void lcd_cursor_on (void);<br />void lcd_cursor_off (void);<br />void lcd_cursor_home (void);<br />void lcd_cursor_blink_on (void);<br />void lcd_cursor_blink_off (void);<br />void lcd_disp_tab (char * tekst);<br /><br />//****************MAIN**************************<br />int main()<br />{<br />lcd_init();      //INICJALIZACJA LCD<br /><br />char tab&#91;&#93; = &quot;abcd&quot;;  //PRZYKŁADOWY TEKST<br />lcd_disp_tab (tab);   //WYŚWIETL PRZYKŁADOWY TEKST<br /><br />while(1)<br />{<br /><br />}<br /><br />return 0;<br />}<br />//****************END OF MAIN***********************<br /><br /><br />//**********FUNKCJE***************<br />void lcd_init (void)      //INICJALIZACJA LCD<br />{<br />DDRD = 0b01111111;<br />SET_RS;<br />SET_E;<br />SET_RW;<br />_delay_ms(15);<br />CLR_E;<br />CLR_RS;<br />CLR_RW;<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_ms(4.1);<br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br />SET_E;<br />lcd_send_half(0x02);  //tryb 4-bit<br />CLR_E;<br />_delay_us(100);<br /><br />//USTAWIENIA LCD<br />//tryb 4-bit, 2 wiersze, znak 5x7:<br />lcd_write_cmd( LCDC_FUNC | LCDC_FUNC4b | LCDC_FUNC2L | LCDC_FUNC5x7 );<br />//włączenie wyświetlacza:<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON );<br />//przesuwanie kurosra w prawo bez przesuwania zawartości ekranu:<br />lcd_write_cmd( LCDC_ENTRY | LCDC_ENTRYR );<br />//czyszczenie ekranu:<br />lcd_clr();<br />}<br /><br /><br />void data_dir_out (void)  //ustawia piny D4-D7 jako wyjścia (aby przesłac dane do LCD)<br />{<br />DDRD |= 0x0F;<br />}<br /><br />void data_dir_in (void)   //ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />DDRD &amp;= 0xF0;<br />}<br /><br />static inline void lcd_send_half (int _data)<br />{<br />PORTD = (PORTD &amp; 0xF0) | (_data &amp; 0x0F);<br />}<br /><br />void lcd_send_byte(unsigned char data)<br />{<br />data_dir_out();<br /><br />CLR_RW;  //0 na RW (czyli zapis)<br /><br />SET_E;<br />lcd_send_half(data &gt;&gt; 4);  //najpierw starsza częśc bajtu<br />CLR_E;<br /><br />SET_E;<br />lcd_send_half(data);  //później młodsza częśc bajtu<br />CLR_E;<br /><br />while ( BF_busy() );<br />}<br /><br />static inline int lcd_read_half (void)   //przesyła 4 bity z 1 jednego bajta do wyświetlacza<br />{<br />int _odczyt = (PIND &amp; 0x0F);<br />return _odczyt;<br />}<br /><br />int lcd_read_byte (void)           //przesyła cały bajt do wyswietlacza<br />{<br />int odczyt = 0;<br />data_dir_in();<br /><br />SET_RW;<br /><br />SET_E;<br />odczyt = (lcd_read_half() &lt;&lt; 4);  //odczyt starszej części bajtu<br />CLR_E;<br /><br />SET_E;<br />odczyt |= lcd_read_half();  //odczyt młodszej części bajtu (sterownik LCD wyśle ją &quot;na siłę&quot;, mimo że nie potrzebujemy tej części do odczytu BF)<br />CLR_E;<br /><br />return odczyt;<br />}<br /><br />int BF_busy (void)      //zwraca stan BF<br />{<br />CLR_RS;<br />return ( lcd_read_byte() &amp; (1 &lt;&lt; 7) );  //sprawdzamy 7-my bit odcztanego bajtu (czyli BF)<br />}<br /><br />void lcd_write_data (int data)  //przeslanie danych<br />{<br />SET_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_write_cmd (int data)  //przeslanie komendy<br />{<br />CLR_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_clr (void)<br />{<br />lcd_write_cmd( LCDC_CLS );<br />}<br /><br />void lcd_cursor_on (void)  //włącza kursor (i wyświetlacz)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON );<br />}<br /><br />void lcd_cursor_off (void)  //włącza kursor (i wyświetlacz)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON);  //po prostu nie aktywujemy bitu odpowiedzialnego za włączenie kursora<br />}<br /><br />void lcd_cursor_home (void)<br />{<br />lcd_write_cmd( LCDC_HOME );<br />}<br /><br />void lcd_cursor_blink_on (void)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON | LCDC_BLINKON );<br />}<br /><br />void lcd_cursor_blink_off (void)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON );<br />}<br /><br />void lcd_disp_tab (char * tekst)<br />{<br />while ( *tekst )<br />lcd_write_data( *tekst++ );<br />}[/syntax]<br />bardzo prosiłbym o pomoc w rozwiązaniu problemu. Sposób podłączenia do mikrokontrolera podany jest w pierwszym komentarzu. Całość podłączona jest do portu D.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 4 paź 2015, o 18:40</p><hr />
]]></content>
</entry>
</feed>