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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-28T11:43:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10703&amp;mode</id>
<entry>
<author><name><![CDATA[lukanio]]></name></author>
<updated>2015-05-28T11:43:45+01:00</updated>
<published>2015-05-28T11:43:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=130295#p130295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=130295#p130295"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=130295#p130295"><![CDATA[
Ja mam jeszcze jeden problem<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/2492/dcfb7a03574ee3efd18d4249f69c3d33.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2492/dcfb7a03574ee3efd18d4249f69c3d33.JPG" alt="Obrazek" /></a><br /><br />i nie bardzo mogę znaleźć rozwiązanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2492">lukanio</a> — 28 maja 2015, o 11:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-19T00:33:12+01:00</updated>
<published>2015-02-19T00:33:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119788#p119788</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119788#p119788"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119788#p119788"><![CDATA[
Dziękuję panowie, wreszcie działa jak należy. Udało mi się napisać odbieranie stringów oraz jednoczesne echo w konsoli - działa bardzo fajnie. Tylko teraz męczę się z funkcją strcmp, bo nijak nie chce stwierdzić że wpisany ciąg znaków jest identyczny z zadeklarowanym.<br />[syntax=c]int main (void)<br />{<br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();// globalne odblokowanie przerwań<br />    uart_puts(&quot;Mikroprocesor zainicjowany poprawnie&quot;);<br />    uart_putc('\r');<br />    uart_putc('\n');<br /><br />    extern volatile uint8_t uartFLAG;<br />    char uartRXbuffer&#91;UART_RX_BUF_SIZE&#93;;<br />    char changeRelay1&#91;&#93; = &quot;AT+REL1&quot;;<br />    DDRC |= (1&lt;&lt;PC0);<br /><br />    while(1)<br />    {<br /><br />    if(uartFLAG)<br />    {<br />    for (int i=0; i&lt;UART_RX_BUF_SIZE; i++)<br />    {<br />    uartRXbuffer&#91;i&#93;=uart_getc();<br />    }<br />    uartFLAG--;<br />    uart_putint(strcmp(changeRelay1,uartRXbuffer), 10);<br />    }<br />    }<br />}[/syntax]<br /><br />[syntax=c]ISR( USART_RX_vect ) {<br />    uint8_t tmp_head;<br />    char data;<br /><br />    data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    if(data == 0x0d) {<br />    uart_puts(&quot;\r\n&quot;);<br />    uartFLAG++;<br />    }<br />    else uart_putc(data);<br /><br /> // obliczamy nowy indeks „głowy węża”<br /> dalszy kod...[/syntax]<br />W załączniku podgląd z konsoli.<br /><a href="http://forum.atnel.pl/_obrazki/o/636/fdf518e61482eba49260cd9be96dd6f0.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/636/fdf518e61482eba49260cd9be96dd6f0.png" alt="Obrazek" /></a><br />Aha - jeżeli po warunku &quot;if(uartFLAG)&quot; chcę wypisać zawartość tablicy za pomocą <br />[syntax=c]for (int i=0; i&lt;UART_RX_BUF_SIZE; i++)<br />    {<br />    uart_putc(uartRXbuffer&#91;i&#93;);<br />    }[/syntax]<br />To wszystko zgadza się z wcześniej wpisanym ciągiem.<br /><br /><br />EDIT<br />Może komuś się przyda - napisałem własną funkcję porównującą tablice. Pierwsza tablica musi być krótsza lub równa drugiej. Ja potrzebowałem w takiej postaci, ale nic nie stoi na przeszkodzie by pierwsze sprawdzić czy ich długości są takie same.<br />[syntax=c]int compareChars(char *char1, char *char2)<br />{<br />int lenght = 0;<br />int tempor = 0;<br />while( char1&#91;lenght&#93; != '\0' ) ++lenght;<br /><br />for(int i=0; i&lt;lenght; i++)<br />{<br />if(char1&#91;i&#93;==char2&#91;i&#93;)<br />{<br />tempor++;<br />}<br />}<br />if (tempor == lenght) return 1;<br />else return 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 19 lut 2015, o 00:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matw]]></name></author>
<updated>2015-02-18T10:52:22+01:00</updated>
<published>2015-02-18T10:52:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119652#p119652</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119652#p119652"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119652#p119652"><![CDATA[
@MrDarkenRahl, jeśli ciało funkcji USART_Init(), jest takie jak podałeś w pierwszym poście to, jest ono niekompletne i brakuje w nim ustawienia bitu odpowiadającego za wywołanie przerwania po odebraniu danych.<br /><br />[syntax=c]UCSR0B |= (1&lt;&lt;RXCIE0);[/syntax]<br /><br />Edit: spóźniłem się z odpowiedzą, Mirek już cię ładnie naprowadził, gdzie szukać problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Edit2: Poza tym wypatrzyłem, że ustawiając bity w rejestrach nie stosujesz sum logicznych, a to może powodować niekontrolowane problemy jeśli robi się to nieświadomie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2394">matw</a> — 18 lut 2015, o 10:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-18T10:46:06+01:00</updated>
<published>2015-02-18T10:46:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119649#p119649</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119649#p119649"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119649#p119649"><![CDATA[
<div class="quotetitle">MrDarkenRahl napisał(a):</div><div class="quotecontent"><br />Jest inicjacja UARTU bez kombinowania<br /></div><br />Właśnie, że zrobiłeś z kombinowaniem i to mocnym <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">MrDarkenRahl napisał(a):</div><div class="quotecontent"><br />Nadawanie w przerwaniu działa<br /></div><br />To przeanalizuj dlaczego działa ... co powoduje że działa .... (podpowiedź! - czy przypadkiem nie jest ustawiany jakiś bit w jakimś rejestrze odpowiedzialny &quot;za coś&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ).... W książce też jest to opisane<br /><br /><div class="quotetitle">MrDarkenRahl napisał(a):</div><div class="quotecontent"><br />więc problemem jest tylko odbiór.<br /></div><br />Dokładnie bo przerwanie nie działa (podpowiedź: bo nie jest odblokowane?) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />zajrzyj że do książki, do DVD ... do inicjalizacji i zobacz swoje kombinacje <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> — 18 lut 2015, o 10:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-18T10:36:31+01:00</updated>
<published>2015-02-18T10:36:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119647#p119647</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119647#p119647"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119647#p119647"><![CDATA[
[syntax=c]int main (void)<br />{<br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();// globalne odblokowanie przerwań<br />    uart_puts(&quot;Mikroprocesor zainicjowany poprawnie&quot;);<br />    uart_putc('\r');<br />    uart_putc('\n');[/syntax]<br />Jest inicjacja UARTU bez kombinowania, gdzie __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1) <br />Nadawanie w przerwaniu działa, więc problemem jest tylko odbiór. Tylko nigdzie nie widzę błędu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 18 lut 2015, o 10:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-18T08:18:14+01:00</updated>
<published>2015-02-18T08:18:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119617#p119617</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119617#p119617"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119617#p119617"><![CDATA[
<div class="quotetitle">MrDarkenRahl napisał(a):</div><div class="quotecontent"><br />4. zła funkcja inicjująca UART - i prawdopodobnie tutaj leży pies pogrzebany,<br /></div><br />Bingo!<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Widzisz - praktycznie sam dochodzisz do rozwiązania problemu, to teraz pomyśl, co trzeba zrobić żeby jakieś przerwanie zaczęło działać ?<br /><br />jakie (podpowiadam DWA kroki trzeba wykonać?) <br /><br />1. xxxxx<br />2. sei();<br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />przy okazji sprawdź w Bluebooku jak inicjalizuje się UART do pracy ... ale na przerwaniach<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 lut 2015, o 08:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-18T00:19:42+01:00</updated>
<published>2015-02-18T00:19:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119605#p119605</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119605#p119605"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119605#p119605"><![CDATA[
1. zły wektor (ale USART_RX_vect jest poprawny dla Atmegi328p)<br />2. nieodblokowane zezwolenie przerwań sei() (ale ja odblokowałem)<br />3. oczekiwania w przerwaniu - nie zrobiłem żadnej funkcji delay w przerwaniu<br />4. zła funkcja inicjująca UART - i prawdopodobnie tutaj leży pies pogrzebany, ale nie mam pomysłu co mogłem zrobić źle.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 18 lut 2015, o 00:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-17T23:45:16+01:00</updated>
<published>2015-02-17T23:45:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119604#p119604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119604#p119604"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119604#p119604"><![CDATA[
<div class="quotetitle">MrDarkenRahl napisał(a):</div><div class="quotecontent"><br />Czyli to wina przerwania.<br /></div><br />No jak wina przerwania ?<br /><br />a co może być winne przerwanie - masz prostą podpowiedź - nie działa przerwanie - to teraz trzeba znaleźć przyczynę dlaczego<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />co może być powodem że nie działa ?<br /><br />wypunktuj możliwe przyczyny<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lut 2015, o 23:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-17T23:34:29+01:00</updated>
<published>2015-02-17T23:34:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119603#p119603</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119603#p119603"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119603#p119603"><![CDATA[
Nie działa, tzn dałem <br />[syntax=c]ISR( USART_RX_vect ) {<br />PORTD |= (1&lt;&lt;PD2);<br />    uint8_t tmp_head;<br />    char data;<br /><br />...[/syntax]<br />Pin ustawiony wcześniej jako wyjściowy, stan pinu nie zmienia się na wysoki nawet kiedy coś piszę do Atmegi, w żadnym innym miejscu nie zmieniałem stanu tego pinu (a to na pewno działa, bo jeżeli w pętli głównej wsadzę PORTD |= (1&lt;&lt;PD2); to na pinie mam stan wysoki). Czyli to wina przerwania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 17 lut 2015, o 23:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-17T23:15:25+01:00</updated>
<published>2015-02-17T23:15:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119601#p119601</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119601#p119601"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119601#p119601"><![CDATA[
sprawdzałeś metodą Debugera na jednej diodzie LED czy działa ci np przerwanie odbiorcze ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />pytam bo może masz po prostu np nie podłączony jakiś przewód od RX procka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lut 2015, o 23:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-17T23:14:21+01:00</updated>
<published>2015-02-17T23:14:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119600#p119600</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119600#p119600"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119600#p119600"><![CDATA[
Tak, Atmega po restarcie wysyła tekst &quot;Mikroprocesor zainicjowany poprawnie&quot;, bo przed pętlą nieskończoną jest [syntax=c]uart_puts(&quot;Mikroprocesor zainicjowany poprawnie&quot;);<br />    uart_putc('\r');<br />    uart_putc('\n');[/syntax]<br />Jeżeli w pętli nieskończonej wpiszę  uart_putc(&quot;test&quot;); to również działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 17 lut 2015, o 23:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-17T22:56:22+01:00</updated>
<published>2015-02-17T22:56:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119594#p119594</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119594#p119594"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119594#p119594"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />zresztą nawet w Bluebooku masz przykład jak odbierać pojedyncze znaki taką metodą jak tu opisuję ... (rozdział z przykładem wielozadaniowym) - zajrzyj<br /></div><br />Zmieniłem tylko pętlę główną na:<br />[syntax=c]char input;<br />    while(1)<br />    {<br />    input = uart_getc();<br /><br />    if(input=='1') uart_puts(&quot;1\r\n&quot;);<br />    else<br />    if(input=='2') uart_puts(&quot;2\r\n&quot;);<br />    else<br />    if(input=='3') uart_puts(&quot;3\r\n&quot;);<br /><br />    }[/syntax]<br />I niestety dalej nie działa. Na stringi przyjdzie pora, ale na razie nawet jeden znak nie chce mi działać <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 17 lut 2015, o 22:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-17T22:44:23+01:00</updated>
<published>2015-02-17T22:44:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119591#p119591</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119591#p119591"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119591#p119591"><![CDATA[
ale pętla główna wykonuje się setki tysięcy razy na sekundę, ty do tego wszystkiego wstrzymujesz ją jak pługiem - funkcją delay na wieczność czyli 1 sekundę (ale uwierz mi nawet 10ms to wciąż wieczność będzie) ...<br /><br />kompletnie nie tak podchodzisz do odbioru stringów ... no ale też nie ma co się dziwić, gdy człowiek zaczyna przygodę z programowaniem to nie od razu przecież wszystko sam wymyśli ... <br /><br />dlatego ja .... coś takiego co się nazywa &quot;odbiór i parsowanie stringów&quot; bo do tego dążysz tylko jeszcze nie nazwałeś sam tego .... opisałem w drugiej książce - ponieważ wg mnie do w pełni poprawnego sposobu realizacji tego mechanizmu warto przyswoić sobie callbacki, zdarzenia itp ...<br /><br />ty zaś rozważ sobie na początek prostszy mechanizm, w oparciu o to co masz z Bluebooka, bo też da radę coś zrobić (zresztą jest już wiele przykładów na tym forum jak inni sobie poradzili gdy w końcu zrozumieli że nadszedł czas aby umieć odbierać i jeszcze analizować stringi.<br /><br />dlatego na początek wywal w diabły delaja z pętli głównej, <br /><br />sprawdzaj w warunku w tejże pętli głównej czy c w końcu jest różne od zera, no bo to będzie oznaczało że w końcu nadleciał twój upragniony znak z terminala (nie koniecznie ten co trzeba no ale jakiś znak w ogóle) ... a gdy będzie c równe zero to pętla może sobie zapierniczać<br /><br />a w tym warunku jak już zobaczysz że nadleciał znak - to porównaj sobie c z takim znakiem jaki ci odpowiada i wtedy go wyświetl albo zrób co chcesz ....<br /><br />zresztą nawet w Bluebooku masz przykład jak odbierać pojedyncze znaki taką metodą jak tu opisuję ... (rozdział z przykładem wielozadaniowym) - zajrzyj<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lut 2015, o 22:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-17T22:33:27+01:00</updated>
<published>2015-02-17T22:33:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119586#p119586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119586#p119586"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119586#p119586"><![CDATA[
Zwraca 0 jeżeli ogon i głowa węża są jednakowe (ale ja nie przesyłam aż tyle danych żeby zapełnić węża), a jeżeli są różne to zwraca pojedynczy znak z bufora.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 17 lut 2015, o 22:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-17T22:11:25+01:00</updated>
<published>2015-02-17T22:11:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119581#p119581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119581#p119581"/>
<title type="html"><![CDATA[Re: Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119581#p119581"><![CDATA[
c = uart_getc();<br /><br />obejrzyj dokładnie jak działa ta funkcja i co ona zwraca<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lut 2015, o 22:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MrDarkenRahl]]></name></author>
<updated>2015-02-17T22:04:35+01:00</updated>
<published>2015-02-17T22:04:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119577#p119577</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119577#p119577"/>
<title type="html"><![CDATA[Atmega328p problem z UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10703&amp;p=119577#p119577"><![CDATA[
Klasyczny już problem, a mianowicie UART ładnie wysyła mi do komputera tekst, ale nie chce nic odebrać. Prawdopodobnie coś źle ustawiłem przy inicjacji, ale nie jestem pewny.<br />Main:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;mkuart.h&quot;<br /><br />int main (void)<br />{<br />InitSPI();<br />DDRD |=(1&lt;&lt;PD2);<br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();// globalne odblokowanie przerwań<br />    uart_puts(&quot;Mikroprocesor zainicjowany poprawnie&quot;);<br />    uart_putc('\r');<br />    uart_putc('\n');<br /><br />    char c;<br />    while(1)<br />    {<br />    c = uart_getc();<br />    uart_putc(c);<br />    uart_puts(&quot;test&quot;);<br />    _delay_ms(1000);<br /><br />    }<br />}[/syntax]<br /><br />Część mkuart.c, zgodnie ze zwyczajem nie wrzucania całości z książki:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;mkuart.h&quot;<br /><br /><br />void USART_Init( uint16_t baud ) {<br />/* Ustawienie prędkości */<br />UBRR0H = (uint8_t)(baud&gt;&gt;8);<br />UBRR0L = (uint8_t)baud;<br />/* Załączenie nadajnika I odbiornika */<br />UCSR0B = (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0);<br />/* Ustawienie format ramki: 8bitów danych, 1 bit stopu */<br />UCSR0C = (3&lt;&lt;UCSZ00);<br />}<br /><br /><br />// definiujemy funkcję dodającą jeden bajt doz bufora cyklicznego<br />void uart_putc( char data ) {<br />uint8_t tmp_head;<br /><br />    tmp_head  = (UART_TxHead + 1) &amp; UART_TX_BUF_MASK;<br /><br />    // pętla oczekuje jeżeli brak miejsca w buforze cyklicznym na kolejne znaki<br />    while ( tmp_head == UART_TxTail ){}<br /><br />    UART_TxBuf&#91;tmp_head&#93; = data;<br />    UART_TxHead = tmp_head;<br /><br />    // inicjalizujemy przerwanie występujące, gdy bufor jest pusty, dzięki<br />    // czemu w dalszej części wysyłaniem danych zajmie się już procedura<br />    // obsługi przerwania<br />    UCSR0B |= (1&lt;&lt;UDRIE0);<br />}<br /><br /><br />// definiujemy procedurę obsługi przerwania nadawczego, pobierającą dane z bufora cyklicznego<br />ISR( USART_UDRE_vect)  {<br />    // sprawdzamy czy indeksy są różne<br />    if ( UART_TxHead != UART_TxTail ) {<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART_TxTail = (UART_TxTail + 1) &amp; UART_TX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR0 = UART_TxBuf&#91;UART_TxTail&#93;;<br />    } else {<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSR0B &amp;= ~(1&lt;&lt;UDRIE0);<br />    }<br />}<br /><br /><br />// definiujemy funkcję pobierającą jeden bajt z bufora cyklicznego<br />char uart_getc(void) {<br />    // sprawdzamy czy indeksy są równe<br />    if ( UART_RxHead == UART_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART_RxTail = (UART_RxTail + 1) &amp; UART_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    return UART_RxBuf&#91;UART_RxTail&#93;;<br />}<br /><br />// definiujemy procedurę obsługi przerwania odbiorczego, zapisującą dane do bufora cyklicznego<br />ISR( USART_RX_vect ) {<br />    uint8_t tmp_head;<br />    char data;<br /><br />    data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART_RxHead + 1) &amp; UART_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART_RxTail ) {<br />    // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />    // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />    // nasz wąż zacząłby zjadać własny ogon<br />    } else {<br />UART_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART_RxBuf&#91;tmp_head&#93; = data; // wpisujemy odebrany bajt do bufora<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=636">MrDarkenRahl</a> — 17 lut 2015, o 22:04</p><hr />
]]></content>
</entry>
</feed>