<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=22766&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-12-30T16:05:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=22766&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-12-30T16:04:13+01:00</updated>
<published>2019-12-30T16:04:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223888#p223888</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223888#p223888"/>
<title type="html"><![CDATA[Re: [C][RPI][rfm69] Obsługa RFM69 na raspberry PI w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223888#p223888"><![CDATA[
Bardzo ciekawa konwersja <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> gratki za odpalenie na malince<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 gru 2019, o 16:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2019-12-30T16:05:17+01:00</updated>
<published>2019-12-30T16:01:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223887#p223887</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223887#p223887"/>
<title type="html"><![CDATA[[C][RPI][rfm69] Obsługa RFM69 na raspberry PI w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22766&amp;p=223887#p223887"><![CDATA[
Cześć<br /><br />Poniżej przedstawię obsługę moduły RFM69 na raspberrypi. Program pisałem w NetBeans na windowsie w języku C (stosowałem cross-compiler)<br /><br />Z góry przepraszam z chaos.<br /><br />Biblioteka wykorzystuje również bibliotekę <a href="http://wiringpi.com/"  class="postlink">wiringPI</a>, która niestety nie będzie już uaktualniana (<a href="http://wiringpi.com/wiringpi-deprecated/"  class="postlink">tu</a> można o tym poczytać). Może uda mi się jeszcze przy wykorzystaniu spiDEV to oprogramować.<br /><br />Całej biblioteki nie będę umieszczał tylko fragmenty, które zostały zmienione - bazuje ona na bibliotece od Mirka..<br />A więc tak, obsługa komend wygląda następująco:<br />[syntax=c]char rfm69_cmd(unsigned char cmd, unsigned char var, uint8_t rw){<br />unsigned char data&#91;2&#93; = { cmd, var};<br />if(rw){<br />data&#91;0&#93; = cmd | 128;<br />}<br />wiringPiSPIDataRW(0,data,2);<br />return data&#91;1&#93;;<br />}[/syntax]<br />Do tej funkcji przekazywane są trzy argumenty, w pierwotnej były dwa, więc wszystkie odnośniki do tej funkcji należy zmienić. Przykład<br />[syntax=c]rfm69_cmd(0x3D12, 1); // Packet-Config2<br />na<br />rfm69_cmd(0x3D, 0x12, 1); // Packet-Config2[/syntax]<br /><br />Biblioteka będzie obsługiwała sprzętowo SPI, więc należy usunąć wszystko co było związane z obsługą programową SPI:<br />[syntax=c]RFM_ACTIVATE;<br />RFM_DEACTIVATE;[/syntax]<br /><br />W funkcji <em>rfm69_fifo_transfer</em> został zmieniony pierwszy warunek na :<br />[syntax=c]uint8_t rfm69_fifo_transfer( uint8_t *data, uint8_t write ) {<br />// Write data length or read data length depending on mode<br />if( !write ){<br />tmp = (uint8_t)rfm_cmd(0x00, 0xff, 0);<br />data&#91;0&#93; = tmp;<br /> }[/syntax]<br />oraz zmieniony został sposób przesyłania danych FIFO, na:<br />[syntax=c]// Write/read data bytes<br />if(..){<br />tmp = (uint8_t)rfm_cmd(0x00, (write ? data&#91;i&#93; : 0xFF), write);[/syntax]<br /><br />W funkcji odpowiedzialnej za ustawianie ID naszej sieci należy zmienić część gdzie odczytujemy dane z przestrzeni programu. Zmieniamy to na:<br />[syntax=c]for(i=0; i&lt;netid_len; i++) {<br />rfm_cmd( base,  network_id&#91;i&#93;  , 1);<br />base++;<br />}[/syntax]<br />Teraz przechodzimy do funkcji inicjalizującej nasz układ rfm. Na początku znajduje się kod odpowiedzialny za konfigurację przerwać z mikrokontrolera AVR - usuwamy to jak i konfigurację wejść wyjść.<br /><br />W funkcji odbierającej dane zmieniłem sposób odczytu długości odbieranej ramki danych, oraz odbiór samej ramki danych:<br />[syntax=c]len = (uint8_t)rfm_cmd(0x00, 0xff, 0);<br /><br />for (uint8_t i = 0; i &lt;=len; i++) {<br />wsk&#91;i&#93; = (uint8_t)rfm_cmd(0x00, 0xff, 0);<br />}[/syntax]<br /><br />Zostały utworzone dodatkowe dwie funkcje do ustawienia pinów RST i IRQ, oraz funkcja resetująca układ:<br />[syntax=c]#define PIN_RST11<br />#define SPI_IRQ6<br /><br />void rfm_pin_cnf(void){<br />//reset<br />pinMode(PIN_RST,OUTPUT);<br /><br />//irq<br />pinMode(SPI_IRQ,INPUT);<br />pullUpDnControl(SPI_IRQ,PUD_OFF);<br />}<br /><br />void rfm_reset(void){<br />digitalWrite(PIN_RST,1);<br />delay(1);<br />digitalWrite(PIN_RST,0);<br />delay(10);<br />}[/syntax]<br /><br />Ze względu na brak jeszcze umiejętności obsługi wątków i przerwań, sprawdzanie czy naleciały nowe dane wykonuję w pętli głównej, poprzez sprawdzanie stanu pinu IRQ:<br />[syntax=c]if(digitalRead(SPI_IRQ)){<br />uint8_t flags2 = rfm_status();// we check only flags2 - lower byte<br /><br />if( flags2 &amp; 1&lt;&lt;2 ) {<br />RX_flag=1;// set rx_flag for RX_EVENT<br />}<br />}[/syntax]<br /><br />Możliwe jest też wykorzystanie funkcji <em>rfm69_receiving</em> i odczyt co jakiś czas czy ta funkcja zwróci 1, co będzie informacją o odebranych danych. Tylko w tym przypadku należy dodać jakąś zwłokę czasową w pętli.<br /><br />Na początku biblioteki należy zmienić też dołączane biblioteki:<br />[syntax=c]#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;stdint.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;ctype.h&gt;<br />#include &quot;wiringPi.h&quot;<br />#include &quot;wiringPiSPI.h&quot;<br />#include &quot;ds_rfm69.h&quot; //przerobiona biblioteka mk_rfm69[/syntax]<br /><br />Obsługa tak zmodyfikowanej biblioteki wygląda następująco (dla odbioru) :[syntax=c]//wiringpi<br />wiringPiSetup(); // uaktywniamy bibliotekę wiringpi<br />wiringPiSPISetup(0,1000000); //uaktywniamy biblitekę do obsługi SPI - port 0, częstotliwość 1MHZ<br />rfm_pin_cnf(); //konfiguracja pinów na potrzeby rfm<br />rfm_reset();//reset modułu<br />//konfiguracja RFM<br />rfm_init(FREQ(433), 0, ADDR_FILTER_OFF, 0, 0 );<br />rfm_rx_event_callback( my_receive_packet );<br />while(1){<br />RFM_RX_EVENT(buf_ism);<br />}[/syntax]<br /><br />Jednak biblioteki od Mirka są uniwersalne - po małych przeróbkach nawet na malince można odpalić jego bibliotekę.<br />Jeżeli coś pominąłem to poprawię. Jeżeli zauważyłeś jakiś błąd to pisz;)<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 30 gru 2019, o 16:01</p><hr />
]]></content>
</entry>
</feed>