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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-10T22:32:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=8457&amp;mode</id>
<entry>
<author><name><![CDATA[azorp12]]></name></author>
<updated>2014-09-10T22:32:12+01:00</updated>
<published>2014-09-10T22:32:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=95027#p95027</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=95027#p95027"/>
<title type="html"><![CDATA[Re: Obsługa wyświetlacza ze sterownikiem HD44780 pod STM32F4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=95027#p95027"><![CDATA[
Witam. Jak się okazało częstotliwość taktowania timerów była dwukrotnie wyższa, co wynika z clock tree w manualu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1743">azorp12</a> — 10 wrz 2014, o 22:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2014-09-09T18:25:12+01:00</updated>
<published>2014-09-09T18:25:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94823#p94823</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94823#p94823"/>
<title type="html"><![CDATA[Re: Obsługa wyświetlacza ze sterownikiem HD44780 pod STM32F4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94823#p94823"><![CDATA[
<!-- m --><a class="postlink" href="http://sun.crystalcraft.com.pl/wordpress/arm/stm32/discovery/start-z-stm32-vl-discovery-5-lcd/" >http://sun.crystalcraft.com.pl/wordpres ... ery-5-lcd/</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 9 wrz 2014, o 18:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2014-09-09T14:03:07+01:00</updated>
<published>2014-09-09T14:03:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94798#p94798</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94798#p94798"/>
<title type="html"><![CDATA[Re: Obsługa wyświetlacza ze sterownikiem HD44780 pod STM32F4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94798#p94798"><![CDATA[
Pokaż funkcję WRITE_DATA wyswietlacza.<br />Obstawiam że trzeba tam &quot;pacnąć&quot; jakieś drobne opóźnienie bo miałem coś takiego przy XMOS'ie .... - po prostu za szybki procek dla tego wyświetlacza ... ale w sumie w życiu w ręku nie miałem STM'a więc mogę się mylić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 9 wrz 2014, o 14:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[azorp12]]></name></author>
<updated>2014-09-09T11:47:28+01:00</updated>
<published>2014-09-09T11:47:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94791#p94791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94791#p94791"/>
<title type="html"><![CDATA[Obsługa wyświetlacza ze sterownikiem HD44780 pod STM32F4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8457&amp;p=94791#p94791"><![CDATA[
Witam. Mam problem z obsługą wyświetlacza ze sterownikiem HD44780 pod STM32F4. Wyświetlacz zachowuje się bardzo niestabilnie tzn. raz wyświetla zadany tekst a po wyłączeniu zasilania i włączeniu nie działa lub działa. Połączenia są dobre i stabilne, sprawdzałem wiele razy. Nawet jak wyświetla to gubi znaki, nigdy nie udało mu się wyświetlić pełnego tekstu. Obawiam się że problem leży w kodzie, czy ktoś mógłby sprawdzić co jest z nim nie tak? Najbardziej newralgiczne punkty tego programu to opóźnienia, timery taktowane są z częstotliwością 42Mhz ale nadal nie mam pewności czy dobrze odliczają czas - nie mam oscyloskopu ani dobrego urządzenia pomiarowego aby to sprawdzić. Oto kod programu:<br /><br />Plik HD44780.h<br /><br />[syntax=c]#ifndef HD44780_H<br />#define HD44780_H<br /><br /><br />extern void delay_ms(int ms);/*funkcja generujaca dokladne opoznienia w ms*/<br />extern void delay_us(int us);/*funkcja generujaca dokladne opoznienia w us*/<br /><br />#define  PORTA_H GPIOB -&gt; BSRRL<br />#define  PORTA_L GPIOB -&gt; BSRRH<br />#define  RS 0x0001//PB0<br />#define  RW 0x0002//PB1<br />#define  E 0x0004//PB2<br />#define  DB4 0x0040//PB6<br />#define  DB5 0x0080//PB7<br />#define  DB6 0x0100//PB8<br />#define  DB7 0x0200//PB9<br /><br /><br />#define LCD_DB4_DIR GPIOB -&gt; MODER<br />#define LCD_DB5_DIR GPIOB -&gt; MODER<br />#define LCD_DB6_DIR GPIOB -&gt; MODER<br />#define LCD_DB7_DIR GPIOB -&gt; MODER<br />#define LCD_E_DIR   GPIOB -&gt; MODER<br />#define LCD_RS_DIR  GPIOB -&gt; MODER<br />#define LCD_RW_DIR  GPIOB -&gt; MODER<br /><br />#define LCD_DB4 GPIO_MODER_MODER6_0<br />#define LCD_DB5 GPIO_MODER_MODER7_0<br />#define LCD_DB6 GPIO_MODER_MODER8_0<br />#define LCD_DB7 GPIO_MODER_MODER9_0<br />#define LCD_E GPIO_MODER_MODER2_0<br />#define LCD_RS GPIO_MODER_MODER0_0<br />#define LCD_RW GPIO_MODER_MODER1_0 <br /><br />#define HD44780_CLEAR0x01<br /><br />#define HD44780_HOME0x02<br /><br />#define HD44780_ENTRY_MODE0x04<br />#define HD44780_EM_SHIFT_CURSOR0<br />#define HD44780_EM_SHIFT_DISPLAY1<br />#define HD44780_EM_DECREMENT0<br />#define HD44780_EM_INCREMENT2<br /><br />#define HD44780_DISPLAY_ONOFF0x08<br />#define HD44780_DISPLAY_OFF0<br />#define HD44780_DISPLAY_ON4<br />#define HD44780_CURSOR_OFF0<br />#define HD44780_CURSOR_ON2<br />#define HD44780_CURSOR_NOBLINK0<br />#define HD44780_CURSOR_BLINK1<br /><br />#define HD44780_DISPLAY_CURSOR_SHIFT0x10<br />#define HD44780_SHIFT_CURSOR0<br />#define HD44780_SHIFT_DISPLAY8<br />#define HD44780_SHIFT_LEFT0<br />#define HD44780_SHIFT_RIGHT4<br /><br />#define HD44780_FUNCTION_SET0x20<br />#define HD44780_FONT5x70<br />#define HD44780_FONT5x104<br />#define HD44780_ONE_LINE0<br />#define HD44780_TWO_LINE8<br />#define HD44780_4_BIT0<br />#define HD44780_8_BIT16<br /><br />#define HD44780_CGRAM_SET0x40<br /><br />#define HD44780_DDRAM_SET0x80<br /><br />void LCD_WriteCommand(unsigned char);<br />void LCD_WriteData(unsigned char);<br />void LCD_WriteText(char *);<br />void LCD_GoTo(unsigned char, unsigned char);<br />void LCD_Clear(void);<br />void LCD_Home(void);<br />void LCD_Initalize(void);<br /><br /><br /><br /><br />#endif[/syntax]<br /><br />Plik HD44780.c<br /><br />[syntax=c]#include &quot;main.h&quot;<br />#include &quot;HD44780.h&quot;<br /><br /><br />void _LCD_OutNibble(unsigned char nibbleToWrite)<br />{<br />if(nibbleToWrite &amp; 0x01)<br />PORTA_H = DB4;<br />else<br />PORTA_L = DB4;<br /><br />if(nibbleToWrite &amp; 0x02)<br />PORTA_H = DB5;<br />else<br />PORTA_L = DB5;<br /><br />if(nibbleToWrite &amp; 0x04)<br />PORTA_H = DB6;<br />else<br />PORTA_L = DB6;<br /><br />if(nibbleToWrite &amp; 0x08)<br />PORTA_H = DB7;<br />else<br />PORTA_L = DB7;<br />}<br /><br />void _LCD_Write(unsigned char dataToWrite)<br />{<br />PORTA_H = E;<br />_LCD_OutNibble(dataToWrite &gt;&gt; 4);<br />PORTA_L = E;<br />PORTA_H = E;<br />_LCD_OutNibble(dataToWrite);<br />PORTA_L = E;<br />delay_us(50); <br />}<br /><br />void LCD_WriteCommand(unsigned char commandToWrite)<br />{<br />PORTA_L = RS;<br />_LCD_Write(commandToWrite);<br />}<br /><br />void LCD_WriteData(unsigned char dataToWrite)<br />{<br />PORTA_H = RS;<br />_LCD_Write(dataToWrite);<br />}<br /><br />void LCD_WriteText(char * text)<br />{<br />while(*text)<br />  LCD_WriteData(*text++);<br />}<br /><br />void LCD_GoTo(unsigned char x, unsigned char y)<br />{<br />LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));<br />}<br /><br />void LCD_Clear(void)<br />{<br />LCD_WriteCommand(HD44780_CLEAR);<br />delay_ms(2);<br />}<br /><br />void LCD_Home(void)<br />{<br />LCD_WriteCommand(HD44780_HOME);<br />delay_ms(2);<br />}<br /><br />void LCD_Initalize(void)<br />{<br />unsigned char i;<br />LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzen<br />LCD_DB5_DIR |= LCD_DB5; //<br />LCD_DB6_DIR |= LCD_DB6; //<br />LCD_DB7_DIR |= LCD_DB7; //<br />LCD_E_DIR |= LCD_E;   //<br />LCD_RS_DIR |= LCD_RS;  //<br />delay_ms(15); // oczekiwanie na ustalibizowanie sie napiecia zasilajacego<br />PORTA_L = RS; // wyzerowanie linii RS<br />PORTA_L = E;  // wyzerowanie linii E<br /><br />for(i = 0; i &lt; 3; i++) // trzykrotne powtórzenie bloku instrukcji<br />  {<br />  PORTA_H = E; //  E = 1<br />  _LCD_OutNibble(0x03); // tryb 8-bitowy<br />  PORTA_L = E; // E = 0<br />  delay_ms(5); // czekaj 5ms<br />  }<br /><br />PORTA_H = E; // E = 1<br />_LCD_OutNibble(0x02); // tryb 4-bitowy<br />PORTA_L = E; // E = 0<br /><br />delay_ms(1); // czekaj 1ms <br />LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7<br />LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wylaczenie wyswietlacza<br />LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosci pamieci DDRAM<br />delay_ms(2);<br />LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora<br />LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // wlacz LCD, bez kursora i mrugania<br />}[/syntax]<br /><br />Plik main.c<br /><br />[syntax=c]#include &quot;main.h&quot;<br />#include &quot;hd44780.h&quot;<br /><br />static volatile int time_ms;<br />static volatile int time_us;<br /><br />void Tim3Config()<br />{<br />RCC -&gt; APB1ENR |= RCC_APB1ENR_TIM3EN;<br />TIM3 -&gt; ARR = 1;<br />TIM3 -&gt; PSC = 20;<br />TIM3 -&gt; DIER |= TIM_DIER_UIE;<br /><br />NVIC_EnableIRQ(TIM3_IRQn);<br /><br />TIM3 -&gt; CR1 |= TIM_CR1_CEN;<br />}<br /><br />void Tim2Config()<br />{<br />RCC -&gt; APB1ENR |= RCC_APB1ENR_TIM2EN;<br />TIM2 -&gt; ARR = 1999;<br />TIM2 -&gt; PSC = 20;<br />TIM2 -&gt; DIER |= TIM_DIER_UIE;<br /><br />NVIC_EnableIRQ(TIM2_IRQn);<br /><br />TIM2 -&gt; CR1 |= TIM_CR1_CEN;<br />}<br /><br />void GPIO_config()<br />{<br />RCC -&gt; AHB1ENR |= RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIODEN;<br />}<br /><br />void delay_ms(int ms)/*funkcja generujaca dokladne opoznienia w ms*/<br />{<br />time_ms = ms;<br />TIM2 -&gt; CNT = 0;/*Zerowanie licznika*/<br />while(time_ms!=0);/*Oczekiwanie na koniec odliczania*/<br />}<br /><br />void delay_us(int us)/*funkcja generujaca dokladne opoznienie w us*/<br />{<br />time_us = us;<br />TIM3 -&gt; CNT = 0;<br />  while(time_us!=0);<br />}<br /><br /><br />int main()<br />{<br />GPIO_config();<br />Tim2Config();<br />Tim3Config();<br />LCD_Initalize();<br />LCD_GoTo(0,0);<br />LCD_WriteText(&quot;Test1&quot;);<br /><br />while(1)<br />{<br /><br />}<br /><br /><br />}<br /><br />void TIM2_IRQHandler()<br />{<br />if((TIM2 -&gt; SR &amp; TIM_SR_UIF) != 0)<br />{<br /><br />TIM2 -&gt; SR &amp;= ~TIM_SR_UIF;<br /><br /><br />}<br />if(time_ms!=0) time_ms--;<br /><br /><br />}<br /><br />void TIM3_IRQHandler()<br />{<br />if((TIM3 -&gt; SR &amp; TIM_SR_UIF) != 0)<br />{<br /><br />TIM3 -&gt; SR &amp;= ~TIM_SR_UIF;<br /><br /><br />}<br />if(time_us!=0) time_us--;<br /><br /><br />}[/syntax]<br /><br />Mógłby ktoś powiedzieć co w programie odpowiada za taki stan rzeczy? Już wielu rzeczy próbowałem ale nic z tego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1743">azorp12</a> — 9 wrz 2014, o 11:47</p><hr />
]]></content>
</entry>
</feed>