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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-07-12T12:26:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=15621&amp;mode</id>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-07-12T12:26:30+01:00</updated>
<published>2016-07-12T12:26:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=163884#p163884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=163884#p163884"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=163884#p163884"><![CDATA[
Powracam do tematu ponieważ mam pytanie, czy biblioteka dla NRF24L01, którą przedstawiłem w powyższych postach, daje mi możliwość komunikacji z wieloma takimi urządzeniami? <br />Potrzebne mi to będzie do bezprzewodowego sterowania urządzeniami w domu + ewentualne czujniki np. temperatury. Założeniem jest min. 10 układów wykonawczych/czujników (NRF+atmega8) oraz jedna centralka(NRF+atmega32+ATNEL WIFI232). Jak na razie jedna centralka i jeden układ wykonawczy pracują bez problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Znalazłem w internetach bibliotekę <a href="http://www.insidegadgets.com/2013/06/09/nrf24-multi-network-allowing-for-255-addresses/"  class="postlink">http://www.insidegadgets.com/2013/06/09/nrf24-multi-network-allowing-for-255-addresses/</a> pozwalającą na komunikację z 255 adresami ale niestety od dwóch dni nie mogę sobie poradzić aby Eclipse mi ją poprawnie skompilował a w dodatku nie zauważyłem tam obsługi przerwania do np. wybudzenia procka gdy nadejdzie jakaś ramka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 12 lip 2016, o 12:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-21T00:25:23+01:00</updated>
<published>2016-06-21T00:25:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162690#p162690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162690#p162690"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162690#p162690"><![CDATA[
Przetestowałem wstępnie sprawdzanie flagi poprawnego wysłania danych i chyba dobrze działa bo zatrzymuje program dopiero gdy układ wykonawczy nie odbierze ramki bo np dla testów jest odłączony od zasilania. <br />Mam jeszcze pytanie, czy użycie tych modułów determinuje konieczność używania takich samych częstotliwości taktowania wszystkich procesorów komunikujących się?<br />Proszę również o opinię czy da się wykorzystać przerwanie INT0 zawarte w bibliotekach do wybudzania procka ze stanu uśpienia po nadejściu ramki danych?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 21 cze 2016, o 00:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-19T23:04:20+01:00</updated>
<published>2016-06-19T23:04:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162618#p162618</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162618#p162618"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162618#p162618"><![CDATA[
Znalazłem u siebie to przerwanie i dodałem w nim swoją flagę SEND_flag:<br />[syntax=c]//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// Here is external intterupt handler, if you are using interupts change the name of the vector interrupt ore live the same if you are using the same<br />//...................................................................................................................................................<br />ISR(INT0_vect)<br />{<br />        CSN_LOW;                                                                                        //Chip select LOW<br />        register uint8_t status = SPI_WriteReadByte(NOP);       //read STATUS register value<br />        CSN_HIGH;                                                                                       //chip select high<br /><br />        if ( (status &amp; (1&lt;&lt;RX_DR)) )                                            //id data recived<br />        {<br />                status |= (1&lt;&lt;RX_DR);                                                   //reset intterupt bit on status variable<br />                nRF_Config_Register(STATUS, status);                    //save status variable in STATUS register<br />                RX_flag = 1;                                                                    //RX flag equals to 1<br />        }<br /><br />        if ( status &amp; (1&lt;&lt;TX_DS) )                                                      //if data was send<br />        {<br />                status |= (1&lt;&lt;TX_DS);                                                   //clear TX_DS bit in status variable<br />                nRF_Config_Register( STATUS, status );                  //save status variable in STATUS register<br />                TX_flag = 0;                                                                    //TX_flag = 0<br />                nRF_RX_Power_Up();                                                              //enable receiving mode<br />                SEND_flag=12;<br />        }<br /><br />        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 />                SEND_flag=122;<br />        }<br />}[/syntax]<br /><br />W pętli głównej zaś :<br />[syntax=c]uint8_t poszlo=0;<br /><br />while(poszlo==0)<br />{<br />SEND_flag=0;//zeruj flage<br />nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia dla forum ATNEL!&quot; );//wyślij komende<br />while(SEND_flag==0);//poczekaj aż przerwanie zwróci jakąś wartośc flagi<br />if(SEND_flag==12)poszlo=1;//jeśli przerwanie stwierdziło wysłanie danych to wyjdź z pętli<br />}<br /><br />_delay_ms(100);<br />poszlo=0;<br /><br />while(poszlo==0)<br />{<br />SEND_flag=0;<br />nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia dla forum ATNEK!&quot; );<br />while(SEND_flag==0);<br />if(SEND_flag==12)poszlo=1;<br />}<br /><br />_delay_ms(100);[/syntax]<br /><br />Do modułów przylutowałem kon. 100nF i 1uF w obudowach SMD gdyż takie miałem, przylutowałem też rezystory 10K podciągające CSN.<br />Zmieniłem w funkcji init NRF'a  RF_PWR_0dB.<br />Efekt jest dla mnie zadowalający, zasięg się poprawił. Nie jestem do końca pewny czy te moje sprawdzanie flagi w pętli głównej jest ok i czy spełnia swoje zadanie-wysyłanie ciągle tej samej komendy do puki układ wykonawczy poprawnie ją odbierze. Proszę więc o komentarz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 19 cze 2016, o 23:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2016-06-19T20:37:14+01:00</updated>
<published>2016-06-19T20:37:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162614#p162614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162614#p162614"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162614#p162614"><![CDATA[
Zmień &quot;RF_PWR_18dB &quot; w funkcji inicjalizacyjnej na &quot;RF_PWR_0dB&quot;. Dodatkowo wstaw kondensatory i rezystor jak tu: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic11377-90.html#p149703" >topic11377-90.html#p149703</a><!-- l --> jeszcze mnie to nie zawiodło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 19 cze 2016, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hawranek80]]></name></author>
<updated>2016-06-19T20:04:44+01:00</updated>
<published>2016-06-19T20:04:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162613#p162613</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162613#p162613"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162613#p162613"><![CDATA[
Ja zakupiłem jeden NRF24L01 z antenką do testów i podłączyłem go do atmegi która odbierała z dwóch nadajników nie pamiętam jaki był zasięg dokładnie ale dużo się poprawił przez dwie ściany bez problemu bez gubienia pakietów ,nawet gdy odbiornik był w domu na 2-gim piętrze a z nadajnikiem poszedłem na podwórko to w obrębie całego podwórka działało bez gubienia pakietów .a wcześniej gdy komunikowałem na modułach z antenką na PCB to miałem problem z komunikacją przez jedną ścianę ,i jeszcze jedna sugestia lepiej jest testować przesyłając jakiś text a nie patrząc czy dioda miga przy odbiorze bo to czasem kłamie dałem się tak podczas testów nabrać dioda migała cały dzień a żaden pakiet nie dotarł takie moje małe doświadczenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6379">hawranek80</a> — 19 cze 2016, o 20:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-19T19:31:02+01:00</updated>
<published>2016-06-19T19:31:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162609#p162609</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162609#p162609"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162609#p162609"><![CDATA[
A można prosić więcej informacji o tym przerwaniu? To będzie któraś z tych funkcji z biblioteki:<br />[syntax=c]// function declarations<br />//........................................................................................................................<br />void nRF_RX_EVENT (void);      //this function checks if there are data to read and if there is callback function registered.<br />  //if there are data avaliable to read this function sends this data to registered calbback function<br /><br />void register_nRF_RX_Event_Callback ( void ( * callback )( void * nRF_RX_buff , uint8_t len ) ); //this function is used to register RX_EVENT callback function<br /><br />void nRF_SendDataToAir( uint8_t * data ); //this function sends data to to another nRF or nRF's. Length of data payload is calculeted by strlen funcion so<br />  //you must send data in ASCII format<br />uint8_t nRF_Data_Ready(void);  //this function is used when IRQ are disabled. It checks if there any data to read<br />void Initialize_INTERRUPT_For_nRF(void);  //this function is used to initlialization of external interrupt for nRF<br />void nRF_init( void );                                                 //Initialize NRF24l01<br />void nRF_Config_Register(uint8_t register_name, uint8_t value);        //WRITE SOMETHING TO NRF REGISTER<br />void nRF_SET_Transmitter_Adres(const char * addres);   //this function sets transmitter addres<br />void nRF_SET_Reciver_Addres( uint8_t data_pipe, const char * addres ); //this function sets reciver addres of choosen datapipe<br />uint8_t nRF_Read_One_Byte_From_Register(uint8_t register_name);   //this function returns value of register given by attribute<br />void nRF_Set_Retransmission_Time_And_Ammount (uint8_t time, uint8_t ammount); //this function sets time beetwen retransmissions and ammount of them<br />void nRF_TX_Power_Up(void);  //this function turns on TX mode<br />void nRF_RX_Power_Up(void);  //this function turns on RX mode<br />void nRF_Power_Down(void);      //this funtion turns on Power_down mode<br />void nRF_Set_Channel( uint8_t channel );  //this function sets channel ( 0 to 127 )<br />void nRF_Clear_TX (void);  //this function clears TX fifo<br />void nRF_Clear_RX (void);  //this function clears RX fifo[/syntax] <br /><br />Zakładając że układ wykonawczy będzie zamontowany w obudowie lampy pod sufitem to na jakiej wysokości najlepiej zamontować drugi moduł? Jest jakaś zasada np: nadajnik wyżej a odbiornik niżej?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 19 cze 2016, o 19:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-19T18:46:48+01:00</updated>
<published>2016-06-19T18:46:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162602#p162602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162602#p162602"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162602#p162602"><![CDATA[
Zmieniłem kanał na 1. Myśląc o utracie ramek zmniejszyłem odstępy czasowe pomiędzy wysyłanymi komendami z 1s na 10ms- taka moja teoria że jak wyśle więcej ramek w tym samym czasie to i więcej odbierze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  W rezultacie zasięg na otwartej przestrzeni zwiększył się myślę trzykrotnie, przez jedną ścianę może dwukrotnie. Sprawdzałem tak trochę &quot;na oko&quot; idąc z prockiem zasilanym z laptopa i patrząc czy dioda się miga w rytm wysyłanych komend. <br />Cały projekt miał być przeznaczony do prostego sterowania oświetleniem ON/OFF więc mogę nawet 100tys razy na sek. wysyłać komendę włącz/wyłącz ale najważniejsze żeby ta komenda dotarła :p  I tutaj moje pytanie, skoro wiem że z zasięgiem będzie ciężko to jak mogę zrobić taką obsługę auto-ack informującą procek że ramka na pewno poprawnie została odebrana przez układ wykonawczy? Kolejna sprawa to czy mi się tak tylko wydaje czy zasięg modułów jest zależny od ustawienia kierunku anten PCB względem siebie i wysokości na jakich się znajdują?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 19 cze 2016, o 18:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-19T13:29:39+01:00</updated>
<published>2016-06-19T13:29:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162574#p162574</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162574#p162574"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162574#p162574"><![CDATA[
Jeszcze przed projektowaniem płytki sprawdziłem pdf dla NRF24L01 i znalazłem informację że moduł toleruje napięcia wejściowe do +5.25V więc chcąc zminiaturyzować płytkę nie zastosowałem konwersji napięć. <br /><br /><a href="https://obrazkiforum.atnel.pl/10670/488d4c8b19695ec151b0373427664795.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10670/488d4c8b19695ec151b0373427664795.png" alt="Obrazek" /></a><br /><br />Chyba mam atmegi z napięciem zasilania 5v więc chyba się nie da spróbować...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 19 cze 2016, o 13:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-06-19T13:09:15+01:00</updated>
<published>2016-06-19T13:09:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162572#p162572</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162572#p162572"/>
<title type="html"><![CDATA[Re: Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162572#p162572"><![CDATA[
Myślę, że problem jest w tym, że nie masz konwersji napięć. Atmege zasilasz napięciem 5V, a nrf'a 3.3V. <br />Zobacz jak to rozwiązać:<br /><a href="http://mirekk36.blogspot.co.uk/2015/05/konwerter-poziomow-33v-ttl.html"  class="postlink">http://mirekk36.blogspot.co.uk/2015/05/konwerter-poziomow-33v-ttl.html</a><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br />Oczywiście NRF24L01 akceptuje 5V i wiele osób twierdzi, że dodatkowa konwersja napięć jak wyżej, czy użycie jakiegoś bufora jest zbędne. Ja bym jednak spróbował użyć konwersji napięć lub zasilić Atmege8 również napięciem 3.3V i przetestował.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 19 cze 2016, o 13:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sucyn]]></name></author>
<updated>2016-06-19T12:15:37+01:00</updated>
<published>2016-06-19T12:15:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162566#p162566</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162566#p162566"/>
<title type="html"><![CDATA[Atmega8 i NRF24L01- słaby zasięg?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15621&amp;p=162566#p162566"><![CDATA[
Mam dwie Atmegi 8: jedna SMD na nowej płytce (schemat poniżej) zasilana z ładowarki od telefonu +5V, druga DPIP zasilana +5V z ATB-USBASP polutowana na pająka z NRF'em +3,3V ze stabilizatora bez kondensatorów. Oba procki taktowane wewnętzrnym oscylatorem 8MHz<br /><br /><a href="https://obrazkiforum.atnel.pl/10670/663cd896a32b5de8a99b64edac8e27d1.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10670/663cd896a32b5de8a99b64edac8e27d1.png" alt="Obrazek" /></a><br /><br />Układ testowy działa w ten sposób: at8 SMD co 1s wysyła komendy &quot;włącz&quot; i &quot;wyłącz&quot; a druga w zależności od odebranej komendy steruje diodą LED.  <br />Biblioteki mam prawdopodobnie z tego forum, nie pamiętam bo to było już jakiś czas temu, wiem jednak że coś musiałem delikatnie przerobić jeśli chodzi o INT0 dla atmegi8- może to tu jest problem.<br /><br />main.c<br />[syntax=c]/*                  e-gadget.header<br /> * main.c<br /> *<br /> *  Created on: 2015-04-07<br /> *    Modyfied: 2015-04-07 19:45:16<br /> *      Author: Nefarious19<br /> *<br /> * Project name: &quot;NRF24&quot;<br /> *<br /> *<br /><br /> */<br /><br /><br />#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 />//plik z obsłógą usypiania w różnych trybach<br />#include &lt;avr/sleep.h&gt;<br />//#include &quot;usart.h&quot;<br />#include &quot;SPI.h&quot;<br />#include &quot;nRF24L01.h&quot;<br />#include &quot;nRF24L01_memory_map.h&quot;<br /><br />#define pd3 (1&lt;&lt;PD3)<br />#define OFFD PORTD |= pd3<br />#define OND PORTD &amp;= ~pd3<br /><br />#define pc5 (1&lt;&lt;PC5)<br />#define OFFL PORTC |= pc5<br />#define ONL PORTC &amp;= ~pc5<br />#define TGL PORTC ^= pc5<br /><br />#define S1_KR1 (1&lt;&lt;PB6)<br /><br /><br />char buffer_out1&#91;32&#93;;<br />void majne_funkcjon ( void * nRF_RX_buff , uint8_t len );<br /><br />int main (void)<br />{<br />// wyłączamy komparator analogowy bo domyślnie jest włączony po restarcie<br />ACSR |= (1&lt;&lt;ACD);<br /><br />DDRC |= pc5;<br />DDRD |= pd3;<br /><br />DDRB &amp;= ~S1_KR1;<br />PORTB |= S1_KR1;<br /><br />OFFD;<br />ONL;<br /><br />//aktywacja i ustawienie trybu POWER-DOWN (najoszczędniejszy) &quot;MCUCR |= ((1&lt;&lt;SM0)|(1&lt;&lt;SM1));&quot;<br />set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br /><br />//init_USART(__UBRR);<br />    nRF_init();<br /><br />    sei();<br /><br />    register_nRF_RX_Event_Callback(majne_funkcjon);<br /><br />    nRF_RX_Power_Up(); //Enable in receiving mode<br /><br />#if TRYB==1<br />    _delay_ms(2000);<br />#endif<br /><br />    OFFL;<br />while(1)<br />{<br />#if TRYB == 1<br /><br />OND;<br />nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia dla forum ATNEL!&quot; );<br /><br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br /><br />_delay_ms(1000);<br /><br /><br />nRF_SendDataToAir( ( uint8_t * ) &quot;Pozdrowienia dla forum ATNEK!&quot; );<br /><br /><br />if( buffer_out1&#91;0&#93; != 0 )<br />{<br />memset(buffer_out1, 0, 32);<br />}<br />OFFD;<br />_delay_ms(1000);<br />#endif<br /><br />#if TRYB == 2<br /><br />//sleep_mode();<br />nRF_RX_EVENT();<br />//wejście w stan uśpienia<br /><br /><br />#endif<br />}<br />}<br /><br /><br />void majne_funkcjon ( void * nRF_RX_buff, uint8_t len )<br />{<br />char str1&#91;&#93; = &quot;Pozdrowienia dla forum ATNEL!&quot;;<br />char str2&#91;&#93; = &quot;Pozdrowienia dla forum ATNEK!&quot;;<br /><br />if((strstr( (char *) nRF_RX_buff, str1))!=NULL )<br />{<br />ONL;<br />}<br />else if((strstr( (char *) nRF_RX_buff, str2))!=NULL )<br />{<br />OFFL;<br />}<br />}[/syntax]<br /><br />nRF24L01.h<br />[syntax=c]/*                  e-gadget.header<br /> * nRF24L01.h<br /> *<br /> *  Created on: 2015-03-07<br /> *    Modyfied: 2015-04-13 21:18:47<br /> *      Author: Nefarious19<br /> *<br /> * Project name: &quot;NRF24&quot;<br /> *<br /> *This is AVR GCC library for nRF24L01 module, ver. 1.0<br /> *It can be only used by REGISTERED USERS of www.forum.atnel.pl, <br /> *they must only leave this header in they C code.<br /> *<br /> *Library code was based on the libraries from the books:<br /> *<br /> *https://www.sklep.atnel.pl/pl/p/AVR-Microcontrollers-C-Programming-Basics-EN-BOOK-DVD/103<br /> *https://www.sklep.atnel.pl/pl/p/Jezyk-C-Pasja-programowania-mikrokontrolerow-8-bitowych-Wydanie-II-Ksiazka-DVD/104<br /> *<br /> *&quot;<br /> *<br /> *This library uses also some ideas from:<br /> *<br /> *http://gizmosnack.blogspot.com/2013/04/tutorial-nrf24l01-and-avr.html<br /> *http://www.tinkerer.eu/AVRLib/nRF24L01/<br /> *<br /> *<br /> */<br /><br /><br />#ifndef NRF24L01_H_<br />#define NRF24L01_H_<br /><br />#include &quot;nRF24L01_memory_map.h&quot;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />/////////////////////////////////////////////////////////////////////<br />#define TRYB 1    //<br />/////////////////////////////////////////////////////////////////////<br /><br />/////////////////////////////////////////////////////////////////////////////////////////////////////////<br />//       PIN ASSIGMENT - PRZYDZIAŁ PINÓW                                                               //<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />#define IRQ PD2//IRQ PIN<br />#define CE  PB0//CE PIN<br />#define CSN PB2//Chip select PIN<br />#define SS PB2//SS set the same as CSN<br />#define MOSI PB3//MOSI pin<br />#define MISO PB4//MISO pin<br />#define SCK PB5//SCK pin<br /><br /><br />#define SPI_DDR_PORT DDRB//direction port<br />#define SPI_PORT     PORTB//output port<br />#define SPI_PIN      PINB//input port<br /><br /><br />#define NRF_DDR_PORT DDRC//direction register of port which control nRF power<br />#define NRF_PORT            PORTC//output register of port which control nRF power<br />#define NRF_PIN             PC0//pin on the output register thah controls nRF power<br /><br />#define NRF_ON NRF_PORT &amp;= ~(1&lt;&lt;NRF_PIN);//turn on nRF<br />#define NRF_OFF NRF_PORT |= (1&lt;&lt;NRF_PIN);//turn off nRF<br /><br /><br />#define CSN_HIGH SPI_PORT |=  (1&lt;&lt;CSN) //make CSN high macro<br />#define CSN_LOW  SPI_PORT &amp;= ~(1&lt;&lt;CSN)//make CSN low macro<br /><br />#define CE_HIGH  SPI_PORT |=  (1&lt;&lt;CE)//make CE high macro<br />#define CE_LOW   SPI_PORT &amp;= ~(1&lt;&lt;CE)//make CE low macro<br /><br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />//SET TX and RX adresses length//<br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />#define TX_ADDRES_LENGTH 5<br />#define RX_ADDRES_LENGTH 5<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />// SET maximum payload size ( 1 - 32 bytes )//<br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />#define MAXIMUM_PAYLOAD_SIZE 32<br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />// define using IRQ (1 - use IRQ, 0 - don't use IRQ)//<br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />#define USE_IRQ 1<br /><br /><br />#if USE_IRQ == 1<br />////////////////////////////////////////////////////////////<br />// INTERRUPTS CONFIGURATOR - Konfigurator przerwań        //<br />// 1 - interrupt active       1 - przerwanie aktywne      //<br />// 0 - interrupt not active   0 - przerwanie wyłączone    //<br />////////////////////////////////////////////////////////////<br />#define USE_MAX_RETRANSMISION_IRQ   1<br />#define USE_END_OF_TRANSMISSION_IRQ 1<br />#define USE_DATA_READY_TO_READ_IRQ  1<br /><br /><br />#if USE_MAX_RETRANSMISION_IRQ == 1<br />#define MAX_RT_MASK (0&lt;&lt;MASK_MAX_RT)<br />#else<br />#define MAX_RT_MASK (1&lt;&lt;MASK_MAX_RT)<br />#endif<br /><br />#if USE_END_OF_TRANSMISSION_IRQ == 1<br />#define TX_DS_MASK (0&lt;&lt;MASK_TX_DS)<br />#else<br />#define TX_DS_MASK (1&lt;&lt;MASK_TX_DS)<br />#endif<br /><br />#if USE_DATA_READY_TO_READ_IRQ == 1<br />#define RX_DR_MASK (0&lt;&lt;MASK_RX_DR)<br />#else<br />#define RX_DR_MASK (1&lt;&lt;MASK_RX_DR)<br />#endif<br /><br />#define nRF24L01_CONFIG ( RX_DR_MASK | MAX_RT_MASK | TX_DS_MASK )<br /><br />#else<br /><br />#define MAX_RT_MASK (1&lt;&lt;MASK_MAX_RT)<br />#define TX_DS_MASK (1&lt;&lt;MASK_TX_DS)<br />#define RX_DR_MASK (1&lt;&lt;MASK_RX_DR)<br />#define nRF24L01_CONFIG ( RX_DR_MASK | MAX_RT_MASK | TX_DS_MASK )<br /><br />#endif<br /><br />///''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// RX and TX event flags<br />//........................................................................................................................<br />extern volatile uint8_t TX_flag;<br />extern volatile uint8_t RX_flag;<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function declarations<br />//........................................................................................................................<br />void nRF_RX_EVENT (void);      //this function checks if there are data to read and if there is callback function registered.<br />  //if there are data avaliable to read this function sends this data to registered calbback function<br /><br />void register_nRF_RX_Event_Callback ( void ( * callback )( void * nRF_RX_buff , uint8_t len ) ); //this function is used to register RX_EVENT callback function<br /><br />void nRF_SendDataToAir( uint8_t * data ); //this function sends data to to another nRF or nRF's. Length of data payload is calculeted by strlen funcion so<br />  //you must send data in ASCII format<br />uint8_t nRF_Data_Ready(void);  //this function is used when IRQ are disabled. It checks if there any data to read<br />void Initialize_INTERRUPT_For_nRF(void);  //this function is used to initlialization of external interrupt for nRF<br />void nRF_init( void );                                                 //Initialize NRF24l01<br />void nRF_Config_Register(uint8_t register_name, uint8_t value);        //WRITE SOMETHING TO NRF REGISTER<br />void nRF_SET_Transmitter_Adres(const char * addres);   //this function sets transmitter addres<br />void nRF_SET_Reciver_Addres( uint8_t data_pipe, const char * addres ); //this function sets reciver addres of choosen datapipe<br />uint8_t nRF_Read_One_Byte_From_Register(uint8_t register_name);   //this function returns value of register given by attribute<br />void nRF_Set_Retransmission_Time_And_Ammount (uint8_t time, uint8_t ammount); //this function sets time beetwen retransmissions and ammount of them<br />void nRF_TX_Power_Up(void);  //this function turns on TX mode<br />void nRF_RX_Power_Up(void);  //this function turns on RX mode<br />void nRF_Power_Down(void);      //this funtion turns on Power_down mode<br />void nRF_Set_Channel( uint8_t channel );  //this function sets channel ( 0 to 127 )<br />void nRF_Clear_TX (void);  //this function clears TX fifo<br />void nRF_Clear_RX (void);  //this function clears RX fifo<br /><br /><br />#endif /* NRF24L01_H_ */[/syntax]<br /><br />nRF24L01.c<br />[syntax=c]/*                  e-gadget.header<br /> * nRF24L01.c<br /> *<br /> *  Created on: <br /> *    Modyfied: 2015-04-13 21:18:47<br /> *      Author: Nefarious19<br /> *<br /> * Project name: &quot;NRF24&quot;<br /> *<br /> *This is AVR GCC library for nRF24L01 module, ver. 1.0<br /> *It can be only used by REGISTERED USERS of www.forum.atnel.pl, <br /> *they must only leave this header in they C code.<br /> *<br /> *Library code was written on the basis of:<br /> *<br /> *https://www.sklep.atnel.pl/pl/p/AVR-Microcontrollers-C-Programming-Basics-EN-BOOK-DVD/103<br /> *https://www.sklep.atnel.pl/pl/p/Jezyk-C-Pasja-programowania-mikrokontrolerow-8-bitowych-Wydanie-II-Ksiazka-DVD/104<br /> *<br /> *&quot;<br /> *<br /> *This library uses also some ideas from:<br /> *<br /> *http://gizmosnack.blogspot.com/2013/04/tutorial-nrf24l01-and-avr.html<br /> *http://www.tinkerer.eu/AVRLib/nRF24L01/<br /> *<br /> *<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />//#include &quot;usart.h&quot;<br /><br />#include &quot;SPI.h&quot;<br />#include &quot;nRF24L01.h&quot;<br />#include &quot;nRF24L01_memory_map.h&quot;<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// declarations of internal tool functions<br />//..................................................................................................................<br />void nRF_Read_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content );  //reads given ammount of bytes from choosen register<br />void nRF_Write_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content ); //writes given ammount of bytes to choosen register<br />void nRF_Set_Active_DataPipe_And_ACK (uint8_t DataPipe, uint8_t on_or_off, uint8_t ACK_on_or_off ); //This function is used to set active payload/payloads and enable/disable ACK functions<br />void nRF_Set_PAYLOAD_Width ( uint8_t payload, uint8_t width );   //this function is used to set payload length. Use this function if dynamic payload length is disabled<br />void nRF_Set_Dynamic_Payload_State_On_Data_Pipe(uint8_t data_pipe_number, uint8_t on_off );  //this function is used to set<br />void nRF_Set_Data_Speed_And_Reciver_Power(uint8_t Data_rate, uint8_t power);                                         //this function is used to set transmission speed and reciver power<br />void nRF_Set_State_And_Width_Of_CRC( uint8_t one_or_two_bytes , uint8_t on_or_off);                                  //this function is used to set CRC state and width.<br />//__________________________________________________________________________________________________________________<br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<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 />//..................................................................................................................<br />volatile uint8_t disable_dynamic_payload;<br />volatile uint8_t payload_width;<br />volatile uint8_t first_time = 0;<br />//__________________________________________________________________________________________________________________<br /><br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// declaration of the buffer which stores incoming payloads data<br />//..................................................................................................................<br />uint8_t nRF_RX_bufffer&#91;MAXIMUM_PAYLOAD_SIZE+1&#93;; //reciver buffer<br />//__________________________________________________________________________________________________________________<br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// callback function declaration<br />//........................................................................................................................<br />static void ( * nRF_RX_Event_Callback ) ( void * nRF_RX_buff , uint8_t len );<br />//________________________________________________________________________________________________________________________<br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function which is used to register your own callback function<br />//........................................................................................................................<br />void register_nRF_RX_Event_Callback ( void ( * callback )( void * nRF_RX_buff , uint8_t len ) )<br />{<br />nRF_RX_Event_Callback = callback; //in this line we give an addres to our callback function<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// recived data event function<br />//........................................................................................................................<br />void nRF_RX_EVENT (void)<br />{<br />#if USE_IRQ == 0<br />if ( nRF_Data_Ready() )  RX_flag = 1;<br />else RX_flag = 0;<br />#endif<br />if ( RX_flag )// if RX_flag == 1 then: - jeżeli zmienna RX_flag == 1 to:<br />{<br />uint8_t fifo_status; //variable which stores FIFO_STATUS register value<br />uint8_t len;         //variable which stores length of recived payload<br />uint8_t i;           //index variable for loop<br />uint8_t * wsk;       //pointer for first byte of reciver buffer nRF_RX_buffer<br />RX_flag = 0;         //reset the RX_flag<br /><br />//do...while loop. this loop executes until RX_FIFO is empty<br />do<br />{<br />nRF_Config_Register(STATUS, (1&lt;&lt;RX_DR)); //Reset RX_DR IRQ flag in nRF STATUS register<br />wsk = nRF_RX_bufffer;        //wsk equals to addres of first byte nRF_RX_bufffer<br />CSN_LOW;                     //chip select low<br />SPI_WriteByte(R_RX_PL_WID);  //send: read length of payload command<br />len = SPI_WriteReadByte(NOP);//read length<br />CSN_HIGH;                    //chip select high<br /><br />if ( len &gt; MAXIMUM_PAYLOAD_SIZE ) break;       //if len is bigger than maximum payload size then break<br /><br />CSN_LOW;                    //chip select low<br />SPI_WriteByte( R_RX_PAYLOAD ); //read payload command<br />for (i = 0; i &lt; len; i++)    //read data until i &lt; len<br />{<br />*wsk++ = SPI_WriteReadByte(NOP);<br />}<br />CSN_HIGH;                    //csn goes high - csn stan wysoki<br />fifo_status = nRF_Read_One_Byte_From_Register(FIFO_STATUS); //read FIFO_STATUS register<br />}<br />while ( ( fifo_status &amp; (1&lt;&lt;RX_EMPTY) ) == 0 );  //if RX_EMPTY bit is LOW then loop must execute.<br />nRF_Clear_RX();//clear RX_FIFO<br />nRF_Config_Register(STATUS, (1&lt;&lt;RX_DR)); //Reset RX_DR IRQ flag in nRF STATUS register<br />if ( len &amp;&amp;  nRF_RX_Event_Callback ) ( * nRF_RX_Event_Callback )( nRF_RX_bufffer, len ); //if callback function is registered and len is bigger<br />                        //than 0 send recived data to your callback function<br /><br /><br />}<br />}<br /><br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// INITIALIAZE NRF function<br />//........................................................................................................................<br /><br />void nRF_init( void )<br />{<br /><br />init_SPI(); //initialize SPI (software or hardware, you must choose it in SPI.h file)<br /><br />#if USE_IRQ == 1<br />Initialize_INTERRUPT_For_nRF(); //initialize INTx or PCINTx interrupt for nRF, you must do it on your Own<br />#endif<br /><br />NRF_DDR_PORT |= (1&lt;&lt;NRF_PIN); //nRF power control pin is output - pin sterujący zasilaniem nRFa jako wyjście<br />NRF_OFF;                             //turn off nRF<br />_delay_ms(500);<br />NRF_ON;                              //turn on nRF<br />_delay_ms(500);<br /><br /><br />nRF_SET_Transmitter_Adres(PSTR(&quot;ATNEL&quot;));//set transmitter addres<br />nRF_SET_Reciver_Addres(RX_ADDR_P0, PSTR(&quot;ATNEL&quot;));//set reciving addres for datapipe0<br />nRF_Config_Register( CONFIG, nRF24L01_CONFIG);         //Write interrupt masks nRF_CONFIG to CONGIG register of nRF<br />nRF_Clear_RX();                                           //Clear RX FIFO<br />nRF_Clear_TX();                                            //Clear TX FIFO<br />nRF_Set_State_And_Width_Of_CRC( ONE_BYTE , ON );            //ON == Enable CRC; OFF == disable CRC, ONE_BYTE or TWO_BYTES - width of CRC;<br />nRF_Set_Channel(10);                                       //Set channel number<br />    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<br />nRF_Set_Data_Speed_And_Reciver_Power(TRANS_SPEED_250kB, RF_PWR_18dB );     //Set transmision speed and reciver power<br />nRF_Set_Dynamic_Payload_State_On_Data_Pipe( DPL_P0 , ON );              //Enable dynamic payload of choosen datapipe<br /><br /><br />RX_flag = 1;//Clear RX flag<br />TX_flag = 0;        //Clear TX flag<br /><br />nRF_Config_Register(STATUS, (1&lt;&lt;TX_DS) | (1&lt;&lt;RX_DR) | (1&lt;&lt;MAX_RT));    //Clear interrupt bits in STATUS register<br /><br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to read one byte from register given as attribute of the function<br />//........................................................................................................................<br />uint8_t nRF_Read_One_Byte_From_Register(uint8_t register_name)<br />{<br />uint8_t data;       //temporary variable data is used to store and return value of choosen register<br />CSN_LOW;                                                        //chip select low<br />SPI_WriteByte( R_REGISTER | (REGISTER_MASK &amp; register_name) );  //send R_REGISTER command with number of choosen register (SEE nRF24L01_memory_map.h)<br />data = SPI_WriteReadByte(NOP);                                  //write to &quot;data&quot;, value from choosen register<br />CSN_HIGH;                                                       //chip select high<br />return data;                                                    //return data<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to write data to the choosen register<br />//........................................................................................................................<br />void nRF_Config_Register(uint8_t register_name, uint8_t value)<br />{<br />CSN_LOW;//make CSN low<br />SPI_WriteByte( W_REGISTER | (REGISTER_MASK &amp; register_name) );  //send information to nRF which register you want to write<br />SPI_WriteByte( value );                                         //send value that you want write to this register<br />CSN_HIGH;                                                       //make CSN high<br />}<br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to read data from the choosen register to buffer<br />//........................................................................................................................<br />void nRF_Read_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content )<br />{<br />CSN_LOW; //make CSN low<br />SPI_WriteByte( R_REGISTER | ( REGISTER_MASK &amp; register_name ) ); //send information to nRF which register you want to read<br />SPI_WriteReadDataBuffer( buffer_for_registers_content, buffer_for_registers_content, length_of_content );//read from nRF given ammount of bytes to the buffer<br />CSN_HIGH;        //make CSN high<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to write data from the buffer to the choosen register<br />//........................................................................................................................<br />void nRF_Write_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content )<br />{<br />CSN_LOW;//make CSN low<br />SPI_WriteByte( W_REGISTER | ( REGISTER_MASK &amp; register_name ) );//send information to nRF which register you want to write<br />SPI_WriteReadDataBuffer( buffer_for_registers_content, buffer_for_registers_content, length_of_content );//write to nRF given ammount of bytes from the buffer<br />CSN_HIGH;//make CSN low<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set transmitter addres.<br />//........................................................................................................................<br />void nRF_SET_Transmitter_Adres(const char * addres)<br />{<br />char TX_addres&#91;TX_ADDRES_LENGTH&#93;;//declaration of TX_addres temporary buffer<br /><br />for(uint8_t i = 0; i &lt; TX_ADDRES_LENGTH; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />{<br />TX_addres&#91;i&#93; = pgm_read_byte(addres++);<br />}<br /><br />if( TX_ADDRES_LENGTH &gt; 5 ) nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres, 5);//if TX_ADDRES_LENGTH is bigger than 5 bytes send only 5 bytes<br />else if( TX_ADDRES_LENGTH &lt; 3 ) nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres, 3);  //if TX_ADDRES_LENGTH is smaller than 3 bytes send 3 bytes<br />else nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres , TX_ADDRES_LENGTH);             //else send given by attribute ammount of bytes<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set transmitter addres.<br />//........................................................................................................................<br />void nRF_SET_Reciver_Addres( uint8_t data_pipe, const char * addres )<br />{<br />char RX_addres&#91;RX_ADDRES_LENGTH&#93;;//declaration of RX_addres temporary buffer<br /><br />if( data_pipe &gt; RX_ADDR_P5 ) data_pipe = RX_ADDR_P0;     //this is a protection. When given by data_pipe variable register addres is smaller<br />else if( data_pipe &lt; RX_ADDR_P0 ) data_pipe = RX_ADDR_P0;// or bigger than possible value, this condition is setting deffault value<br />else if( data_pipe &gt; RX_ADDR_P5 ) data_pipe = RX_ADDR_P5;<br /><br />if ( data_pipe &lt; RX_ADDR_P2 )// data_pipe ix equal to RX_ADDR_P0 or RX_ADDR_P1 write 5 bytes of addres to nRF<br />{<br />for(uint8_t i = 0; i &lt; RX_ADDRES_LENGTH; i++ )<br />{<br />RX_addres&#91;i&#93; = pgm_read_byte(addres++);<br />}<br /><br />if( RX_ADDRES_LENGTH &gt; 5 ) nRF_Write_Register(data_pipe, (uint8_t*)RX_addres, 5);<br />else if( RX_ADDRES_LENGTH &lt; 3 ) nRF_Write_Register(data_pipe, (uint8_t*) RX_addres, 3);<br />else nRF_Write_Register(data_pipe, (uint8_t *) RX_addres, RX_ADDRES_LENGTH);<br />}<br />else//else send only one byte of addres because first four bytes are the same as the RX_ADDR_P1 first four bytes of addres.<br />{<br />RX_addres&#91;0&#93; = pgm_read_byte(addres);<br />nRF_Config_Register(data_pipe, RX_addres&#91;0&#93;);<br />}<br /><br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to chcecking RX_DR bit in STATUS register. When this bit is HIGH that means tha data are ready<br />// function used in pooling mode<br />//........................................................................................................................<br />uint8_t nRF_Data_Ready(void)<br />{<br />CSN_LOW;//make CSN low<br />uint8_t data = SPI_WriteReadByte(NOP);//send to nRF dummy byte and read STATUS register<br />CSN_HIGH;//make CSN high<br />return (data &amp; (1&lt;&lt;RX_DR));//return 0 if data not ready or 1 if data ready<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set state and width of CRC. First attrbiute of this function is ONE_BYTE or TWO_BYTES,<br />// second attribute is ON or OFF<br />//........................................................................................................................<br />void nRF_Set_State_And_Width_Of_CRC( uint8_t one_or_two_bytes , uint8_t on_or_off)<br />{<br />uint8_t config = nRF_Read_One_Byte_From_Register(CONFIG);//read data from congig register and save it to config variable<br /><br />if ( one_or_two_bytes == ONE_BYTE ) config &amp;= ~(1&lt;&lt;CRCO);//if first given attribute is ONE_BYTE clear CRCO bit<br />else if ( one_or_two_bytes == TWO_BYTES ) config |= (1&lt;&lt;CRCO);//else if first given attribute is TWO_BYTES set CRCO bit<br />else config &amp;= ~(1&lt;&lt;CRCO);//else given attribute is diffrent set CRCO low<br /><br />if (on_or_off == ON)   config |= (1&lt;&lt;EN_CRC);//if second attribute is equal to ON, set EN_CRC bit<br />else if ( on_or_off == OFF )  config &amp;= ~(1&lt;&lt;EN_CRC);//esle reset the EN_CRC bit<br /><br />nRF_Config_Register(CONFIG, config);//write config content to CONFIG register<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to switch nRF into TX mode<br />//........................................................................................................................<br />void nRF_TX_Power_Up(void)<br />{<br />CE_LOW;//make CE low<br />uint8_t config;//declaration of temporary variable<br />config = nRF_Read_One_Byte_From_Register(CONFIG);//save copy of config regster in config variable<br /><br />config &amp;= ~(1&lt;&lt;PRIM_RX);//reset PRIM_RX bit<br />config |= (1&lt;&lt;PWR_UP);//set PWR_UP bit<br /><br />nRF_Config_Register( CONFIG , config);//write config variable to CONGIG register<br />CE_HIGH;//make CE high<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to switch nRF into RX mode<br />//........................................................................................................................<br />void nRF_RX_Power_Up(void)<br />{<br />CE_LOW;//make CE_LOW<br />uint8_t config;//declaration of config variable<br />config = nRF_Read_One_Byte_From_Register(CONFIG);//save copy of CONFIG register to config variable<br />nRF_Config_Register(CONFIG , config | (1&lt;&lt;PWR_UP) | (1&lt;&lt;PRIM_RX) );//set PWR_UP and PRIM_RX bits in config variable ande save it in nRF CONFIG register<br />CE_HIGH;//make CE_HIGH<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to switch nRF into POWER DOWN mode<br />//........................................................................................................................<br />void nRF_Power_Down(void)<br />{<br />CE_LOW;//make CE_LOW<br />uint8_t config;//declaration of config variable<br />config = nRF_Read_One_Byte_From_Register(CONFIG);//save copy of CONFIG register to config variable<br />config &amp;= ~((1&lt;&lt;PWR_UP) | (1&lt;&lt;PRIM_RX));//reset PWR_UP and PRIM_RX bits<br />nRF_Config_Register(CONFIG , config );//save congig variable in CONFIG register<br />nRF_Clear_RX();//clear RX fifo<br />nRF_Clear_TX();//clear TX fifo<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set transmission channel<br />//........................................................................................................................<br />void nRF_Set_Channel( uint8_t channel )<br />{<br />nRF_Config_Register( RF_CH ,  0x7F &amp; channel );//save to nRF RF_CH register channel number (0x7f == 0b01111111 is the mask)<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to clear TX fifo<br />//........................................................................................................................<br />void nRF_Clear_TX (void)<br />{<br />CSN_LOW;//make CSN low<br />SPI_WriteByte( FLUSH_TX );//send to nRF FLUSH_TX command what means CLEAR TX FIFO<br />CSN_HIGH;//make CSN high<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to clear RX fifo<br />//........................................................................................................................<br />void nRF_Clear_RX (void)<br />{<br />CSN_LOW;//make CSN low<br />SPI_WriteByte( FLUSH_RX );//send to nRF FLUSH_RX command what means CLEAR RX FIFO<br />CSN_HIGH;//make CSN high<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set states of datapipes<br />// first attribute is DataPipe, you must put here name of datapipe tha you want to enable, this name is ERX_Px where x is number of data pipe (see nRF_Init function)<br />// second attribute is or_on_off, here you put ON or OFF macro. When you put here ON, the choosen data pipe will be turned ON, if put here OFF, datapipe will be turned off<br />// third and last parameter is ACK_on_or_off, you must put here macros: ACK_ON or ACK_OFF. This parameter turns ACK_ON or turns ACK_OFF<br />//........................................................................................................................<br />void nRF_Set_Active_DataPipe_And_ACK (uint8_t DataPipe, uint8_t on_or_off, uint8_t ACK_on_or_off )<br />{<br />uint8_t data = nRF_Read_One_Byte_From_Register(EN_RXADDR);//read data from EN_RXADDR register save it in data variable<br /><br />if(on_or_off == ON) data |= (DataPipe);//if second attribute is ON, set bit ERX_Px (given by DataPipe parameter)<br />else if (on_or_off == OFF) data &amp;= ~(DataPipe);//else reset this bit<br /><br />nRF_Config_Register( EN_RXADDR, data );//save data variable to EN_RXADDR register<br /><br />data = nRF_Read_One_Byte_From_Register(EN__AA);//read data from EN_AA register and save it in data variable<br /><br />if(ACK_on_or_off == ACK_ON) data |= (DataPipe);//if third parameter is ACK_ON, enable auto ackonwledgements by setting ENAA_Px bit (this same value as ERX_Px)<br />else if (ACK_on_or_off == ACK_OFF) data &amp;= ~(DataPipe);//else turn off auto acknowledgments<br /><br />nRF_Config_Register( EN__AA, data );//save the variable data to EN__AA register<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to send data to another nRF's<br />// attribute to this function is the pointer to the first byte of transsmision buffer<br />//........................................................................................................................<br />void nRF_SendDataToAir( uint8_t * data )<br />{<br /><br /><br />#if USE_IRQ == 0<br /><br />CSN_LOW;//make CSN low<br />uint8_t data1 = SPI_WriteReadByte(NOP);//send to nRF dummy byte and read STATUS register<br />CSN_HIGH;//make CSN high<br /><br />if ( ( data1 &amp; (1&lt;&lt;MAX_RT) ) )//if maximum ammount of retransmissions is achived,<br />{<br />CE_LOW;//make CE low<br />nRF_Clear_TX();//clear TX FIFO<br />nRF_Config_Register(STATUS, data1 | (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS) );//reset TX_DS and MAX_RT intterrupt flags in STATUS register<br />return;                                                         //return<br />}<br />//else if was send or funcion is used for the first time<br />else if ( ( data1 &amp; (1&lt;&lt;TX_DS)) || (first_time == 0) ) TX_flag = 0;//TX flag = 0<br /><br />else TX_flag = 1;<br /><br />first_time = 1;//first_time equals to 1<br />nRF_Config_Register(STATUS, data1 | (1&lt;&lt;TX_DS));//clear TX_DS int flag<br /><br />#endif<br /><br />if(TX_flag == 1) return;//if still is in transmitting mode or function isn't used for the first time, return<br /><br /><br />TX_flag = 1;//set TX mode flag to one<br /><br />uint8_t * wsk = data;//wsk pointer is equal to the addres of first byte transmission buffer<br />uint8_t length;//declare length variable<br />if(disable_dynamic_payload == 1) length = payload_width;//if nRF_Set_PAYLOAD_Width() was used use the length variable is equal to width parameter of tha function<br />else length = strlen((char*) data);//else length is equal to the size of transmission buffer<br /><br />if ( length &gt;= MAXIMUM_PAYLOAD_SIZE ) length = 32;<br /><br />nRF_TX_Power_Up();//turn on transmission mode<br />nRF_Clear_TX();//clear TX fifo<br /><br />CSN_LOW;//make CSN low<br />SPI_WriteByte(W_TX_PAYLOAD);//send to nRF W_TX_PAYLOAD command what means &quot;Write data to TX FIFO&quot;<br />for (uint8_t i = 0; i &lt; length; i++ )//until &quot;i&quot; is smaller than &quot;length&quot; send bytes to nRF<br />{<br />SPI_WriteByte(*wsk++);<br />}<br />CSN_HIGH;//CSN high<br />CE_HIGH;//start transmision!<br />}<br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set payload width<br />// first attribute of this function is number or RX payload (RX_PW_Px), second one is the width(1-32 bytes)<br />// use this function only if the dyanmic payloads are turned off<br />//........................................................................................................................<br />void nRF_Set_PAYLOAD_Width ( uint8_t payload, uint8_t width )<br />{<br />nRF_Config_Register( payload, ( 0x1F &amp; width ) );//config RX_PW_Px with number of bytes<br />disable_dynamic_payload = 1;//set the disable_dynamic_payload flag<br />payload_width = width;//global variable payload_width is equal to width given by attribute<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to number of retransmissions and time beetwen each retransmission<br />// first attribute is WAIT_XXXX_uS and the second is RETR_X_TIMES (see nRF_memory_map.h)<br />//........................................................................................................................<br />void nRF_Set_Retransmission_Time_And_Ammount (uint8_t time, uint8_t ammount)<br />{<br />nRF_Config_Register( SETUP_RETR, ( time | ammount ) );//write to SETUP_RETR register number of retransmisions and time beetwen them<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set transmission speed and receiver power<br />// first attribute is TRANS_SPEED_x and the second is RF_PWR_x (see nRF_memory_map.h)<br />//........................................................................................................................<br />void nRF_Set_Data_Speed_And_Reciver_Power(uint8_t Data_rate, uint8_t power)<br />{<br />nRF_Config_Register( RF_SETUP, ( Data_rate | power )); //write to RF_SETUP register transmision speed and and receiver power<br />}<br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// function used to set dynamic payloads<br />// first attribute is DPL_Px (number of receiver payload) and the second is ON or OFF(see nRF_memory_map.h)<br />//........................................................................................................................<br />void nRF_Set_Dynamic_Payload_State_On_Data_Pipe(uint8_t data_pipe_number, uint8_t on_off )<br />{<br />nRF_Config_Register( DYNPD, data_pipe_number );//save DPL_Px value to DYNPD register<br />uint8_t feature = nRF_Read_One_Byte_From_Register(FEATURE);//make copy of FEATURE register<br /><br />if (on_off == ON)feature |= (1&lt;&lt;EN_DPL);//if second attribute is equal to ON<br />//set bit EN_DPL<br />if (on_off == OFF)feature &amp;= ~(1&lt;&lt;EN_DPL);//if second attribute is equal to OFF<br />//reset bit EN_DPL<br />nRF_Config_Register(FEATURE, feature);//save feature variable to FEATURE register<br />}<br /><br /><br />#if USE_IRQ == 1<br />//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''//<br />//         IRQ INTERRUPT HANDLER section                   //<br />//.............................................................................//<br /><br />//in this function you must put your initialization of external intterup (INTx or PCINTx)<br />//if you don't use interrupts there is no matter what code is here<br /><br />void Initialize_INTERRUPT_For_nRF(void)<br />{<br />    MCUCR = ((1&lt;&lt;ISC11)|(0&lt;&lt;ISC10)|(1&lt;&lt;ISC01)|(0&lt;&lt;ISC00)); // Set external interupt on falling edge<br />    GICR  = ((0&lt;&lt;INT1)|(1&lt;&lt;INT0));                         // Activate INT0<br />}<br /><br />//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />// Here is external intterupt handler, if you are using interupts change the name of the vector interrupt ore live the same if you are using the same<br />//...................................................................................................................................................<br />ISR(INT0_vect)<br />{<br />CSN_LOW;//Chip select LOW<br />register uint8_t status = SPI_WriteReadByte(NOP);//read STATUS register value<br />CSN_HIGH;//chip select high<br /><br />if ( (status &amp; (1&lt;&lt;RX_DR)) )//id data recived<br />{<br />status |= (1&lt;&lt;RX_DR);//reset intterupt bit on status variable<br />nRF_Config_Register(STATUS, status);//save status variable in STATUS register<br />RX_flag = 1;//RX flag equals to 1<br />}<br /><br />if ( status &amp; (1&lt;&lt;TX_DS) )//if data was send<br />{<br />status |= (1&lt;&lt;TX_DS);//clear TX_DS bit in status variable<br />nRF_Config_Register( STATUS, status );//save status variable in STATUS register<br />TX_flag = 0;//TX_flag = 0<br />nRF_RX_Power_Up();//enable receiving mode<br />}<br /><br />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 />}<br />}<br /><br />#endif[/syntax]<br /><br />nRF24L01_memory_map.h<br />[syntax=c]/*                  e-gadget.header<br /> * nRF24L01_memory_map.h<br /> *<br /> *  Created on: 2015-03-07<br /> *    Modyfied: 2015-04-13 21:18:47<br /> *      Author: Nefarious19<br /> *<br /> * Project name: &quot;NRF24&quot;<br /> *<br /> *This is AVR GCC library for nRF24L01 module, ver. 1.0<br /> *It can be only used by REGISTERED USERS of www.forum.atnel.pl, <br /> *they must only leave this header in they C code.<br /> *<br /> *Library code was based on the libraries from the books:<br /> *<br /> *https://www.sklep.atnel.pl/pl/p/AVR-Microcontrollers-C-Programming-Basics-EN-BOOK-DVD/103<br /> *https://www.sklep.atnel.pl/pl/p/Jezyk-C-Pasja-programowania-mikrokontrolerow-8-bitowych-Wydanie-II-Ksiazka-DVD/104<br /> *<br /> *&quot;<br /> *<br /> *This library uses also some ideas from:<br /> *<br /> *http://gizmosnack.blogspot.com/2013/04/tutorial-nrf24l01-and-avr.html<br /> *http://www.tinkerer.eu/AVRLib/nRF24L01/<br /> *<br /> *<br /> */<br /><br />#ifndef NRF24L01_MEMORY_MAP_H_<br />#define NRF24L01_MEMORY_MAP_H_<br /><br /><br />/////////////////////////////////////////////<br />//  SWITCHES definitions<br />/////////////////////////////////////////////<br />///////////////////<br />#define ON   1<br />#define OFF  2<br />///////////////////<br />#define TWO_BYTES 2<br />#define ONE_BYTE  1<br />///////////////////<br />#define ACK_ON    1<br />#define ACK_OFF   2<br />///////////////////<br /><br /><br /><br />//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''//<br />//REGISTERS LIST OF nRF24L01 - SPIS REJESTRÓW MODUŁU nRF24L01//<br />//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//<br />#define CONFIG      0x00     //CONFIGURATION REGISTER  -  REJESTR CONFIGURACYJNY<br />#define EN__AA      0x01     //ENABLE AUTO ACKNOWLEDGEMENT - WŁĄCZ AUTOMATYCZNE POTWIERDZENIE DOTARCIA PAKIETU<br />#define EN_RXADDR   0x02     //ENABLE RX ADRESSES - WŁĄCZONE ADRESY ODBIORCZE DLA STRUMIENI DANYCH (0 - 5 DATA PIPES)<br />#define SETUP_AW    0x03 //SETUP ADRESSE WIDTH - USTAL DŁUGOŚC ADRESU (3-5 BAJTÓW) WSPÓLNE DLA KAŻDEGO Z 6 STRUMIENI DANYCH (DATA PIPES)<br />#define SETUP_RETR  0x04 //SETUP RETRANSMISON - USTAW CZAS PONOWNEJ RETRANSMISJI PAKIETU<br />#define RF_CH       0x05     //CHANNEL - KANAŁ NA JAKIM JEST NADAWANIE<br />#define RF_SETUP    0x06     //TRANSMISSION SETTINGS - USTAWIENIA TRANSMISJI<br />#define STATUS      0x07     //STATUS REGISTER - REJESTR STATUSU<br />#define OBSERVE_TX  0x08     //TRANSMIT OBSERVE REGISTER - OBSERWACJA STANU NADAWANIA<br />#define RPD         0x09     //RECIVED POWER DETECTOR - WYKRYWANIE MOCY NADAWANEGO SYGNAŁU<br />#define RX_ADDR_P0  0x0A     //RECEIVER ADDRES FOR DATA PIPE 0 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 0<br />#define RX_ADDR_P1  0x0B //RECEIVER ADDRES FOR DATA PIPE 1 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 1<br />#define RX_ADDR_P2  0x0C //RECEIVER ADDRES FOR DATA PIPE 2 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 2<br />#define RX_ADDR_P3  0x0D //RECEIVER ADDRES FOR DATA PIPE 3 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 3<br />#define RX_ADDR_P4  0x0E //RECEIVER ADDRES FOR DATA PIPE 4 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 4<br />#define RX_ADDR_P5  0x0F     //RECEIVER ADDRES FOR DATA PIPE 5 - ADRES ODBIORCZY DLA STRUMIENIA DANYCH NR 5<br />#define TX_ADDR     0x10     //TRANSMITER ADDRES - ADRES NADAWCZY MODUŁU<br />#define RX_PW_P00x11     //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 0 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 0<br />#define RX_PW_P10x12 //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 1 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 1<br />#define RX_PW_P20x13 //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 2 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 2<br />#define RX_PW_P30x14 //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 3 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 3<br />#define RX_PW_P40x15 //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 4 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 4<br />#define RX_PW_P50x16 //RECEIVER PAYLOAD WIDTH FOR DATA PIPE 5 - DŁUGOŚC ODEBRANEGO PAKIETU ZE STRUMIENIA DANYCH 5<br />#define FIFO_STATUS 0x17     //FIFO STATUS - STATUS STOSÓW NADAWCZYCH I ODBIORCZYCH<br />#define DYNPD       0x1C     //DYNAMIC PAYLOAD WIDTH - DYNAMICZNA SZEROKOŚC RAMKI DANYCH<br />#define FEATURE     0x1D     //FEATURE REGISTER - REJESTR Z FICZERAMI<br /><br /><br />//&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;//<br />//LIST OF CONFIGURATION BITS IN EACH REGISTER - LISTA BITÓW KONFIGURACYJNYCH W KAŻDYM REJESTRZE//<br />//.............................................................................................//<br /><br />// |CONFIG|<br />#define MASK_RX_DR       6  //1-OFF, 0-ON INTERRUPT ON IRQ IF RECIVED DATA READY  -  1-WYŁĄCZ, 0-WŁĄCZ PRZERWANIE NA PINIE IRQ GDY ODEBRANE DANE GOTOWE<br />#define MASK_TX_DS       5  //1-OFF, 0-ON INTERRUPT ON IRQ IF DATA TRANSMITED SUCCESFULLY   -  1-WYŁĄCZ, 0-WŁĄCZ PRZERWANIE NA PINIE IRQ GDY DANE WYSŁANO POMYŚLNIE<br />#define MASK_MAX_RT      4  //1-OFF, 0-ON INTERRUPT ON IRQ IF MAXIMUM ACCOUNT OF RETRANSMISIONS IS ACHIVED  -  1-WYŁĄCZ, 0-WŁĄCZ PRZERWANIE NA PINIE IRQ GDY PRZEKROCZONO MAKSYMALNĄ LICZBE RETRANSMISJI PAKIETU<br />#define EN_CRC           3  //ENABLE CRC - WŁĄCZ SUME KONTROLNĄ CRC<br />#define CRCO             2  //CRC ENCHODING SCHEME - IF 0 -&gt; crc == 1 BYTE; IF 1 CRC == 2 BYTES; LICZBA BAJTÓW UMY KONTROLNEJ CRC: JEŻELI 0 -&gt; CRC TO 1 BAJT, JEŻELI 1 -&gt; CRC TO 2 BAJTY<br />#define PWR_UP           1  //1 - POWER UP, 0 - POWER DOW; 1 - WŁĄCZ MODUŁ, 0 - WYŁĄCZ MODUŁ<br />#define PRIM_RX          0  //RX/TX CONTROL: 1 - RECEIVING, 0 - TRANSMITING; KONTROLA ODBIÓR/NADAWANIE: 1 - OBIÓR, 0 - NADAWANIE<br /><br />// |EN_AA|<br />#define ENAA_P5      (1&lt;&lt;5)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 5 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 5<br />#define ENAA_P4      (1&lt;&lt;4)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 4 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 4<br />#define ENAA_P3      (1&lt;&lt;3)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 3 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 3<br />#define ENAA_P2      (1&lt;&lt;2)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 2 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 2<br />#define ENAA_P1      (1&lt;&lt;1)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 1 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 1<br />#define ENAA_P0      (1&lt;&lt;0)  //ENABLE AUTO ACKNOWLEDGEMENT DATA PIPE 0 - WŁĄCZ AUTOMATYCZNE POTWIERDZENIA POPRAWNEGO NDANIA/ODBIORU PAKIETU DLA STRUMIENIA DANYCH NR 0<br /><br />// |EN_RXADDR|<br />#define ERX_P5           (1&lt;&lt;5)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br />#define ERX_P4           (1&lt;&lt;4)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br />#define ERX_P3           (1&lt;&lt;3)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br />#define ERX_P2           (1&lt;&lt;2)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br />#define ERX_P1           (1&lt;&lt;1)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br />#define ERX_P0           (1&lt;&lt;0)  //ENABLE DATA PIPE 5 - WŁĄCZ STRUMIEŃ DANYCH NR 5<br /><br />// |SETUP_AW|<br />#define AW_3BYTE         1  //ADDRES WIDTH = 3 BYTES; SZEROKOŚC ADRESU = 3 BAJTY<br />#define AW_4BYTE         2  //ADDRES WIDTH = 4 BYTES; SZEROKOŚC ADRESU = 4 BAJTY<br />#define AW_5BYTE         3  //ADDRES WIDTH = 5 BYTES; SZEROKOŚC ADRESU = 5 BAJTÓW<br /><br />// |SETUP_RETR|<br /><br />//IN THE FIRST HALF OH THIS REGISTER (ARD) WE'RE SETTING TIME BEETWEN RETRANSMISSIONS<br />#define WAIT_4000uS   0xF0  //4000 microseconds - 4000 mikrosekund<br />#define WAIT_3750uS   0xE0  //3750 microseconds - 3750 mikrosekund<br />#define WAIT_3500uS   0XD0  //3500 microseconds - 3500 mikrosekund<br />#define WAIT_3250uS   0xC0  //3250 microseconds - 3250 mikrosekund<br />#define WAIT_3000uS   0xB0  //3000 microseconds - 3000 mikrosekund<br />#define WAIT_2750uS   0xA0  //2750 microseconds - 2750 mikrosekund<br />#define WAIT_2500uS   0x90  //2500 microseconds - 2500 mikrosekund<br />#define WAIT_2225uS   0x80  //2250 microseconds - 2250 mikrosekund<br />#define WAIT_2000uS   0x70  //2000 microseconds - 2000 mikrosekund<br />#define WAIT_1750uS   0x60  //1750 microseconds - 1750 mikrosekund<br />#define WAIT_1500uS   0x50  //1500 microseconds - 1500 mikrosekund<br />#define WAIT_1250uS   0x40  //1250 microseconds - 1250 mikrosekund<br />#define WAIT_1000uS   0x30  //1000 microseconds - 1000 mikrosekund<br />#define WAIT_750uS    0x20  //750 microseconds -  750 mikrosekund<br />#define WAIT_500uS    0x10  //500 microseconds -  500 mikrosekund<br />#define WAIT_250uS    0x00  //250 microseconds -  250 mikrosekund<br /><br />//IN THE SECOND HALF OF THIS REGISTER (ARC) WE'RE SETTING NUMBER OF RETRANSMISSIONS<br />#define RETR_15_TIMES 0x0F  //15 RETRANSMISSIONS - 15 RETRANSMISJI<br />#define RETR_14_TIMES 0x0E//14 RETRANSMISSIONS - 14 RETRANSMISJI<br />#define RETR_13_TIMES 0x0D  //13 RETRANSMISSIONS - 13 RETRANSMISJI<br />#define RETR_12_TIMES 0x0C//12 RETRANSMISSIONS - 12 RETRANSMISJI<br />#define RETR_11_TIMES 0x0B//11 RETRANSMISSIONS - 11 RETRANSMISJI<br />#define RETR_10_TIMES 0x0A//10 RETRANSMISSIONS - 10 RETRANSMISJI<br />#define RETR_9_TIMES  0x09//9  RETRANSMISSIONS - 9  RETRANSMISJI<br />#define RETR_8_TIMES  0x08  //8  RETRANSMISSIONS - 8  RETRANSMISJI<br />#define RETR_7_TIMES  0x07  //7  RETRANSMISSIONS - 7  RETRANSMISJI<br />#define RETR_6_TIMES  0x06  //6  RETRANSMISSIONS - 6  RETRANSMISJI<br />#define RETR_5_TIMES  0x05  //5  RETRANSMISSIONS - 5  RETRANSMISJI<br />#define RETR_4_TIMES  0x04  //4  RETRANSMISSIONS - 4  RETRANSMISJI<br />#define RETR_3_TIMES  0x03  //3  RETRANSMISSIONS - 3  RETRANSMISJI<br />#define RETR_2_TIMES  0x02  //2  RETRANSMISSIONS - 2  RETRANSMISJI<br />#define RETR_1_TIME   0x01  //1  RETRANSMISSIONS - 1  RETRANSMISJI<br />#define RETR_0_TIMES  0X00  //0  RETRANSMISSIONS - 0  RETRANSMISJI<br />#define RETR_DISABLED 0X00  //0  RETRANSMISSIONS - 0  RETRANSMISJI<br /><br />// |RF_SETUP|<br />#define CONT_WAVE        7  //CONTINOUS CARRIER TRANSMIT - CIĄGŁE NADAWANIE NOŚNEJ<br />#define RF_DR_LOW        5  //RF DATA RATE LOW  - MŁODSZY BIT W DWUBITOWYM &quot;SŁOWIE&quot; DO USTAWIANIA PRĘDKOŚCI TRANSMISJI<br />#define RF_DR_HIGH       3  //RF DATA RATE HIGH - STARSZY BIT W DWUBITOWYM &quot;SŁOWIE&quot; DO USTAWIANIA PRĘDKOŚCI TRANSMISJI<br />#define PLL_LOCK         4  //FORCE PLL LOCK SIGNAL. ONLY USED IN TEST<br /><br />#define RF_PWR_18dB        ( (0&lt;&lt;1) | (0&lt;&lt;2) )    //SIGNAL POWER - -18dB<br />#define RF_PWR_12dB        ( (0&lt;&lt;1) | (1&lt;&lt;2) )    //SIGNAL POWER - -12dB<br />#define RF_PWR_6dB         ( (1&lt;&lt;1) | (0&lt;&lt;2) )  //SIGNAL POWER - -6dB<br />#define RF_PWR_0dB         ( (1&lt;&lt;1) | (1&lt;&lt;2) )    //SIGNAL POWER -  08dB<br /><br />#define TRANS_SPEED_2MB    ( (0&lt;&lt;RF_DR_LOW) | (1&lt;&lt;RF_DR_HIGH) )  //TRANSMISION SPEED 2MBITS/SECOND<br />#define TRANS_SPEED_1MB    ( (0&lt;&lt;RF_DR_LOW) | (0&lt;&lt;RF_DR_HIGH) )  //TRANSMISION SPEED 1 MBIT/SECOND<br />#define TRANS_SPEED_250kB    (1&lt;&lt;RF_DR_LOW)   //TRANSMISION SPEED 250 KBIT/SECOND<br /><br />// |STATUS|<br />#define RX_DR       6     //RECIVED DATA READY - ODEBRANE DANE SĄ GOTOWE<br />#define TX_DS       5     //TRASMITED DATA SENT - WYSŁANO POPRAWNIE DANE<br />#define MAX_RT      4     //MAXIMUM ACCOUNT OF RETRANSMISION ACHIVED - OSIAGNIĘTO MAKSYMALNĄ ILOSC RETRANSMISJI<br />#define TX_FULL     0     //TX FIFO IS FULL - BUFOR NADAWCZY JEST PEŁNY<br /><br />#define RX_PIPE_0   ( (0&lt;&lt;3) | (0&lt;&lt;2) | (0&lt;&lt;1) )<br />#define RX_PIPE_1   ( (0&lt;&lt;3) | (0&lt;&lt;2) | (1&lt;&lt;1) )<br />#define RX_PIPE_3   ( (0&lt;&lt;3) | (1&lt;&lt;2) | (1&lt;&lt;1) )<br />#define RX_PIPE_4   ( (1&lt;&lt;3) | (0&lt;&lt;2) | (0&lt;&lt;1) )<br />#define RX_PIPE_5   ( (1&lt;&lt;3) | (0&lt;&lt;2) | (1&lt;&lt;1) )<br /><br />// |OBSERVE_TX|<br />#define PLOS_CNT    4//FIRST BIT OF LOST PACKET COUNTER<br />#define ARC_CNT     0//FIRST BIT OF RETRANSMITTED PACKET COUNTER<br /><br />// |FIFO_STATUS|<br />#define TX_REUSE    6    //REUSE TX FIFO PAYLOAD  -  TO SET THIS BIT USE &quot; REUSE_TX_PAYLOAD &quot;; DATA AVALIABLE IN TX FIFO WILL BE SENT<br />#define FULL_TX     5    //TX FIFO IS FULL FLAG   - FLAGA OZNACZAJĄCA ŻE BUFOR NADAWCZY JEST PEŁNY<br />#define TX_EMPTY    4    //TX IS EMPTY FLAG - FLAGA OZNACZAJĄCA PUSTY BUFOR NADAWCZY<br />#define RX_FULL     1    //RX IS FULL FLAG - FLAGA OZNACZAJĄCA ŻE BUFOR ODBIORCZY JEST PEŁNY<br />#define RX_EMPTY    0    //RX IS EMPTY FLAG - FLAGA OZNACZAJĄCA PUSTY BUFOR ODBIORCZY<br /><br />// |DYNPD|<br /><br />#define DPL_P5(1&lt;&lt;5)//DYNAMIC PAYLOAD ON DATAPIPE 5<br />#define DPL_P4(1&lt;&lt;4)//DYNAMIC PAYLOAD ON DATAPIPE 4<br />#define DPL_P3(1&lt;&lt;3)//DYNAMIC PAYLOAD ON DATAPIPE 3<br />#define DPL_P2(1&lt;&lt;2)//DYNAMIC PAYLOAD ON DATAPIPE 2<br />#define DPL_P1(1&lt;&lt;1)//DYNAMIC PAYLOAD ON DATAPIPE 1<br />#define DPL_P0(1&lt;&lt;0)//DYNAMIC PAYLOAD ON DATAPIPE 0<br /><br /><br />// |FEATURE|<br /><br />#define EN_DPL      2//ENABLE DYNAMIC PAYLOAD<br />#define EN_ACK_PAY  1//ENABLE PAYLOADS WHICH CAN BE SEND WITH ACK PACKET<br />#define EN_DYN_ACK  0//ENABLE POSSIBILITY OF USING W_TX_PAYLOAD_NO_ACK COMMAND<br /><br /><br />//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''//<br />//nRF24L01 COMMAND LIST  -  LISTA KOMEND MODUŁU nRF24L01                    //<br />//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//<br />#define W_ACK_PAYLOAD        0xA8//WRITE PAYLOAD WITH ACK PACKET (USED IN RECEIVER WHEN YOU WANT RETURN ACK WITH SOME SPECIAL PACKET)<br />#define R_REGISTER           0x00   //READ REGISTER -- ODCZYTAJ REJESTR<br />#define W_REGISTER           0x20   //WRITE REGISTER -- ZAPISZ DO REJESTRU<br />#define REGISTER_MASK        0x1F//CONSTANT USED TO MASKING REGISTERS<br />#define R_RX_PAYLOAD         0x61   //READ RX PAYLOAD -- ODCZYTAJ DANE Z BUFORA ODBIORCZEGO<br />#define W_TX_PAYLOAD   0xA0   //WRITE TX PAYLOAD -- ZAPISZ DANE DO BUFORA NADAWCZEGO<br />#define FLUSH_TX      0xE1   //FLUSH TX - WYCZYŚC BUFOR TX<br />#define FLUSH_RX      0xE2   //FLUSH RX - WYCZYŚC BUFOR RX<br />#define REUSE_TX_PL   0xE3   //REUSE TX PAYLOAD - WYSLIJ PONOWNIE DANE Z BUFORA TX<br />#define W_TX_PAYLOAD_NO_ACK 0xB0//SEND PACKET TO ANOTHER NRF WITHOUT ACK<br />#define NOP                  0xFF   //NOP - NIC NIE RÓB - PO WYSŁANIEU TEGO BAJTU NRF ZWRACA REJESTR STATUS<br />#define R_RX_PL_WID          0x60//READ RX PAYLOAD WIDTH<br /><br />#endif /* NRF24L01_MEMORY_MAP_H_ */[/syntax]<br /><br />Wszystko niby działa z tym, że czytałem na forach że takie NRF'y w tej tańszej wersji mają zasięg 100 a nawet do 200m na otwartej przestrzeni a w budynkach to nawet przez trzy płyty zbrojone jest zasięg. Moje dzieło daje radę na max 18m na otwartej przestrzeni w słoneczny dzień, biorąc pod uwagę że mieszkam przy lesie z daleka od zabudowań więc nie powinno być problemu z zakłóceniami. <br /><br />Proszę więc o sugestię w czym tkwi problem tak słabego zasięgu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10670">Sucyn</a> — 19 cze 2016, o 12:15</p><hr />
]]></content>
</entry>
</feed>