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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-05-01T18:08:14+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=23069&amp;mode</id>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-05-01T18:08:14+01:00</updated>
<published>2020-05-01T18:08:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226816#p226816</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226816#p226816"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226816#p226816"><![CDATA[
Zauważyłem że dane nie wysyłane są w całości. Nie wiem dlaczego wysyłanych jest tak mało danych. Poniżej zmiana stanów na D4 i D5 przy poleceniu LCD_init(). Znalazłem trochę błędów i poprawiłem:<br />[syntax=c]#include &quot;stm32f4xx.h&quot;<br />#include &quot;44780_display.h&quot;<br /><br />extern void delay_ms( uint16_t ms );<br /><br />void SendHalf( uint8_t data ){     //wysyłanie połowy bajtu<br /><br />  LCD_E_SET;<br />  <br />  if( data &amp; ( 0x01 )) LCD_D4_SET;<br />  else LCD_D4_RESET;<br />  if( data &amp; ( 0x02 )) LCD_D5_SET;<br />  else LCD_D5_RESET;<br />  if( data &amp; ( 0x04 )) LCD_D6_SET;<br />  else LCD_D6_RESET;<br />  if( data &amp; ( 0x08 )) LCD_D7_SET;<br />  else LCD_D7_RESET;<br />  <br />  LCD_E_RESET;<br />  <br />}<br /><br />void SendAll( uint8_t data ){    //wysyłanie całego bajtu<br /><br />  SendHalf( data &gt;&gt; 4 );<br />  SendHalf( data );<br />  delay_ms( 1 ); // delay_10us( 6 );<br /><br />}<br /><br />void RS_write_command( uint8_t command ){    //wysyłanie komendy<br /><br />  LCD_RS_COMMAND;<br />  SendAll( command );<br />  <br />}<br /><br />void RS_write_data( char data ){         //wysyłanie danej na wyświetlacz<br /><br />  LCD_RS_DATA; <br />  SendAll( data );<br /><br />}<br /><br />void LCD_init( void ){                          //inicjalizacja LCD<br /><br />  <br />  delay_ms( 25 );// _delay_10us( 1500 );<br />  LCD_E_RESET;<br />  LCD_RS_COMMAND;<br />  SendHalf( 0x03 );<br />  delay_ms( 5 );//_delay_10us( 410 );<br />  SendHalf( 0x03 );<br />  delay_ms( 1 );//_delay_10us( 100 );<br />  SendHalf( 0x03 );<br />  delay_ms( 1 );//_delay_10us( 100 );<br />  SendHalf( 0x02 );<br />  delay_ms( 1 );// _delay_10us( 100 );<br /><br />  RS_write_command( LCD_FUNC | LCD_4_BIT | LCDC_TWO_LINE | LCDC_FONT_5x7);<br />  RS_write_command( LCD_ONOFF | LCD_DISP_ON );<br />  RS_write_command( LCD_CLEAR );<br />  delay_ms( 5 );// _delay_10us( 500 );<br />  RS_write_command( LCDC_ENTRY_MODE | LCD_EM_SHIFT_CURSOR | LCD_EM_RIGHT );<br />  <br />  //////////////////////////////////////////////////////////////////////////////<br /><br />}<br /><br />void LCD_clear_display( void ){                   //czyszczenie ekranu<br /><br />  RS_write_command(LCD_CLEAR);<br />  delay_ms( 5 );// _delay_10us( 5 );<br /><br />}<br />  <br />void LCD_number_line( uint8_t x, uint8_t y ){     <br /><br />  switch(y){<br /><br />    case 0:<br />RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE1 + x ) );<br />        break;<br /> <br />    case 1:<br />RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE2 + x ) );<br />break;<br /><br />  }<br />}<br /><br />void LCD_write( char *text ){<br /><br />  while(*text) RS_write_data( *text++ );<br /><br />}<br /><br />void LCD_x_y_write( uint8_t x, uint8_t y, char *text ){<br /><br />  LCD_number_line( x, y );<br />  RS_write_data( *text );<br /><br />}[/syntax]<br /><br />Żółtym D4, Niebieskim D5<br /><a href="https://obrazkiforum.atnel.pl/20831/96407de28bb072a1eedcfde1844c33b9.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/20831/96407de28bb072a1eedcfde1844c33b9.jpg" alt="Obrazek" /></a><br /><br />Żółtym Enable, Niebieskim D4<br /><a href="https://obrazkiforum.atnel.pl/20831/dee3b2b043b313dd67fc3c99ac6ac5fe.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/20831/dee3b2b043b313dd67fc3c99ac6ac5fe.jpg" alt="Obrazek" /></a><br /><br />Więcej sygnałów nie zauważyłem. Wygląda to tak jakby SendHalf() działał raz, a potem nie reagował na polecenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 1 maja 2020, o 18:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-05-01T14:08:04+01:00</updated>
<published>2020-05-01T14:08:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226810#p226810</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226810#p226810"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226810#p226810"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Widzę tu jeszcze jednego babola. Zamiast operatora sumy bitowej używasz operatora sumy logicznej, &quot;||&quot; zamiast &quot;|&quot;.<br /></div><br />I właśnie przez to porty C nie działały teraz jest na nich napięcie. Tylko wyświetlacz dalej nie chce furgać. Ciekawe bo po zmierzeniu oscyloskopem jest nadawany sygnał. Wyswietlacz działa na 100%, bo sprawdzałem go już gdzieś indziej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 1 maja 2020, o 14:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-05-01T00:33:05+01:00</updated>
<published>2020-05-01T00:33:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226801#p226801</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226801#p226801"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226801#p226801"><![CDATA[
Widzę tu jeszcze jednego babola. Zamiast operatora sumy bitowej używasz operatora sumy logicznej, &quot;||&quot; zamiast &quot;|&quot;.<br />Rejestry BSSR i ODR można używać zamiennie, ale te pierwsze reagują tylko na bit 1, ustawienie odpowiednich pól ustawia lub kasuje właściwy pin i można robić to &quot;atomowo&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 1 maja 2020, o 00:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-30T22:49:07+01:00</updated>
<published>2020-04-30T22:49:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226800#p226800</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226800#p226800"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226800#p226800"><![CDATA[
To ciekawe że porty C nie reagują. Czy jest możliwe spalenie jakoś tych pinów (wszystkie mają oznaczenia FT) przez wyświetlacz HD44780 i normalne działanie innych? Nie używam większego napięcia niż 5V.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 30 kwi 2020, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-04-30T19:12:19+01:00</updated>
<published>2020-04-30T19:12:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226789#p226789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226789#p226789"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226789#p226789"><![CDATA[
Pisząc o literaturze to miałem właśnie na myśli poradnik Szczywronka, bo pod względem pisania na rejestrach jest generalnie posucha <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Mam kilka ogólnie dostępnych książek, ale żadna z nich w tym temacie nie ma wiele do powiedzenia, natomiast &quot;STM32 w systemach sterowania i regulacji&quot; daje trochę wiedzy o asemblerze dla STM32, ale tylko dla F1.<br />Z drugiej strony poradnik jest na tyle kompleksowy, że po jego &quot;'przerobieniu&quot; można już iść własną drogą <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co do ustawień rejestrów GPIO to w poradniku jest zgrabna biiblioteka do ich obsługi co oczywiście nie zwalnia od zrozumienia konfiguracji rejestrów, nie mniej jednak zaglądam w tym temacie do RM sporadycznie i zwykle to wystarcza.<br />Dobrze jest tez mieć RM do serii F0, tam są przykłady do konfiguracji różnych peryferii właśnie na rejestrach, podobnie jak w notach Atmela.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 30 kwi 2020, o 19:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-30T18:40:24+01:00</updated>
<published>2020-04-30T18:40:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226788#p226788</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226788#p226788"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226788#p226788"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Zacznij od dobrego poradnika - tzw &quot;poradnika Szczywronka&quot; - znajdziesz w google. Tam masz wszystko prawie na tacy. Jeśli chcesz bliżej się zapoznać z STM32 to jest to konieczne, żebyś korzystał również z literatury.<br />.<br /></div><br /><br />Polecasz jakąś konkretną książkę do nauki programowania na rejestrach? Odnośnie poradnika Szczywronka to jestem właśnie w trakcie jego przerabiania. Co ciekawe ustawiając 1 na wyjściu PA5 (NUCLEO) również poleceniem GPIOA-&gt;BSRR... dioda działa. Postanowiłem wyłączyć sygnał zegarowy dla GPIOA tak samo porty C nie reagują. Wg manuala powinno to działać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 30 kwi 2020, o 18:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-04-30T13:28:25+01:00</updated>
<published>2020-04-30T13:28:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226780#p226780</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226780#p226780"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226780#p226780"><![CDATA[
Wg mnie błąd robisz przy włączeniu zegarów.<br />Zamiast &quot;|=&quot; dajesz &quot;=&quot; i dlatego w drugiej linii wyłączasz zegar dla portu C oraz inne zegary na tej szynie..<br /><br />To pewnie jeszcze nie wszystko, ale nie zajrzę teraz do RM dla F4.<br />Zacznij od dobrego poradnika - tzw &quot;poradnika Szczywronka&quot; - znajdziesz w google. Tam masz wszystko prawie na tacy. Jeśli chcesz bliżej się zapoznać z STM32 to jest to konieczne, żebyś korzystał również z literatury.<br />Oczywiście jak masz problemy to pytaj na forum, ale wrzucaj nowe watki - to pomoże w przyszłości innym.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 30 kwi 2020, o 13:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-30T11:03:48+01:00</updated>
<published>2020-04-30T11:03:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226776#p226776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226776#p226776"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226776#p226776"><![CDATA[
Nie chce zakładać nowego tematu to tutaj zapytam. Wykonałem bibliotekę do wyświetlacza 2x16 (HD44780). Stm nie zmienia wg stanu na wyjściu (sprawdzone oscyloskopem). Wszystkie LCD_Dx_SET/RESET są w rzeczywistości poleceniem GPIOA-&gt;BSRR = GPIO_BSRR_BS(BR)x. Nie wiem dlaczego tak jest? Chyba ze polecenie ...BSRR... jest tutaj niepoprawne.<br /><br />main.c<br /><br />[syntax=c]#include &quot;stm32f4xx.h&quot;<br />#include &quot;44780_display.h&quot;<br />#include &quot;delay_STM32.h&quot;<br /><br />int main(){<br />  <br />   RCC-&gt;AHB1ENR = RCC_AHB1ENR_GPIOCEN;<br />   RCC-&gt;AHB1ENR = RCC_AHB1ENR_GPIOAEN;<br />   __DSB();<br /><br />   GPIOC-&gt;MODER |= GPIO_MODER_MODE2_0 || GPIO_MODER_MODE3_0 || GPIO_MODER_MODE10_0 || GPIO_MODER_MODE12_0; //linie danych 1,2,3,4<br />   GPIOC-&gt;MODER |= GPIO_MODER_MODE13_0; //pin ENABLE<br />   GPIOC-&gt;MODER |= GPIO_MODER_MODE14_0; //pin RS<br /><br />   GPIOA-&gt;MODER |= GPIO_MODER_MODE5_0;<br /><br />   SysTick_Config(16000000 / 1000);<br /><br />   LCD_init();<br />   LCD_x_y_write(0,0,&quot;C&quot;);<br /><br />   while(1){<br /><br />  <br />  }<br />}[/syntax]<br />plik biblioteczny:<br /><br />[syntax=c]#include &quot;stm32f4xx.h&quot;<br />#include &quot;44780_display.h&quot;<br /><br />extern void delay_ms( uint16_t ms );<br /><br />static void SendHalf( uint8_t data ){     //wysyłanie połowy bajtu<br /><br />  LCD_E_SET;<br />  <br />  if( data &amp; ( 0x01 )) LCD_D4_SET;<br />  else LCD_D4_RESET;<br />  if( data &amp; ( 0x02 )) LCD_D5_SET;<br />  else LCD_D5_RESET;<br />  if( data &amp; ( 0x04 )) LCD_D6_SET;<br />  else LCD_D6_RESET;<br />  if( data &amp; ( 0x08 )) LCD_D7_SET;<br />  else LCD_D7_RESET;<br /><br />  LCD_E_RESET;<br />  <br />}<br /><br />static void SendAll( uint8_t data ){    //wysyłanie całego bajtu<br /><br />  SendHalf( data &gt;&gt; 4 );<br />  SendHalf( data );<br />  delay_ms( 1 ); // delay_10us( 6 );<br /><br />}<br /><br />static void RS_write_command( uint8_t command ){    //wysyłanie komendy<br /><br />  LCD_RS_COMMAND;<br />  SendAll( command );<br />  <br />}<br /><br />static void RS_write_data( char data ){         //wysyłanie danej na wyświetlacz<br /><br />  LCD_RS_DATA; <br />  SendAll( data );<br /><br />}<br /><br />void LCD_init( void ){                          //inicjalizacja LCD<br /><br />  <br />  delay_ms( 15 );// _delay_10us( 1500 );<br />  LCD_E_RESET;<br />  LCD_RS_COMMAND;<br />  SendHalf( 0x03 );<br />  delay_ms( 4 );//_delay_10us( 410 );<br />  SendHalf( 0x03 );<br />  delay_ms( 1 );//_delay_10us( 100 );<br />  SendHalf( 0x02 );<br />  delay_ms( 1 );// _delay_10us( 10 );<br />  <br />  //tutaj inicjalizujemy parametry techniczne wyświetlacza//////////////////////<br /><br />  RS_write_command( LCD_FUNC | LCD_4_BIT | LCDC_TWO_LINE | LCDC_FONT_5x7);<br />  RS_write_command( LCD_ONOFF | LCD_DISP_ON );<br />  RS_write_command( LCD_CLEAR );<br />  delay_ms( 1 );// _delay_10us( 1 );<br />  RS_write_command( LCDC_ENTRY_MODE | LCD_EM_SHIFT_CURSOR | LCD_EM_RIGHT );<br />  <br />  //////////////////////////////////////////////////////////////////////////////<br /><br />}<br /><br />void LCD_clear( void ){                   //czyszczenie ekranu<br /><br />  RS_write_command(LCD_CLEAR);<br />  delay_ms( 1 );// _delay_10us( 5 );<br /><br />}<br />  <br />void LCD_number_line( uint8_t x, uint8_t y ){     <br /><br />  switch(y){<br /><br />    case 0:<br />RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE1 + x ) );<br />        break;<br /> <br />    case 1:<br />RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE2 + x ) );<br />break;<br /><br />    case 2:<br />RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE3 + x ) );<br />break;<br /><br />    case 3:<br />        RS_write_command( LCDC_SET_DDRAM | ( LCD_GO_LINE4 + x ) );<br />        break;<br /><br />  }<br />}<br /><br />void LCD_write( char *text ){<br /><br />  while(*text) RS_write_data( *text++ );<br /><br />}<br /><br />void LCD_x_y_write( uint8_t x, uint8_t y, char *text ){<br /><br />  LCD_number_line( x, y );<br />  RS_write_data( *text );<br /><br />}[/syntax]<br /><br />[syntax=c]#include &quot;stm32f4xx.h&quot;<br /><br />//definicje wejść/wyjść/////////////////////////////////////////////<br /> <br />#define LCD_E_SET         GPIOC-&gt;BSRR = GPIO_BSRR_BS13 <br />#define LCD_E_RESET       GPIOC-&gt;BSRR = GPIO_BSRR_BR13<br /><br />#define LCD_RS_DATA       GPIOC-&gt;BSRR = GPIO_BSRR_BS14<br />#define LCD_RS_COMMAND    GPIOC-&gt;BSRR = GPIO_BSRR_BR14<br /><br />#define LCD_D4_SET        GPIOC-&gt;BSRR = GPIO_BSRR_BS2<br />#define LCD_D5_SET        GPIOC-&gt;BSRR = GPIO_BSRR_BS3<br />#define LCD_D6_SET        GPIOC-&gt;BSRR = GPIO_BSRR_BS10<br />#define LCD_D7_SET        GPIOC-&gt;BSRR = GPIO_BSRR_BS12<br />#define LCD_D4_RESET      GPIOC-&gt;BSRR = GPIO_BSRR_BR2<br />#define LCD_D5_RESET      GPIOC-&gt;BSRR = GPIO_BSRR_BR3<br />#define LCD_D6_RESET      GPIOC-&gt;BSRR = GPIO_BSRR_BR10<br />#define LCD_D7_RESET      GPIOC-&gt;BSRR = GPIO_BSRR_BR12<br /><br />//definicje komend///////////////////////////////////////////////////<br /><br />#define LCD_CLEAR                   0x01<br />#define LCD_HOME                    0x02<br /><br />#define LCDC_ENTRY_MODE             0x04<br />  #define LCD_EM_SHIFT_CURSOR       0x00<br />  #define LCD_EM_SHIFT_DISPLAY      0x01<br />  #define LCD_EM_LEFT               0x00<br />  #define LCD_EM_RIGHT              0x02<br /><br />#define LCD_ONOFF                   0x08<br />  #define LCD_DISP_ON               0x04<br />  #define LCD_CURSOR_ON             0x02<br />  #define LCDC_CURSOR_OFF           0x00<br />  #define LCDC_BLINK_ON             0x01<br />  #define LCDC_BLINK_OFF            0x00<br /><br />#define LCD_SHIFT    0x10<br />  #define LCDC_SHIFT_DISP           0x08<br />  #define LCDC_SHIFT_CURSOR         0x00<br />  #define LCDC_SHIFT_RIGHT          0x04<br />  #define LCDC_SHIFT_LEFT           0x00<br /><br />#define LCD_FUNC    0x20<br />  #define LCD_8_BIT    0x10<br />  #define LCD_4_BIT    0x00<br />  #define LCDC_TWO_LINE    0x08<br />  #define LCDC_FONT_5x10            0x04<br />  #define LCDC_FONT_5x7    0x00<br /><br />#define LCDC_SET_CGRAM    0x40<br />#define LCDC_SET_DDRAM    0x80<br /><br />#define LCD_GO_LINE1     0x00<br />#define LCD_GO_LINE2     0x40<br />#define LCD_GO_LINE3                0x10<br />#define LCD_GO_LINE4                0x50<br /><br />//znaki spoza tablicy ASCII///////////////////////////////////////////<br /><br /> <br />//deklaracje funkcji<br />static void SendHalf( uint8_t data );<br />static void SendAll( uint8_t data );<br />static void RS_write_command( uint8_t command );<br />static void RS_write_data( char data );<br />void LCD_init( void );<br />void LCD_clear( void );<br />void LCD_number_line( uint8_t x, uint8_t y );<br />void LCD_write( char *text );<br />void LCD_x_y_write( uint8_t x, uint8_t y, char *text );[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 30 kwi 2020, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-29T14:52:28+01:00</updated>
<published>2020-04-29T14:52:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226749#p226749</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226749#p226749"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226749#p226749"><![CDATA[
<div class="quotetitle">91suoirfeN napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">matteo9999111 napisał(a):</div><div class="quotecontent">z czasami rzędu [ms] nie ma problemów, ale jakbym chciał zrobić 1[us] niestety nie działa. Czy trzeba już w takiej sytuacji użyć funkcji asemblerowych?<br /></div><br /><br />jeżeli potrzebujesz odmierzać czas w dziesiątkach mikrosekund to kod powyżej jak najbardziej się sprawdzi. Wystarczy bowiem pozwolić kompilatorowi się wykazać i użyć flagi optymalizacji, np. -O2. Należy pamiętać że Cortex-M0 nie należy do najszybszych rdzeni i czasem złomega będzie od niego szybsza w pewnych zastosowaniach. Jest on po prostu znacznie okrojony z instrukcji w porównaniu do M3 czy M4.<br /><br />Jeżeli interesują Cie bardziej dokładne opóźnienia to wpisz w google STM32F0 microsecond delay i poczytaj wyniki</div><br /><br />W tym momencie tworzę na rdzeniu Cortex M4 (dokładnie to na uC STM32F411RE ). Zgadza się przy dziesiątkach us daje radę nawet przy taktowaniu fabrycznym 16MHz. Tylko potrzebne są mi czasy np 2us.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 29 kwi 2020, o 14:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-29T12:27:14+01:00</updated>
<published>2020-04-29T12:27:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226742#p226742</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226742#p226742"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226742#p226742"><![CDATA[
z czasami rzędu [ms] nie ma problemów, ale jakbym chciał zrobić 1[us] niestety nie działa. Czy trzeba już w takiej sytuacji użyć funkcji asemblerowych?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 29 kwi 2020, o 12:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2020-04-29T07:48:42+01:00</updated>
<published>2020-04-29T07:48:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226732#p226732</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226732#p226732"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226732#p226732"><![CDATA[
<div class="quotetitle">fofex napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">   ...<br />            register uint16_t n;<br />            n = softTimer1;         if (n) softTimer1 = --n;<br /></div><br /><br />Użycie zmiennej pośredniej jest w przypadku Cortexów niepotrzebne. <br />W przypadku AVR obecnie też.<br /><br />Wystarczy<br />[syntax=c]void SysTick_Handler( void )<br />{<br />         if(n) {<br />               --n;<br />        }<br /> }[/syntax]<br /><br />Albo bardziej cywilizowanie<br /><br />[syntax=c]void SysTick_Handler( void )<br />{<br />         tickThatSoftTimer();<br /> }<br />...<br />static uint16_t thatTimerCounter;<br />void tickThatSoftTimer(void)<br />{<br />     if(thatTimerCounter) {<br />         --thatTimerCounter;<br />     }<br />}[/syntax]</div><br /><br />Zapomniałeś o volatile przy definicji thatTimerCounter<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 29 kwi 2020, o 07:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-04-28T19:21:20+01:00</updated>
<published>2020-04-28T19:21:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226726#p226726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226726#p226726"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226726#p226726"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />...<br />            register uint16_t n;<br />            n = softTimer1;         if (n) softTimer1 = --n;<br /></div><br /><br />Użycie zmiennej pośredniej jest w przypadku Cortexów niepotrzebne. <br />W przypadku AVR obecnie też.<br /><br />Wystarczy<br />[syntax=c]void SysTick_Handler( void )<br />{<br />         if(n) {<br />               --n;<br />        }<br /> }[/syntax]<br /><br />Albo bardziej cywilizowanie<br /><br />[syntax=c]void SysTick_Handler( void )<br />{<br />         tickThatSoftTimer();<br /> }<br />...<br />static uint16_t thatTimerCounter;<br />void tickThatSoftTimer(void)<br />{<br />     if(thatTimerCounter) {<br />         --thatTimerCounter;<br />     }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 28 kwi 2020, o 19:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-28T18:04:42+01:00</updated>
<published>2020-04-28T18:04:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226724#p226724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226724#p226724"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226724#p226724"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Robię to tak:<br />1. Ustawiam Systick na przerwanie co 1 ms:<br />[syntax=c]SysTick_Config( 48000000/1000 );[/syntax]<br />48000000 to oczywiście częstotliwość uK, a potrzebne są standardowe nagłówki z CMSIS.<br />Mam więc uruchomiony silnik timerów programowych, podobnie jak w bluebook.<br /></div><br />Dlaczego jak dzielisz 48Mhz / 1000 to wychodzi ci 1ms? Mi wychodzi co 1ms jak podzielisz 48MHz/48000. Jak coś źle napisałem to prosze mnie poprawić.<br /><br />W jakim celu są te softtime. Jak one działają?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 28 kwi 2020, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2020-04-28T17:42:36+01:00</updated>
<published>2020-04-28T17:42:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226723#p226723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226723#p226723"/>
<title type="html"><![CDATA[Re: Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226723#p226723"><![CDATA[
Robię to tak:<br />1. Ustawiam Systick na przerwanie co 1 ms:<br />[syntax=c]SysTick_Config( 48000000/1000 );[/syntax]<br />48000000 to oczywiście częstotliwość uK, a potrzebne są standardowe nagłówki z CMSIS.<br />Mam więc uruchomiony silnik timerów programowych, podobnie jak w bluebook.<br />W przerwaniu od Systicka może być np taki kod:<br />[syntax=c]volatile uint16_t softTimer1, softTimer2, delayTimer;<br /><br />void SysTick_Handler( void ) {<br />register uint16_t n;<br />n = softTimer1; if (n) softTimer1 = --n;<br />n = softTimer2; if (n) softTimer2 = --n;<br />n = delayTimer;  if (n) delayTimer = --n;<br />}<br />/*********************************************************/<br />void delay_ms( uint16_t ms ) {<br />delayTimer = ms;<br />while ( delayTimer ) {__NOP();}<br />}[/syntax]<br /><br />Oczywiście trzba wyprowadzić funkcj na zewnątrz:<br />[syntax=c]extern uint16_t softTimer1;<br />extern uint16_t softTimer2;<br />extern uint16_t delayTimer ;<br /><br />extern void delay_ms( uint16_t ms );[/syntax]<br /><br />Po takim przygotowaniu mamy funkcję blokującą <strong>delay_ms()</strong> oraz dwie zmienne, <strong>softTimer1</strong>, <strong>softTimer2 </strong>do opóźnień nieblokujących.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 28 kwi 2020, o 17:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matteo9999111]]></name></author>
<updated>2020-04-28T16:41:56+01:00</updated>
<published>2020-04-28T16:41:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226719#p226719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226719#p226719"/>
<title type="html"><![CDATA[Odmierzanie czasu STM32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23069&amp;p=226719#p226719"><![CDATA[
Witam. Mam problem z odmierzaniem czasu w programie uC (STM32 rejestry). W jaki sposób wykonać prosty timer nierobiący nic poza czekaniem ten czas który mu zadam typu AVR - delay_ms(jakis_czas). Potrzebuje używać tego timera zarówno w main.c jak i bibliotekach. Myślałem nad SysTickiem tylko nwm jak mogę go wykożystać, aby działał mi we wszystkich bibliotekach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20831">matteo9999111</a> — 28 kwi 2020, o 16:41</p><hr />
]]></content>
</entry>
</feed>