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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-25T21:57:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16057&amp;mode</id>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T21:57:36+01:00</updated>
<published>2016-08-25T21:57:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167100#p167100</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167100#p167100"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167100#p167100"><![CDATA[
Dosłownie minutę po tym jak napisałem, że nie ma błędów to program się zaciął, dioda od MAX_RET_flag nie świeciła się, natomiast zgasła druga dioda, czyli program utknął w if(timer1000ms).<br /><br />Zapomniałem o tym fakcie nt. tablic, chyba raz to gdzieś mi się obiło o oczy jak zaczynałem cokolwiek czytać o programowaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />Odnośnie przesyłania liczb - w odbiorniku, żeby wysłać gołe liczby na UART to muszę zmienić:<br />[syntax=c]//uart_puts((char *) nRF_RX_buff);[/syntax]<br />na coś w rodzaju:<br />[syntax=c]uart_putint((int*)nRF_RX_buff,10)[/syntax] ?<br />Czy nie zmieniam nic, zostaje char i traktuje go jako zmienną 8-bitową, pamiętając o tym, żeby na terminalu zmienić na dec?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T21:55:02+01:00</updated>
<published>2016-08-25T21:55:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167098#p167098</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167098#p167098"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167098#p167098"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Skoro mam podać adres pierwszego elementu bufora to nie powinno to wyglądać tak (?):<br />[syntax=c]nRF_SendDataToAir(*bufor&#91;0&#93;);[/syntax]<br /></div><br /><br />Jeśli już to <br />[syntax=c]nRF_SendDataToAir(&amp;bufor&#91;0&#93;);[/syntax]<br />Jednakże warto zapamiętać, że nazwa tablicy bez numeru elementu zwraca adres pierwszego elementu tablicy. Jeśli posiadasz książkę BB radzę powrócić do tematu tablic  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <br /><br />Skoro wysyłając stałe dane nie ma błędów, wiesz żeby przyczyny szukać wyżej w kodzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 25 sie 2016, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T21:55:11+01:00</updated>
<published>2016-08-25T21:49:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167097#p167097</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167097#p167097"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167097#p167097"><![CDATA[
<div class="quotetitle">anonimowy napisał(a):</div><div class="quotecontent"><br />I wyślij podając jako argument adres pierwszego elementu:<br />[syntax=c]nRF_SendDataToAir(bufor);[/syntax]<br /></div><br />Skoro mam podać adres pierwszego elementu bufora to nie powinno to wyglądać tak (?):<br />[syntax=c]nRF_SendDataToAir(*bufor&#91;0&#93;);[/syntax]<br /><br />Nie jestem pewny, więc pytam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />A i ze sztywnym stringiem leci już godzinę (bez 7miu minut) i nawet jednej ramki nie zgubił. Znaczy to, że biblioteka i nrfy w porządku, czy tak?<br />Dioda od MAX_RET_flag też się nie zapaliła.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />No i właśnie zacięła się transmisja, a dioda od MAX_RET_flag się nie świeci. Zgasła na dobre druga dioda, tak jakby program nadajnika zatrzymał się w if(timer1000ms).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 21:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T21:13:00+01:00</updated>
<published>2016-08-25T21:13:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167083#p167083</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167083#p167083"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167083#p167083"><![CDATA[
Zobacz co się dzieje w funkcji nRF_SendDataToAir<br />[syntax=c]else length = strlen((char*) data);[/syntax]<br />Poza tym jako argument jest wskaźnik na zmienną, nie zmienna.<br /><br />Utwórz tablicę dla 3 bajtów :<br />[syntax=c]uint8_t bufor&#91;4&#93;;[/syntax]<br />Trzy pierwsze elementy wypełnij swoimi danymi, w czwarty (bufor[3]) wpisz zero (symulacja końca stringu).<br />I wyślij podając jako argument adres pierwszego elementu:<br />[syntax=c]nRF_SendDataToAir(bufor);[/syntax]<br /><br />Pamiętaj tylko, żeby przełączyć terminal na odbieranie bin, dec lub hex (zależy jaki terminal) a nie ascii, bo zobaczysz pojedyncze znaki  <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=3542">anonimowy</a> — 25 sie 2016, o 21:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T20:54:58+01:00</updated>
<published>2016-08-25T20:54:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167081#p167081</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167081#p167081"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167081#p167081"><![CDATA[
Ok, już przełączam. Jak na razie 35min chodziło z tym co wyżej, sporadycznie jakieś głupoty typu 666, 777.<br /><br />A co jakbym chciał przesłać czyste dane liczbowe, np. właśnie wspomniany byte0? Kiedy próbowałem tak:<br />[syntax=c]nRF_SendDataToAir((uint8_t*)byte0);[/syntax]<br />to przy kompilacji dostałem warna:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />cast to pointer from integer of different size [-Wint-to-pointer-cast]<br /></div><br />Nie rozumiem dlaczego different size, skoro wskaźnik jak i byte0 są uint8_t. Jak poprawnie przesyłać coś innego niż stringi?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />Z kolei jak podałem w miejscu byte0 liczbę typu uint16_t to kompilacja bez warninga. Znaczy, że dla poprawnego wykonania funkcji powinienem mieć zmienną większą niż 8-bitową?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 20:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T20:46:27+01:00</updated>
<published>2016-08-25T20:46:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167078#p167078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167078#p167078"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167078#p167078"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Czy może być tak, że z poprzednich transmisji zostają jakieś śmieci i to one powodują takie zaburzenia w konwersji na string?<br /></div><br />Wpisz dla testów na sztywno jakiś string, który ma zostać wysyłany, może to być linijka:<br />[syntax=c]nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );[/syntax]<br /><br />Obserwuj transmisję jakiś czas w terminalu czy występują jakieś błędy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 25 sie 2016, o 20:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T20:24:05+01:00</updated>
<published>2016-08-25T20:24:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167073#p167073</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167073#p167073"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167073#p167073"><![CDATA[
nrfy miałem ustawione na 2Mb. Zmieniłem na 250kb za Twoją radą.<br />Wyposażyłem program w dwa diodowe debuggery po stronie nadajnika, oto pętla while:<br />[syntax=c]while(1)<br />{<br /><br />#if TRYB == 1<br />PORTA.OUTSET = PIN4_bm;<br />if (timer1000ms)<br />{<br />PORTA.OUTCLR = PIN4_bm;<br /><br />// pomiar temperatury ***************************<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBuffer&#91;BufPos&#93;,<br />1,<br />3);<br /><br />while (twiMaster.status != TWIM_STATUS_READY) {<br />/* Wait until transaction is complete. */<br />}<br />uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br /><br />//itoa(byte1, binBuffer, 10);<br />sprintf(binBuffer, &quot;%d&quot;, byte0);<br /><br />//nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />while(TX_flag);// czekaj na koniec transmisji<br />if (MAX_RET_flag)<br />{<br />MAX_RET_flag = 0;<br />PORTA.OUTSET = PIN2_bm;// zaświecenie diody - debugger<br />}<br />timer1000ms = false;<br />}[/syntax]<br /><br />Dodałem flagę MAX_RET_flag i jak tylko się zaświeci powiadomi mnie o tym dioda. Jako, że flagę trzeba szybko wyzerować to postanowiłem nie gasić diody, i tak jestem w fazie testów. Oprócz tego mam drugi debugger informujący o kręceniu się pętli while. Mam timer programowy co 1s. Jeśli jestem poza warunkiem if(timer1000ms) to świeci mi dioda. Jak program wchodzi w tego ifa to gasi diodę. No i jak wchodzi to mam króciutkie, ale zawuażalne mignięcie. Poza tym na FTDI mam diody podpięte pod RX/TX więc widzę kiedy coś idzie do PC.<br /><br />Na razie program sobie wysyła byte0 i czekam na zapalenie zielonej diody.<br /><br />Czy w Twojej stacji używałeś jeszcze jakichś ciekawych sposobów na obsługę błędów transmisji i wieszanie się nrfa?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />Jak na razie nic nie jest gubione, ale zdarzają się kwiatki typu:<br /><br /><strong>ODEBRANO BAJTOW: 3 666</strong><br /><br />Trochę przerażające jest to, że jak już coś się takiego pojawia to tylko te 666 za każdym razem <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Czy takie kwiatki (wszak 666 nie jest liczbą 8-bitową, a tylko takie są wysyłane z HTU21) mogą być związane z konwersją inta do stringa? Takie zdarzenia są wysoce niepożądane, tym bardziej, że do PC chcę przesyłać surowe dane, a liczeniem zmiennoprzecinkowym zajmie się już PC.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br />Zauważyłem taką rzecz - jak byte0 miał wartość dziesiętną 106 to kwiatkiem w transmisji był 666, tj. powyżej. Ale jak czujnik przesłał 107 to kwiatkiem w transmisji jest teraz 777. Stawiam, że coś ze stringiem nie tak, ale nie bardzo wiem jak poprawić. Oto zmienne jakie używam:+<br />[syntax=c]char *binBuffer;<br />char buffer_out1&#91;32&#93;;[/syntax]<br /><br />No i przypisanie ze struktury obsługującej czujnik, konwersja i wysyłka:<br />[syntax=c]uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br /><br />//itoa(byte1, binBuffer, 10);<br />sprintf(binBuffer, &quot;%d&quot;, byte0);<br /><br />//nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );[/syntax]<br /><br />Czy może być tak, że z poprzednich transmisji zostają jakieś śmieci i to one powodują takie zaburzenia w konwersji na string?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 20:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T19:53:23+01:00</updated>
<published>2016-08-25T19:53:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167066#p167066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167066#p167066"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167066#p167066"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Wczoraj to zrobiłem i się nie zaświeciło w momencie zawieszenia. Ale zaraz zrobię to jeszcze raz, bo trochę zmieniałem kod a i w UARTcie dodałem taką linijkę przy funkcji wysyłającej znak:<br />[syntax=c]void uart_putc( char data ) {<br /><br />// dodane przeze mnie<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));    //Zaczekaj, aż bufor nadawania będzie pusty[/syntax]<br /><br />Pytasz o prędkość transmisji UARTa czy nRFa?<br /><br />SPI sprzętowe, do tego wykorzystanie przerwania IRQ. UART w odbiorniku też sprzętowy.<br /><br />Zdaję sobie sprawę, że musi to działać non-stop i nie spocznę póki u mnie to nie będzie tak działało <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />Oczywiście prędkość transmisji NRF-ów. Jeśli korzystasz z Mirkowego MKUART  z buforem cyklicznym i przerwaniami, to dodana linijka nie ma sensu. To przerwanie &quot;informuje&quot;, że bufor jest pusty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 25 sie 2016, o 19:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T19:39:09+01:00</updated>
<published>2016-08-25T19:39:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167063#p167063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167063#p167063"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167063#p167063"><![CDATA[
Docelowo transmisja będzie dwukierunkowa. Moja stacja meteo ma być mobilna (na prostej podstawie robota z silnikami) więc będę musiał wysyłać dane dot. kierunku i zbierać dane z czujnika/czujników.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Dodaj flagę MAX_RET_flag w nadajniku(w sposób jaki wcześniej pisałem) i napisz warunek, że jeśli wystąpi błąd, zasygnalizowało diodą. Zobaczysz, czy w momencie problemu dioda się zaświeca.<br /></div><br />Wczoraj to zrobiłem i się nie zaświeciło w momencie zawieszenia. Ale zaraz zrobię to jeszcze raz, bo trochę zmieniałem kod a i w UARTcie dodałem taką linijkę przy funkcji wysyłającej znak:<br />[syntax=c]void uart_putc( char data ) {<br /><br />// dodane przeze mnie<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));    //Zaczekaj, aż bufor nadawania będzie pusty[/syntax]<br /><br />Pytasz o prędkość transmisji UARTa czy nRFa?<br /><br />SPI sprzętowe, do tego wykorzystanie przerwania IRQ. UART w odbiorniku też sprzętowy.<br /><br />Zdaję sobie sprawę, że musi to działać non-stop i nie spocznę póki u mnie to nie będzie tak działało <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T19:25:19+01:00</updated>
<published>2016-08-25T19:25:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167059#p167059</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167059#p167059"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167059#p167059"><![CDATA[
Dodaj flagę MAX_RET_flag w nadajniku(w sposób jaki wcześniej pisałem) i napisz warunek, że jeśli wystąpi błąd, zasygnalizowało diodą. Zobaczysz, czy w momencie problemu dioda się zaświeca. jaką ustawiłeś prędkość transmisji?  Daj na razie 250kbps. SPI sprzętowe czy programowe? Korzystasz z przerwań, czy po prostu odpytujesz układ? <br />U mnie NRF-y działają bez problemu 24/7 w stacji meteo, wysyłają co 5sek baz żadnego resetowania -a już na pewno nie sprzętowego i tak to musi działać. <br /><br />Masz zamiar wykorzystywać transmisję dwukierunkową, czy jednokierunkową, bo wtedy można uprościć kod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 25 sie 2016, o 19:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2016-08-25T19:09:44+01:00</updated>
<published>2016-08-25T19:09:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167056#p167056</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167056#p167056"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167056#p167056"><![CDATA[
Takie zawieszanie się nrf'a też miałem, gdy był on na granicy zasięgu(około 60 - 70% gubionych pakietów). Pomagała ponowna inicjalizacja. Nie wiem z czego to wynika.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 25 sie 2016, o 19:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T18:58:10+01:00</updated>
<published>2016-08-25T18:58:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167055#p167055</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167055#p167055"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167055#p167055"><![CDATA[
Uszczegółowię trochę kilka problemów.<br /><br />Układ wygląda tak: nadajnik to xmega 128a3 + nrf, do nadajnika podpięty czujnik HTU21D, magistrala I2C. Powietrzem chcę przesłać dane z HTU. <br />Odbiornik to Atmega32A + nrf, to co odbierze leci UARTem do Putty.<br /><br />Pojawił się natomiast trochę inny problem - odpaliłem program na dłużej, chodzi sobie i wysyła te dane przez jakiś czas, odbiornik wysyła na UART stringi i trwa to kilka-kilkanaście minut. Po tym czasie transmisja po prostu ustaje, UART już nic nie wysyła. Widzę to przede wszystkim po diodzie na FTDI, bo przestaje mrugać. Dopisałem proste polecenie, taki debugger - w nadajniku, w pętli głównej cały czas świeci się dioda. Wyłączana jest na czas transmisji. Gaśnie na bardzo krótko, ale zauważalnie. I nawet jak ustanie transmisja z odbiornika dalej na UART to mruga sobie dalej, czyli nadajnik pracuje poprawnie. Poza tym widzę na oscyloskopie, że komendy do czujnika cały czas są wysyłane i dane pomiarowe są zwracane.<br /><br />Jeszcze raz podaję kody plików main.c nadajnika i odbiornika:<br />Nadajnik (xmega + nrf):<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 &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdbool.h&gt;<br />//#include &quot;mkuart.h&quot;<br />#include &quot;SPI.h&quot;<br />#include &quot;nRF24L01.h&quot;<br />#include &quot;nRF24L01_memory_map.h&quot;<br />#include &quot;twi_master_driver.h&quot;<br />#include &quot;avr_compiler.h&quot;<br />//#include &quot;usart_driver.h&quot;<br /><br />#define NUM_BYTES3<br /><br />#define SLAVE_ADDRESS    0x40// Adres czujnika na magistrali TWI<br /><br />// CPU speed 32MHz, BAUDRATE 100kHz and Baudrate Register Settings <br />#define CPU_SPEED       32000000<br />#define BAUDRATE100000<br />#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)<br /><br />#define SHIFTED_DIVISOR 0x988000// This is the 0x0131 polynomial shifted to farthest left of three bytes<br /><br />TWI_Master_t twiMaster;// Struktura twiMaster<br /><br />//char binBuffer&#91;8&#93; = {0,0,0,0,0,0,0,0};<br />char *binBuffer;<br /><br />uint8_t sendBuffer&#91;NUM_BYTES&#93; = {0xFE, 0xE3, 0xE5};// sekwencja rozkazów wysyłanych do czujnika<br />/*<br />0x80 - I2C address + write<br />0x81 - I2C address + read<br />0 - 0xe3 - trig temp meas hold master<br />1 - 0xe5 - trig humid meas hold master<br />2 - 0xf3 - trig temp meas no hold master<br />3 - 0xf5 - trig humid meas no hold master<br />4 - 0xfe - soft reset<br />  <br />0,1,2,3 - bufPos <br />*/<br /><br /><br />char buffer_out1&#91;32&#93;;<br />void callbackData ( void * nRF_RX_buff , uint8_t len );<br />void Osc32MHz(void);<br />void Osc2MHz(void);<br /><br />volatile bool timer1000ms= false;<br />bool nrfAck= false;<br /><br />int main (void)<br />{<br />PORTE.DIRSET = 0xFF;<br /><br />uint8_t BufPos = 0;<br /><br />Osc32MHz();// włączenie wewnętrznego oscylatora 32MHz<br /><br />/* Initialize TWI master. */<br />TWI_MasterInit(&amp;twiMaster,<br />&amp;TWIE,<br />TWI_MASTER_INTLVL_LO_gc,<br />TWI_BAUDSETTING);<br /><br />// konfiguracja przerwań<br />TCC0.INTCTRLA=TC_OVFINTLVL_HI_gc;<br />PMIC.CTRL=PMIC_LOLVLEN_bm | PMIC_HILVLEN_bm;<br /><br />// konfiguracja  timera<br />TCC0.CTRLB=TC_WGMODE_NORMAL_gc;// tryb normalny<br />TCC0.PER=31250;// przerwanie co ok. 1sek.<br />//TCC0.PER=200;<br />TCC0.CTRLA=TC_CLKSEL_DIV1024_gc;<br /><br /><br />PORTC_DIR|= 0xFF;<br />PORTC_OUT |= 0xFF;<br /><br />    nRF_init();<br />register_nRF_RX_Event_Callback(callbackData);<br />    sei();<br /><br />TWI_MasterWrite(&amp;twiMaster,// soft reset czujnika<br />SLAVE_ADDRESS,<br />&amp;sendBuffer&#91;BufPos&#93;,<br />1);<br /><br />while (twiMaster.status != TWIM_STATUS_READY) {<br />/* Wait until transaction is complete. */<br />}<br />BufPos++;<br /><br />PORTA.DIRSET = PIN4_bm;<br />while(1)<br />{<br /><br />#if TRYB == 1<br />PORTA.OUTSET = PIN4_bm;<br />if (timer1000ms)<br />{<br />PORTA.OUTCLR = PIN4_bm;<br /><br />// pomiar temperatury ***************************<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBuffer&#91;BufPos&#93;,<br />1,<br />3);<br /><br />while (twiMaster.status != TWIM_STATUS_READY) {<br />/* Wait until transaction is complete. */<br />}<br />uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br /><br />//itoa(byte1, binBuffer, 10);<br />sprintf(binBuffer, &quot;%d&quot;, byte1);<br />//nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />while(TX_flag);<br />/*<br />// przeliczenie na temperaturę<br />uint16_t temp = 0;<br />float t = 0;<br /><br />temp = ((uint8_t)byte0&lt;&lt;8)|((uint8_t)byte1&gt;&gt;2);<br />t = (175.72*((uint32_t)temp*100000&gt;&gt;16));<br />t = -46.85+(t/100000);<br /><br />//itoa(t, binBuffer, 10 );<br /><br />dtostrf(t,5,2,binBuffer);<br /><br />//nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br /><br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />//while(TX_flag == 1);<br />*/<br />timer1000ms = false;<br />}<br />#endif<br /><br />#if TRYB == 2<br /><br /><br />nRF_RX_EVENT();<br /><br /><br />#endif<br />}<br />}<br /><br /><br />void callbackData ( void * nRF_RX_buff, uint8_t len )<br />{<br />PORTA.DIRSET = PIN3_bm;<br />PORTA.OUTSET = PIN3_bm;<br />_delay_ms(500);<br />PORTA.OUTCLR = PIN3_bm;<br />}<br /><br />void Osc32MHz(void) {<br />OSC.CTRL     =    OSC_RC32MEN_bm;       // włączenie oscylatora 32MHz<br />while(!(OSC_STATUS &amp; (1&lt;&lt;OSC_RC32MRDY_bp))); // czekanie na ustabilizowanie się generatora<br />CPU_CCP      =    CCP_IOREG_gc;         // odblokowanie zmiany źródła sygnału<br />CLK.CTRL     =    CLK_SCLKSEL_RC32M_gc; // zmiana źródła sygnału na RC 32MHz<br />}<br /><br />void Osc2MHz(void) {<br />OSC.CTRL     =    OSC_RC2MEN_bm;// włączenie oscylatora 2MHz<br />while(!(OSC_STATUS &amp; (1&lt;&lt;OSC_RC2MRDY_bp))); // czekanie na ustabilizowanie się generatora<br />CPU_CCP      =    CCP_IOREG_gc;// odblokowanie zmiany źródła sygnału<br />CLK.CTRL     =    CLK_SCLKSEL_RC2M_gc;// zmiana źródła sygnału na RC 2MHz<br />}<br /><br />ISR(TCC0_OVF_vect) {                            // przerwanie od przepełnienia TCC0<br />timer1000ms = true;<br />}<br /><br />/*! TWIC Master Interrupt vector. */<br />ISR(TWIE_TWIM_vect)<br />{<br />TWI_MasterInterruptHandler(&amp;twiMaster);<br />}[/syntax]<br /><br />Odbiornik (atmega32 + nrf + UART):<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 &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;mkuart.h&quot;<br />#include &quot;SPI.h&quot;<br />#include &quot;nRF24L01.h&quot;<br />#include &quot;nRF24L01_memory_map.h&quot;<br /><br /><br /><br />char buffer_out1&#91;32&#93;;<br />void callbackData ( void * nRF_RX_buff , uint8_t len );<br /><br />int main (void)<br />{<br />/*DDRC |= 0xFF;<br />PORTC |= 0xFF;*/<br /><br />USART_Init(__UBRR);<br /><br />    nRF_init();    <br /><br />    register_nRF_RX_Event_Callback(callbackData);<br /><br />    nRF_RX_Power_Up(); //Enable in receiving mode<br /><br />sei();<br /><br />while(1)<br />{<br />#if TRYB == 1<br /><br />nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia!\r\n&quot; );<br /><br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />_delay_ms(500);<br />#endif<br /><br />#if TRYB == 2<br /><br /><br />nRF_RX_EVENT();<br /><br /><br />#endif<br />}<br />}<br /><br /><br />void callbackData ( void * nRF_RX_buff, uint8_t len )<br />{<br />char buffer_for_itoa&#91;4&#93; = { 0, 0, 0, 0};<br />itoa( len, buffer_for_itoa, 10 );<br />//ENTER_NEW;<br />//usart_send_str(&quot;ODEBRANO BAJTOW: &quot;);<br />uart_puts(&quot;ODEBRANO BAJTOW: &quot;);<br />//usart_send_str(buffer_for_itoa);<br />uart_puts(buffer_for_itoa);<br />//ENTER_NEW;<br />//usart_send_str( (char *) nRF_RX_buff );<br />uart_puts(&quot; &quot;);<br />uart_puts((char *) nRF_RX_buff);<br />uart_puts(&quot;\n\r&quot;);<br />//nRF_SendDataToAir((uint8_t*)&quot;DANE OK&quot;);<br />}[/syntax]<br /><br />Dodaję w załącznikach dwa logi wraz z zawartością terminali.<br />W pierwszym przypadku działał kilkanaście minut, potem puścił kilka krzaków i odbiornik przestał wysyłać do PC (RX i TX w stanie wysokim), przy czym nadajnik działał dalej (debugger w postaci diody mrugał, a na oscyloskopie były komendy do czujnika). Błąd na końcu loga spowodowany jest tym, że wyłączyłem zasilanie FTDI.<br /><br />W drugim przypadku nadajnik jak i odbiornik działali krótko i transmisja po prostu ustała.<br /><br />Dodam, że w momencie wysypanie się transmisji w event logu Putty nie ma żadnego błędu! Błąd się pojawia dopiero jak wyłączę FTDI, ale to akurat normalne.<br /><br />Problem nr 3 - mam taki fragment w nadajniku:<br />[syntax=c]uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br /><br />//itoa(byte1, binBuffer, 10);<br />sprintf(binBuffer, &quot;%d&quot;, byte1);<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );[/syntax]<br />Jak widać, wysyłam byte1. Jego wartość powinna być ok. 200. A na terminalu widzę czasami takie cuda:<br /><br />ODEBRANO BAJTOW: 1 452<br /><br />Przy czym ten problem nie pojawia się jak wysyłam byte0! Czujnik jest sprawny, bo jak nie wysyłam konwertowanych bajtów na stringi, tylko przeliczoną temperaturę (zakomentarzowany kod) to temperatura zawsze się zgadza (aż złapie zwiechę).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 18:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-25T11:03:28+01:00</updated>
<published>2016-08-25T11:03:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167011#p167011</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167011#p167011"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=167011#p167011"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Czyli zakomentarzować nRF_Clear_TX(); i podać impuls na CE?<br /></div><br />Pod warunkiem, że masz na myśli czyszczenie te w procedurze obsługi przerwania (patrz kod z mojego ostatniego postu). Nie możesz też przestawić NRF na odbieranie, czyli zakomentuj linijkę  nRF_RX_Power_Up();. Pamiętaj tylko, że w razie ponownego niepowodzenia, ręcznie przestawić NRF-a na odbiór danych. Impuls na CE musi mieć minimum 10us. Do tego trzeba się bardziej przyjrzeć funkcją nRF_RX_Power_Up(); i nRF_TX_Power_Up(); a teraz jestem w pracy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 25 sie 2016, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-25T08:35:09+01:00</updated>
<published>2016-08-25T08:35:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166994#p166994</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166994#p166994"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166994#p166994"><![CDATA[
Czyli zakomentarzować nRF_Clear_TX();  i podać impuls na CE?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 25 sie 2016, o 08:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-24T22:11:54+01:00</updated>
<published>2016-08-24T22:11:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166984#p166984</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166984#p166984"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166984#p166984"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />A po niepoprawnej transmisji wszystkie bufory z danymi, co to nie udało ich się wysłać, zostają zerowane?<br /></div><br />Zależy. Sam układ NRF24l01 w przypadku przekroczonej ilości retransmisji nie zeruje buforu FIFO, tak więc łatwo można ponowić transmisję danych. <br />Natomiast w bibliotece jest:<br /><br />[syntax=c]if ( status &amp; (1&lt;&lt;MAX_RT) )                                                     //id max of retransmissions was achived<br />        {<br />                status |= (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS);                             //clear MAX_RT and TX_DS bits in status variable<br />                TX_flag = 0;                                                                    //clear TX_flag<br />                nRF_RX_Power_Up();                                                              //turn on RX mode<br />                nRF_Clear_TX();                                                                 //TUTAJ CZYŚCIMY<br />                nRF_Config_Register( STATUS, status );                  //save variable status to the STATUS register<br />        }[/syntax]<br />To samo robimy w funkcji  nRF_SendDataToAir co wydaje się już zbędne.<br />Gdy nie wykonamy nRF_Clear_TX(); możliwa jest ponowna próba wysłania tych samych danych, wystarczy impuls na CE.<br />Natomiast MAX_RT musimy wyzerować, aby dalsza komunikacja była możliwa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 24 sie 2016, o 22:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-24T21:49:17+01:00</updated>
<published>2016-08-24T21:49:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166982#p166982</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166982#p166982"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166982#p166982"><![CDATA[
Zasilanie - wg mnie - mam zrobione porządnie. Akumulator 18650 3.7V -&gt; przetwornica Pololu step-up 5V -&gt; stabilizator LDO na 3.3V, wszędzie kondensatory filtrujące. Do tego na samych pinach nRF'a mam przylutowane między GND i VCC 10uF tantal i 100nF ceramik.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />A po niepoprawnej transmisji wszystkie bufory z danymi, co to nie udało ich się wysłać, zostają zerowane?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 24 sie 2016, o 21:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-24T21:36:18+01:00</updated>
<published>2016-08-24T21:36:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166981#p166981</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166981#p166981"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166981#p166981"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Spróbuję machnąć tranzystorem zasilania nRFa po błędzie<br /></div><br />Zbędne działanie, przynajmniej dla poprawnie działającego układu. Z czego to zasilasz? Daj blisko NRF-a kondensatory 100n i 10uF.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 24 sie 2016, o 21:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-24T21:30:05+01:00</updated>
<published>2016-08-24T21:30:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166980#p166980</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166980#p166980"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166980#p166980"><![CDATA[
<div class="quotetitle">anonimowy napisał(a):</div><div class="quotecontent"><br />No nie do końca. Musisz poczekać na zakończenie transmisji, nieważne z jakim skutkiem.  Korzystając z tego, że w przypadku przekroczonej ilości retransmisji zerujemy też flagę TX, najprostszy, lecz blokujący sposób wygląda tak:<br />[syntax=c]nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br />while(TX_flag);   //czekaj na koniec transmisji<br />if(MAX_RET_flag){   //jeśli przekroczono ilość retransmisji<br />MAX_RET_flag= 0;   //zeruj flagę<br />//kod do wykonania w przypadku błędu transmisji<br />}[/syntax]<br />Przynajmniej ja bym to tak widział...<br />Pozdrawiam<br /></div><br />Ano widzisz! Sam wpadłem na tego while'a z TX_flag, ale nie zauważyłem różnicy w działaniu. Może się poprawi z tą dodatkową flagą MAX_RET_flag.<br />Spróbuję machnąć tranzystorem zasilania nRFa po błędzie i potem odnowić transmisję. Dodam sobie jeszcze diodę, którą zapalę przy pojawieniu się tej flagi. Będę dawał znać jak efekty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 24 sie 2016, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-24T21:20:55+01:00</updated>
<published>2016-08-24T21:20:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166979#p166979</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166979#p166979"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166979#p166979"><![CDATA[
Ilość retransmisji się zgadza,<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />RETR_15_TIMES<br /></div><br />Znaczy 15 retransmisji, czyli maksymalna ilość. Czas nie do końca potrzebny taki duży. <br /><br />[syntax=c]nRF_Set_Retransmission_Time_And_Ammount(WAIT_500uS  , RETR_15_TIMES );  //set time between retransmissions and ammount of retranssmisions[/syntax]<br /><br /><div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Czy poprawnie jest to zrealizować w taki sposób (?):<br /></div><br /><br />[syntax=c]nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br />if(MAX_RET_flag == 1) // sprawdzamy, czy flaga retransmisji jest postawiona, jeśli tak to wykonujemy instrukcję od if<br />{<br />// np. wysłanie danych jeszcze raz<br />}[/syntax]<br /><br />No nie do końca. Musisz poczekać na zakończenie transmisji, nieważne z jakim skutkiem.  Korzystając z tego, że w przypadku przekroczonej ilości retransmisji zerujemy też flagę TX, najprostszy, lecz blokujący sposób wygląda tak:<br />[syntax=c]nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br />while(TX_flag);   //czekaj na koniec transmisji<br />if(MAX_RET_flag){   //jeśli przekroczono ilość retransmisji<br />MAX_RET_flag= 0;   //zeruj flagę<br />//kod do wykonania w przypadku błędu transmisji<br />}[/syntax]<br />Przynajmniej ja bym to tak widział...<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 24 sie 2016, o 21:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-24T21:04:32+01:00</updated>
<published>2016-08-24T21:04:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166976#p166976</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166976#p166976"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166976#p166976"><![CDATA[
Dziękuję za wyczerpującą odpowiedź, mam porządny punkt zaczepienia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />U siebie mam tak w tym momencie:<br />[syntax=c]nRF_Set_Active_DataPipe_And_ACK ( ERX_P0, ON, ACK_ON );//Set which datapipe state you want to change, in this case datapipe = 0 (ERX_P0), ON - means enable this datapipe, ACK_ON means to enable ACK for choosen data pipe.<br />nRF_Set_Retransmission_Time_And_Ammount(WAIT_4000uS , RETR_15_TIMES );  //set time between retransmissions and ammount of retranssmisions[/syntax]<br /><br />Więc czas - w porównaniu z wartościami podanymi przez Ciebie - dużo większy, a ilość powtórzeń dużo mniejsza.<br /><br />Napisałeś tak:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />I po wysłaniu sprawdzać, czy flaga nie została ustawiona. Jeśli tak- wiadomo że błąd transmisji. Można spróbować ręcznie wysłać dane jeszcze raz.<br /></div><br />Czy poprawnie jest to zrealizować w taki sposób (?):<br /><br />[syntax=c]nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br />if(MAX_RET_flag == 1) // sprawdzamy, czy flaga retransmisji jest postawiona, jeśli tak to wykonujemy instrukcję od if<br />{<br />// np. wysłanie danych jeszcze raz<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br />O ile widzę, to w przypadku, gdy jest wykryty błąd w transmisji to nie dość, że nie informujemy użytkownika o tym, co się stało, to transmisja może się nie powtórzyć? A gdyby tak po błędzie transmisji zrobić reset nrfa? Najczęściej to pomagało, ale chciałbym to zrobić programowo i nie wyłączając procesora. Czy wystarczy machnąć tranzystorem sterującym zasilaniem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 24 sie 2016, o 21:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2016-08-24T20:12:46+01:00</updated>
<published>2016-08-24T20:12:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166970#p166970</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166970#p166970"/>
<title type="html"><![CDATA[Re: NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzeni]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166970#p166970"><![CDATA[
Nie wnikając w bibliotekę, dla NRF musisz wykonać takie coś:<br />W rejestrze SETUP_RETR ustawiasz maksymalną ilość retransmisji oraz opóźnienie. WAŻNE: Zobacz w dokumentacji zależność tego czasu od ilości danych i prędkości transmisji.<br />Zalecam ustawić 15 retransmisji i 500us, włączone auto ACK.<br />Po wysłaniu danej czekasz na pojawienie się przerwania, potem sprawdzasz (rejestr STATUS ), czy przerwanie pochodzi od TX_DS -czyli zakończono pomyślnie transmisje czy od MAX_RT czyli przekroczono ilość retransmisji. Jeśli to drugie, wiadomo, że coś jest nie tak, zerujemy flagę. <br /><br /><br /><br />W bibliotece z linku w pierwszym poście jest:<br />[syntax=c]if ( status &amp; (1&lt;&lt;MAX_RT) )                                                     //id max of retransmissions was achived<br />        {<br />                status |= (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS);                             //clear MAX_RT and TX_DS bits in status variable<br />                TX_flag = 0;                                                                    //clear TX_flag<br />                nRF_RX_Power_Up();                                                              //turn on RX mode<br />                nRF_Clear_TX();                                                                 //clear TX fifo<br />                nRF_Config_Register( STATUS, status );                  //save variable status to the STATUS register<br />        }[/syntax]<br /><br />Jak widać nie informujemy użytkownika o tym, że wystąpił błąd transmisji, jedynie kasujemy flagę.<br />Trzeba dodać sobie kolejną zmienną np. MAX_RET_flag w pliku *.c <br /><br />[syntax=c]//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// declaration of global variables which stores values depending on the transmission states<br />//..................................................................................................................<br />volatile uint8_t TX_flag;   //data sent event flag<br />volatile uint8_t RX_flag;   //data ready event flag<br />volatile uint8_t MAX_RET_flag;   //nasza flaga[/syntax]<br /><br />W pliku *.h<br />[syntax=c]///''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// RX and TX event flags<br />//........................................................................................................................<br />extern volatile uint8_t TX_flag;<br />extern volatile uint8_t RX_flag;<br />extern volatile uint8_t MAX_RET_flag;   //nasza flaga[/syntax]<br /><br />I zmienić procedurę obsługi przerwania:<br />[syntax=c]if ( status &amp; (1&lt;&lt;MAX_RT) )                                                     //id max of retransmissions was achived<br />        {<br />                status |= (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS);                             //clear MAX_RT and TX_DS bits in status variable<br />                TX_flag = 0;                                                                    //clear TX_flag<br />                MAX_RET_flag = 1;<br />                nRF_RX_Power_Up();                                                              //turn on RX mode<br />                nRF_Clear_TX();                                                                 //clear TX fifo<br />                nRF_Config_Register( STATUS, status );                  //save variable status to the STATUS register<br />        }[/syntax]<br />I po wysłaniu sprawdzać, czy flaga nie została ustawiona. Jeśli tak- wiadomo że błąd transmisji. Można spróbować ręcznie wysłać dane jeszcze raz.<br /><br />Nie wykluczam, ze trzeba dokonać więcej zmian, musisz się przyjrzeć bibliotece, lecz mam nadzieję, że na podstawie tego co napisałem, zrozumiesz o co chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 24 sie 2016, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-24T19:37:37+01:00</updated>
<published>2016-08-24T19:37:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166967#p166967</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166967#p166967"/>
<title type="html"><![CDATA[NRF24l01 - wysyłanie kilku bajtów, wysłanie potwierdzenia.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16057&amp;p=166967#p166967"><![CDATA[
Cześć wszystkim <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Od kilku dni testuję bibliotekę Kolegi <strong>Nefarious19 </strong> z postu <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic11377.html" >topic11377.html</a><!-- l --> do nrf24l01, rozwijając przy tym swój mały projekcik stacji pogodowej. Mam taki kod:<br />[syntax=c]while(1)<br />{<br /><br />#if TRYB == 1<br />if (timer1000ms)<br />{<br />// pomiar temperatury ***************************<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBuffer&#91;BufPos&#93;,<br />1,<br />3);<br /><br />while (twiMaster.status != TWIM_STATUS_READY) {<br />/* Wait until transaction is complete. */<br />}<br />uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br />uint16_t temp = 0;<br />float t = 0;<br /><br />temp = ((uint8_t)byte0&lt;&lt;8)|((uint8_t)byte1&gt;&gt;2);<br />t = (175.72*((uint32_t)temp*100000&gt;&gt;16));<br />t = -46.85+(t/100000);<br /><br />//itoa(t, binBuffer, 10 );<br /><br />dtostrf(t,5,2,binBuffer);<br /><br />//nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia.\r\n&quot; );<br />nRF_SendDataToAir( ( uint8_t * ) binBuffer );<br /><br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />//while(TX_flag == 1);<br /><br />//_delay_ms(1000);<br />timer1000ms = false;<br />}<br />nRF_RX_EVENT();<br />}[/syntax]<br /><br />Funkcje dotyczące TWI odnoszą się do podłączonego tam czujnika HTU21D. Liczę sobie temperaturę, zamieniam float na stringa, puszczam atmosferą do drugiego procesora i dalej do PC. Nie podoba mi się to co zrobiłem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Do takiego siermiężnego liczenia floatów wolę wykorzystać komputer. <br />I tu pojawia się mój problem: z czujnika przychodzą trzy bajty informacji, dwa dotyczące temperatury/wilgotności, i suma kontrolna do sprawdzenia CRC. Po wykonaniu pomiaru chciałbym wysłać te bajty jeden po drugim i po każdym z bajtów chciałbym dostać potwierdzenie otrzymania od odbiornika przy PC. Jak należy poprawnie to wykonać? Postawienie jeden za drugim nrfSendDataToAir nie sprawdza się, wychodzą głupoty. Ponadto, zdarza się, że transmisja się zawiesza i nie ma reguły kiedy. Czasem po 10 minutach, czasem po 30 sekundach. Podejrzewam, że trzeba czyścić/sprawdzać któreś flagi, tylko które?<br />Proszę uprzejmie o pomoc i pozdrawiam.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 17 minutach ]</span></strong><br /><br />Zapomniałem dodać, a to wg mnie bardzo ważne - program jako taki się nie zawiesza! Sprawdziłem na oscyloskopie czy są wysyłane rozkazy do czujnika i okazuje się, że tak. Znaczy to, że program sobie kręci pętle jak trzeba, tylko coś z NRF-ami się dzieje i nie mam pomysłu co.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 24 sie 2016, o 19:37</p><hr />
]]></content>
</entry>
</feed>