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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7361&amp;mode</id>
<entry>
<author><name><![CDATA[skoomi]]></name></author>
<updated>2014-06-09T20:12:34+01:00</updated>
<published>2014-06-09T20:12:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83886#p83886</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83886#p83886"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego/ i inne ;)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83886#p83886"><![CDATA[
No to rzeczywiście całkiem coś sknociłem:D No nic, będę próbował to ogarnąć. Zaraz zresztą zamówię Greenbooka.<br /><br />Przepraszam że zmienię teraz temat ale ponieważ goni mnie czas to wpadłem na pomysł zastosowania komunikacji w trybie &quot;pollingu&quot;. Myślę że to wystarczy do mojego projektu aż nadto, ponieważ do pcta będę wysyłał dane tylko na zawołanie użytkownika, a slejwy będę odpytywał co 5 minut.<br /><br /><br />Mam teraz dziwny problem z menu. Na końcu pętli głównej jest instrukcja LCD_GoTo(0,1); Jest ona tam zupełnie niepotrzebna, jednak bez niej po naciśnięciu klawisza0 nie otwiera się menu. Niby dlaczego? Chodzi o opóźnienie jakie ona wprowadza?<br />Wiem że obsługa klawiszy w przerwaniach zewnętrznych to kpina, ale będą tylko te dwa klawisze i zrobiłem to na szybko!<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br />#include &quot;TWI.h&quot;<br />#include &quot;mkuart.h&quot;<br />#include &quot;PetitFS/diskio.h&quot;<br />#include &quot;PetitFS/pff.h&quot;<br />#include &quot;flagi.h&quot;<br /><br />#define SCK PB7<br />#define MOSI PB5<br />#define CS PB4<br /><br />//PORTC |= (1&lt;&lt;PD3) - ustawienie 1 na PD3<br />//PORTC &amp;= ~(1&lt;&lt;PD3) -  ustawienie 0 na PD3<br />//PORTC ^= (1&lt;&lt;PD3) - zmiana stanu PD3 na przeciwny<br />char file_name&#91;&#93; = &quot;pomiary.txt&quot;; // nazwa pliku na karcie pamięci<br />char bufor&#91;16&#93;;<br /><br />void wyswietl_czas();// funkcja pobierająca czas z RTC i wyświetlająca na LCD<br />void wyswietl_data(uint16_t *);// funkcja pobierająca datę z RTC i wyświetlająca na LCD<br /><br /><br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br />int main(){ //<br /><br />//inicjalizacja<br />LCD_Initalize();//inicjalizacja wyświetlacza LCD<br />LCD_Clear();//wyczyszczenie wyświetlacza<br />i2cSetBitrate(100);//ustawienie prędkości transmisji I2C<br />RTC_init();//inicjalizacja RTC<br />USART_Init( __UBRR );//inicjalizacja USART<br /><br />//włączenie przerwań zewnętrznych INT 0 i INT 1 przy opadającym zboczu<br />MCUCR |= (1&lt;&lt;ISC11) | (1&lt;&lt;ISC01);<br />GICR |= (1&lt;&lt;INT1)|(1&lt;&lt;INT0);<br />sei();//globalne odblokowanie przerwań<br /><br />//Do obsługi karty<br />BYTE res;<br />WORD s1;<br />FATFS fs;// File system object<br />//DIR dir;// Directory object<br />//FILINFO fno;// File information<br /><br />DDRB |= (1&lt;&lt;CS)|(1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />PORTB |= (1&lt;&lt;CS);<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br /><br /><br />//Wpisanie czasu i daty do zegarka<br />uint16_t rok_przestepny=2014; //należy podać ostatni rok przestępny<br />RTC_set_time (00, 21, 20);<br />RTC_set_date (2014, 6, 8);<br /><br />DDRD &amp;= ~(1&lt;&lt;PD3);<br />DDRD &amp;=~(1&lt;&lt;PD2);<br />PORTD |=(1&lt;&lt;PD3)|(1&lt;&lt;PD2);//podciąganie na liniach klawiszy<br /><br /><br />//flagi<br />wejdzMenu=0;<br />wejdzPodmenu=0;<br />wyborPodmenu=1;<br />podmenu1Wyswietlone=0;<br />podmenu2Wyswietlone=0;<br />podmenu3Wyswietlone=0;<br />flagaS1=0;<br />flagaS2=0;<br />flagaS3=0;<br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br />///////////////////////////////////////////////////////////////////////<br /><br />//Pętla główna programu<br /><br />while(1)<br />{<br />if(flagaS1==1)//flaga flagaS1 będzie ustawiana co 5 minut<br />{<br />//tu będzie wysłanie zapytanie do slejwa,<br />//poczekanie na odpowiedź<br />//wysłanie do niego instrukcji<br />//reset flagi flagaS1 - informacja że już w tych 5 minutach to się wykonało<br />}<br />if(flagaS2==1)<br />{<br /><br />}<br />if(flagaS3==1)<br />{<br /><br />}<br /><br /><br /><br />if(wejdzMenu==1)<br />{<br /><br />switch (wyborPodmenu)<br />{<br />case 1:<br />{<br />podmenu3Wyswietlone=0;<br />if(podmenu1Wyswietlone==0)<br />{<br />LCD_GoTo(0,0);<br />LCD_Clear();<br />LCD_WriteText(&quot;Data i godzina&quot;);<br />podmenu1Wyswietlone=1;<br />}<br />if(wejdzPodmenu==1)<br />{<br />podmenu1Wyswietlone=0;<br />LCD_Clear();<br />wyswietl_czas();<br />wyswietl_data(&amp;rok_przestepny);<br />wejdzPodmenu=0;<br />wejdzMenu=0;<br />}<br />break;<br />}<br />case 2:<br />{<br />podmenu1Wyswietlone=0;<br />if(podmenu2Wyswietlone==0)<br />{<br />LCD_GoTo(0,0);<br />LCD_Clear();<br />LCD_WriteText(&quot;Druga opcja&quot;);<br />podmenu2Wyswietlone=1;<br />}<br />if(wejdzPodmenu==1)<br />{<br />podmenu2Wyswietlone=0;<br />LCD_Clear();//TU SIE WYKONUJE COS PO WYBORZE OPCJI 2<br />LCD_WriteText(&quot;Sie zrobi&quot;);//<br />wejdzPodmenu=0;<br />wejdzMenu=0;<br />}<br />break;<br />}<br />case 3://Wyjscie z menu<br />{<br />podmenu2Wyswietlone=0;<br />if(podmenu3Wyswietlone==0)<br />{<br />LCD_GoTo(0,0);<br />LCD_Clear();<br />LCD_WriteText(&quot;Wyjscie&quot;);<br />podmenu3Wyswietlone=1;<br />}<br />if(wejdzPodmenu==1)<br />{<br />podmenu3Wyswietlone=0;<br />LCD_Clear();<br />wejdzPodmenu=0;<br />wejdzMenu=0;<br />break;<br />}<br />break;<br />}<br />}<br />}<br /><br />LCD_GoTo(0,1);<br />//LCD_WriteText(&quot;WejdzMenu=&quot;);<br />//LCD_WriteInt(wejdzMenu);<br />//LCD_WriteText(&quot;P=&quot;);<br />//LCD_WriteInt(wejdzPodmenu);<br />//LCD_WriteText(&quot;W&quot;);<br />//LCD_WriteInt(wyborPodmenu);<br />}<br />//Koniec pętli głównej<br />return 0;<br />}<br /><br />ISR( INT0_vect ) {<br />if(wejdzMenu==1) wejdzPodmenu=1;<br />if(wejdzMenu==0) wejdzMenu=1;<br />}<br />ISR( INT1_vect ) {<br />wyborPodmenu++;<br />if (wyborPodmenu&gt;3) wyborPodmenu=1;<br />}<br /><br /><br />void wyswietl_czas()<br />{<br />uint8_t sekundy;<br />uint8_t minuty;<br />uint8_t godziny;<br />RTC_read_time(&amp;sekundy, &amp;minuty, &amp;godziny);<br />LCD_GoTo(0,0);<br />if(godziny&lt;10) {<br />LCD_WriteInt(0);<br />LCD_WriteInt(godziny);<br />}<br />else LCD_WriteInt(godziny);<br />LCD_WriteChar(':');<br />if(minuty&lt;10) {<br />LCD_WriteInt(0);<br />LCD_WriteInt(minuty);<br />}<br />else LCD_WriteInt(minuty);<br />LCD_WriteChar(':');<br />if(sekundy&lt;10) {<br />LCD_WriteInt(0);<br />LCD_WriteInt(sekundy);<br />}<br />else LCD_WriteInt(sekundy);<br />}<br /><br />void wyswietl_data(uint16_t *rok_przestepny)<br />{<br />uint8_t dzien;<br />uint8_t miesiac;<br />uint16_t rok;<br />uint16_t rok_prze=*rok_przestepny;<br />RTC_read_date(&amp;rok_prze, &amp;rok, &amp;miesiac, &amp;dzien);<br />LCD_GoTo(0,1);<br />if(dzien&lt;10) {<br />LCD_WriteInt(0);<br />LCD_WriteInt(dzien);<br />}<br />else LCD_WriteInt(dzien);<br />LCD_WriteChar('-');<br />if(miesiac&lt;10) {<br />LCD_WriteInt(0);<br />LCD_WriteInt(miesiac);<br />}<br />else LCD_WriteInt(miesiac);<br />LCD_WriteChar('-');<br />LCD_WriteInt(rok);<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4220">skoomi</a> — 9 cze 2014, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-09T13:38:39+01:00</updated>
<published>2014-06-09T13:38:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83824#p83824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83824#p83824"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego (rs 232)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83824#p83824"><![CDATA[
<div class="quotetitle">skoomi napisał(a):</div><div class="quotecontent"><br />Wydaje mi się, że to właśnie po to, aby wiedzieć kiedy przeszła już cała wiadomość.<br /></div><br /><br />Absolutnie nie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />zwraca zero gdy nie ma nic w buforze - więc jakoś totalnie odwrotnie coś zrozumiałeś<br /><br />więc w twoich próbach powinien być jakiś if ... i gdy zwraca zero to ignorujesz<br /><br />dla ciebie wyznacznikem że coś jest w buforze powinno być to gdy ta funkcja zwróci wartość większą niż 31 (dziesiętnie) ... czyli począwszy od spacji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 cze 2014, o 13:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skoomi]]></name></author>
<updated>2014-06-09T13:23:40+01:00</updated>
<published>2014-06-09T13:23:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83822#p83822</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83822#p83822"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego (rs 232)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83822#p83822"><![CDATA[
Przyjąłem! Dzięki za cenne wskazówki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4220">skoomi</a> — 9 cze 2014, o 13:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2014-06-09T13:19:04+01:00</updated>
<published>2014-06-09T13:19:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83821#p83821</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83821#p83821"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego (rs 232)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83821#p83821"><![CDATA[
Kolego skoomi. Nigdy ale przenigdy nie umieszczaj pisania po lcd'ku w pętli głównej, bo nic innego nie robisz jak tylko przenosisz kursor na pozycję (0,1) i coś tam od tej pozycji wpisujesz lub nie w zależności od bajty[]. A może by tak jakąś flagę sprawdzać i potem dopiero pisać na lcd'ku? Zastanów się w którym momencie potrzebne ci jest przeniesienie kursora na początek linii? Do tego może też jakaś flaga by się przydała albo jakiś specyficzny kod w buforze?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 9 cze 2014, o 13:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skoomi]]></name></author>
<updated>2014-06-09T13:11:54+01:00</updated>
<published>2014-06-09T13:11:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83820#p83820</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83820#p83820"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego (rs 232)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83820#p83820"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />nie zastanowiło cię że ta funkcja zwraca zero gdy nic nie będzie odebrane ?<br /></div><br />Wydaje mi się, że to właśnie po to, aby wiedzieć kiedy przeszła już cała wiadomość.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />o żesz matko erychejska <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... jaka kosmiczna teoria<br /></div><br />Już ją kasuję z głowy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Tylko dlaczego w takim razie ten delay pomógł?<br /><br />Niestety Greenbooka jeszcze nie mam. Dzięki za wskazówkę czego szukać. Mam nadzieję, że coś z tego wyjdzie. Odezwę się później, bo pewnie coś mnie przerośnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4220">skoomi</a> — 9 cze 2014, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-09T12:59:02+01:00</updated>
<published>2014-06-09T12:59:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83818#p83818</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83818#p83818"/>
<title type="html"><![CDATA[Re: Problem z odczytem z bufora cyklicznego (rs 232)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83818#p83818"><![CDATA[
<div class="quotetitle">skoomi napisał(a):</div><div class="quotecontent"><br />Otóż kolejne bajty wpadają do UDR dość powoli bo co około 1ms(wartość obliczona na jakiejś innej stronce, więc nie wiem czy to prawda...),<br /></div><br /><br />o żesz matko erychejska <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... jaka kosmiczna teoria <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />nie nie Panie kolego ... bufor jest po to żeby była najbardziej sprawna obsługa i od TEGO się zaczyna myślenie o komunikacji RS232<br /><br />a to że masz kłopot z obsługą tego na nieco już wyższym poziomie bo obróbki nadsyłanych danych to już CAAAAAAŁKIEM inne zagadnienie<br /><br />poszukaj ciut na forum ... jeśli nie masz Greenbooka w którym to dalej jest wyjaśniane w ostatnim rozdziale. Bo na forum co i rusz szczególnie pojawia się temat odbioru danych z bufora cyklicznego ... gorzej tylko jak w grę zaczynają wchodzić takie pomysły o powolnym odbieraniu 1ms ! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... to byłaby dopiero masakra<br /><br />Wskazówka? .... poczytaj sobie najpierw DOKŁADNIE jeszcze raz cały rozdział o buforowaniu cyklicznym i o tym jak po kolei budujemy tę obsługę, bo coś czuję że przeleciałeś jak burza ... a widać to po sposobie w jaki próbujesz posługiwać się funkcją uart_getc() .... A jak czegoś nie będziesz rozumiał to dopytaj ....<br /><br />nie zastanowiło cię że ta funkcja zwraca zero gdy nic nie będzie odebrane ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 cze 2014, o 12:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skoomi]]></name></author>
<updated>2014-06-09T20:03:55+01:00</updated>
<published>2014-06-09T12:35:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83815#p83815</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83815#p83815"/>
<title type="html"><![CDATA[Problem z odczytem z bufora cyklicznego/ i inne ;)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7361&amp;p=83815#p83815"><![CDATA[
Czołem,<br />od wczoraj męczę się z transmisją po rs232. Korzystam z kodu z niebieskiej płytki.<br />Otóż jest tam bufor, który jest uzupełniany za każdym razem kiedy coś pojawi się w UDR i tym samym wywoła przerwanie.<br />Problemem jest dla mnie ściąganie tych danych z bufora w mainie.<br />Mam taką pętlę:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">while(1)<br />   {<br /><br />      do<br />      {i++;<br />      bajty&#91;i-1&#93;=uart_getc();<br />      }while(bajty&#91;i-1&#93;!=0);<br />      i=0;<br />      <br />      LCD_GoTo(0,1);<br />      LCD_WriteText(bajty);<br />      uart_puts(bajty);<br /><br />   }</div><br />I niestety nie działa to poprawnie. Po analizie doszedłem nawet dlaczego(chyba:D). Otóż kolejne bajty wpadają do UDR dość powoli bo co około 1ms(wartość obliczona na jakiejś innej stronce, więc nie wiem czy to prawda...), a pętla zaiwania dużo szybciej. Przez to kiedy wpada pierwszy bajt, pętla do...while przelatuje i się kończy zanim wpadnie drugi. Potem ten jeden jest wyświetlany i znów wpada kolejny bajt(może nawet po kilku obiegach głównego while) i tak w kółko. Przez to tablica bajty jest cały czas nadpisywana i na wyświetlaczu mam tylko ostatni znak tego co wysyłam z terminala.<br /><br />Rozwiązuje to dodatnie delaya do pętli np:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">while(1)<br />   {<br /><br />      do<br />      {i++;<br />                _delay_ms(3);<br />      bajty&#91;i-1&#93;=uart_getc();<br />      }while(bajty&#91;i-1&#93;!=0);<br />      i=0;<br />      <br />      LCD_GoTo(0,1);<br />      LCD_WriteText(bajty);<br />      uart_puts(bajty);<br /><br />   }</div><br /><br />Ale wydaje mi się że nie tędy droga. Może ktoś mnie naprowadzić na właściwą trasę?<br /><br />Może by jakąś flagę ustawiać kiedy cała wiadomość jest już w buforze i dopiero wtedy ją pobierać z bufora? <br />No kurcze nie mogę wpaść na pomysł jak to rozwiązać...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4220">skoomi</a> — 9 cze 2014, o 12:35</p><hr />
]]></content>
</entry>
</feed>