Witam!
U mnie występuje taki problem, że sygnał nRES mam cały czas w stanie niskim, czyli aktywny przez co nie mam w ogóle komunikacji pomiędzy modułami. Wie ktoś może jak rozwiązać taki problem. Podłączyłem sygnał nRES do VCC jednak to nic nie pomogło :/
Pozdrawiam.
EDIT:
Mój problem został rozwiązany. Źle dobrałem kondensatory pod stabilizator.
Przeczytałeś cały topic, czy tylko ostatni post ???????
Porad udzielam wyłącznie na forum, nie pomagam na PW
Zanim zadasz pytanie, wiedz, że zostało już omówione tutaj, a 99% nie jest unikalne. Użyj wyszukiwania.
Witam kolegów elektroników.
Zakupiłem niedawno 2 sztuki RFM12BS i zabrałem się do pracy. Kilka prób, problemów z czasem ale wczoraj zabrałem się do tego o 10 rano, przeczytałem cały ten post od początku do końca. Fakt, jak już ktoś tu wspomniał ,szkoda że pomieszane są tu RFM01 i 02 z RFM12 i 12b, dodam jeszcze że bascom z c. Ja pracuje w bascom-ie. Robiłem wiele prób, głównie opierając się o kod podany przez kolegę atom1477 - tzn kopiując jego kod i w nim dokonując zmian. Skończyłem o 2-giej w nocy i nic. Wyświetlacz podłączony do odbiornika pokazuje 255, pomimo odłączonego nadajnika. Wczoraj żona jeszcze mi darowała siedzenie ale dziś zaczyna mocniej marudzić abym zaopiekował się dzieckiem, zrobił coś. Stąd moja prośba, aby przyspieszyć całą pracę proszę o pomoc. Oto 2 jak najmniej zmodyfikowane kody, gdzie robię błąd?
Witam,
Ostatnio również ja, skuszony możliwościami układów rfm12, postanowiłem zakupić dwa moduły tego typu (433 MHz). Śledząc ten wątek natknąłem się na kod użytkownika avatar, postanowiłem wykorzystać go więc w mojej aplikacji. Niestety, po podłączeniu modułów do procesorów nie zachodzi żadna transmisja. Po pewnym czasie nierównej walki z w/w nasunęło mi się kilka pytań, na które niestety, sam sobie odpowiedzieć nie potrafię. Dlatego tez zdecydowałem się zabrać głos w tej pouczającej dyskusji.
No ale do rzeczy.
Nadajnik podpięty mam do Attiny 2313, poniżej prezentuje kod dla funkcji obsługującej moduł nadajnika
To co udało mi się zaobserwować bardzo mnie zdziwiło. Dla powyższej konfiguracji pinu portu, do którego podłączone jest przerwanie od modułu rfm12 (Pin2 port D) dioda miga. Natomiast, gdy włączę wewnętrzne podciąganie pod Pin 2, dioda zapala się i już nie gaśnie. Wygląda na to, że układ RFM12 wcale nie generuje przerwania na swoje linii NIRQ. Podobny stan ma miejsce, gdy całkowicie odłączę układ RF12 od uC. Drugą sprawą jest fakt że nadajnik nie zwiększa poboru prądu podczas wysyłania danych. Nie wiem jednak na ile mój pomiar jest prawdziwy, ponieważ skok prądu może zachodzić tak szybko, że miernik nie jest w stanie go wychwycić. Tyle w sprawie nadajnika:D
Odbiornik podłączony został do Atmega8. Zamierzeniem było odczytywanie danych z nadajnika i wystawianie ich na wyświetlacz LCD.
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000);
if ( (data&0x8000) ) {
data = writeCmd(0xB000);
return (data&0x00FF);
}
}
}
W związku z tym mam pewne pytanie. Jakie dane powinien zwrócić moduł RFM12 po wysłąnie do niego komendy 0x000. Nota aplikacyjna nic o tym nie wspomina. Zmieniłem nieco tą funkcję tak by nie wysyłała komendy 0x000 ale niestety bez zadowalającego rezultatu. Funkcja ciągle tkwi w nieskończonej pętli.
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0xB000);
if (data) {
return (data&0x00FF);
}
}
}
W celu sprawdzenia czy wogóle zachodzi jakaś rozmowa pomiędzy RFM12 a uC napisałem funkcje odczytująca rejestr statusowy RFM12. Sposób odczytu zaczerpnięty został z noty aplikacyjnej modułu TRC102 (str. 17).
Po uruchomieniu tej funkcji na wyświetlaczu pojawiają się znaki, jednak po każdorazowym resecie procesora znaki te zmieniają się, co świadczy o tym że wartość tego rejestru ulega zmianie. Czy rejestr ten może od tak zmieniać sobie wartości, mimo iż konfiguracja przeprowadzana jest zawsze przy użyciu tych samych parametrów
Dodam jeszcze, że moduły testuje na płytce stykowej. Podłączyłem je do uC za pomocą 10 cm przewodów pozyskanych ze skrętki Ethernetowej. Całość zasilana jest z portu USB komputera. Oba moduły mają to samo źródło zasilania.
To chyba tyle jeśli chodzi o pierwsze spostrzeżenia. Jeżeli ktoś byłby w stanie uchylić rąbka tajemnicy, jaką osnute są moduły RFM12, moje prace mogłyby posunąć się kroczek dalej.
Bascom - przykładowy działający kod do testowania RFM12 na 868MHz
Odbiornik generuje przerwanie po odebraniu z nadajnika Byte 2D D4 i dopiero odbiera dane użytkowe, czyli Data_in(1)...Data_in(7)
'Odbiornik
$regfile = "m8def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.3 , Db6 = Portc.1 , Db7 = Portc.2 , E = Portc.5 , Rs = Portc.4.
Nsel Alias Portb.2
Sdi Alias Portb.3
Sdo Alias Pinb.4
Sck Alias Portb.5
Dim D As Word
Dim Data_in(7) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Freq As Single
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Function Spi16(byval Dout As Word) As Word
Declare Sub Dioda
Config Nsel = Output
Config Sdi = Output
Config Sck = Output
Config Portb.1 = Output 'LED
'Init
Nsel = 1
Sck = 0
'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9854) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V
Freq = 868.300
Freq_rfm12
On Int1 Migacz 'Jezeli wystapi przerwanie to mignij dioda
Enable Int1
Enable Interrupts
Cls
Do
For N = 1 To 7
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
Cls
Lcd Data_in(1) ; " " ; Data_in(2) ; " " ; Data_in(3) ; " " ; Data_in(4) ; " " ; Data_in(5) ; " " ; Data_in(6) ; " " ; Data_in(7)
Enable Int1
Loop
Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub
Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 7
Nsel = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Sdo = 1
D = Spi16(&Hb000)
Data_in(n) = D
Next N
Nosignal:
D = Spi16(&H8208)
End Sub
Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function
Sub Dioda
Set Portb.1
Waitms 15
Reset Portb.1
Enable Int1
End Sub
Migacz:
Disable Int1
Dioda
Return
'Nadajnik
$regfile = "m8def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim
Nsel Alias Portb.2
Sdi Alias Portb.3
Sdo Alias Pinb.4
Sck Alias Portb.5
Dim D As Word
Dim Data_out(7) As Byte
Dim N As Byte
Dim X As Byte
Dim Freq As Single
Declare Sub Send_rfm12
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Sub Wait_rfm12
Declare Function Spi16(byval Dout As Word) As Word
Config Nsel = Output
Config Sdi = Output
Config Sck = Output
Config Portd.2 = Output 'LED
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Config Pind.6 = Input
Config Pind.7 = Input
Portb.0 = 1
Portb.1 = 1
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
'Init
Nsel = 1
Sck = 0
'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V
Freq = 868.300
Freq_rfm12
Do
'-----------------------------------------------------------------------------
If Pind.6 = 0 Then 'Wyslanie siedmiu Byte
Data_out(1) = 1
Data_out(2) = 2
Data_out(3) = 3
Data_out(4) = 4
Data_out(5) = 5
Data_out(6) = 6
Data_out(7) = 7
Send_rfm12
End If
'---------------------
If Pind.7 = 0 Then
Data_out(2) = 2
Send_rfm12
End If
'---------------------
If Pinb.0 = 0 Then
Data_out(3) = 3
Send_rfm12
End If
'---------------------
If Pinb.1 = 0 Then
Data_out(4) = 4
Send_rfm12
End If
'---------------------
If Pinc.3 = 0 Then
Data_out(5) = 5
Send_rfm12
End If
'---------------------
If Pinc.2 = 0 Then
Data_out(6) = 6
Send_rfm12
End If
'---------------------
If Pinc.1 = 0 Then
Data_out(7) = 7
Send_rfm12
End If
Loop
Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub
Sub Send_rfm12
D = Spi16(&H8238)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
For N = 1 To 7
Wait_rfm12
D = &HB800 + Data_out(n)
D = Spi16(d)
Next N
'Wait_rfm12
'D = Spi16(&Hb800)
'Wait_rfm12
'D = Spi16(&Hb800)
Wait_rfm12
D = Spi16(&H8208)
End Sub
Sub Wait_rfm12
Nsel = 0
Do
Loop Until Sdo = 1
End Sub
Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000); //wątpliwy fragment
if ( (data&0x8000) ) {
data = writeCmd(0xB000);
return (data&0x00FF);
}
}
}
Z tego co widzę program zawsze w tym fragmencie będzie wpadał w nieskończona pętle. Nigdzie w dokumentacji nie doczytałem się, że moduł RFM12 ma zwrócić jakieś dane podczas wysłania do niego kodu 0x0000. Tak też dzieje się u mnie.
Faktycznie, nie zauważyłem w dokumentacji, że podczas odczytu rejestru statusu właśnie komendą 0x0000 jako pierwszy idzie bit, który gdy jest w stanie wysokim, sygnalizuje że coś przyszło do FIFO.
[RFM12BP, Atmega8, C]
Komunikacja działa na odleglosci 0,5m, co 2 pakiet dochodzi pełnosprawny :]
Anteny mam prymitywne druciki 173mm, takie cieniutkie z taśmy, ledwie co stoją ;|
Pytanko do Was, czy masa w module pin 23 to ma być podłączona do masy całego układu, czy to jest do anteny masa? (czyli dla śmiesznego drucika niewykorzystany pin)??
Może coś z anteną pokombinować, koncentryk czy cos??
Miło by było jak by padła jakaś odp. Pozdro
Zasięg się nie zwiększył.
Chyba żeby wykonać cały moduł (uC Atmega8 i reszta elementów) w wersji SMD, bo może te RFM12BP lubią "ciasne połączenia" tak jak w przypadku RFM12B ??
Ale ciasne połączenia dotyczą modułu a nie reszty układu.
Zresztą tutaj raczej chodzi o dobre filtrowanie zasilania i dobry projekt PCB. Ciasne upchanie elementów polepsza sprawę ale dobrze wykonana PCB z ładnie wylaną masą nawet jak będzie rozwlekła to będzie dobra.
Czyli nie tutaj bym szukał problemów.
A zasilanie 12V do końcówki mocy w ogóle podłączasz?
To jest moduł na 433 czy 868Hz?
Zamiast 12V mam podłączone 5V, ale próbowałem bez zasilania wzmacniacza i to samo, na 0,5m transmisja.
5V albo wcale :/
Ma być 12V.
A schemat i płytka to jedna wielka tragedia.
7812 nie ma kondensatorów na wejściu.
I za mało na wyjściu.
LM317 ma za mało kondensatorów.
Schemat nie zgadza się z płytką. Pin AVCC nie jest podłączony do zasilania.
Nie chodzi jednak o to żeby schemat się zgadzał z płytką, ale o to żeby pin AVCC podłączyć do zasilania. Czyli nie poprawiaj schematu tylko płytkę.
Prowadzenie masy tragedia.
Ale mimo tego wszystkiego powinno to zadziałać, tylko podłącz te 12V. A raczej z 15V bo masz tam stabilizator.
Sam nie wiem jak to się stało z tym pinem AVCC... LM7812 w linku źródłowym jaki podałem nie było ceramików na we.
W nocie kat. jest -> poprawie to !
Ale chyba wiem o co Ci chodzi, zastosować dodatkowo elektrolity na we. i wy. dla obydwu stabilizatorów
-poprawię to!
Poczytam o tworzeniu PCB, by nie było znowu załamki:)
Dzięki za zrypke !
Korzystam z kodu użytkownika "avatar". Całość działa na płytce stykowej, więc połączenia wykonane są na "pająka". Moduły do procesorów podłączone są za pomocą 10 cm odcinków kabelków pozyskanych ze skrętki. Wszystko zasilane jest z jednego źródła, jakim jest port USB. Z racji tego, że wszystko jest na jednej płytce, nie wiem jaki maksymalny zasięg uda mi się wycisnąć. Będę to mógł sprawdzić dopiero, gdy zrobię płytki PCB.
Witam.
Przeczytałem ten temat i nie znalazłem na swoje pytanie odpowiedzi. Mianowicie chciałem się zapytać czy uruchomił ktoś moduły RFM12B w trybie zarówno nadajnik i odbiornika. Nie chodzi mi tutaj o to, że jeden moduł jest nadajnikiem, a drugi odbiornikiem. Bo takie kody są tutaj i tak mi te moduły działają bez problemu.
Chodzi mi o to, że nie mogę sobie poradzić z modułem jako nadajnik i zarazem odbiornik.
Korzystając z programu zamieszczonego na tej stronie:
http://www.technofun.org/blog/ Przy konfiguracji odbiornika i nadajnika na osobnych modułach konfiguracja wygląda tak:
Dla nadajnika:
Dla Odbiornika:
I teraz kiedy chciałem uruchomić układ w trybie zarówno odbiornika i nadajnika to ustawiałem:
Jednak układ się zawieszał. Zatrzymywał się na pierwszej akcji. Nie zależnie czy jest to wysyłanie czy odbieranie.
Potem postanowiłem zmienić program troszkę. Postanowiłem, że gdy układ będzie miał coś wysłać to ustawię układ w tryb nadajnika. Normalnie układ jest w trybie odbiornika. I wszystko byłoby okej w momencie kiedy układ zaczyna pracować i tylko odbiera to jest OK. Nie ma błędów w transmisji ani nic. Problem się pojawia w momencie kiedy chcę coś wysłać. Wysyłam i kicha. Niestety układ nie wraca w tryb odbiornika.
I tutaj jest moja prośba. Czy mógłby mi ktoś udostępnić jakiś kod, w którym układ działa jako transceiver? Bądź nakierować mnie jak powinno się ustawić bity konfiguracyjne.
Mam jeszcze pytanie. Czy jak zmieniam konfigurację RFM12B to muszę wysyłać wszystkie dane konfiguracyjne za każdym razem? Czy mogę tylko to ustawienie, które zmieniam, czyli:
Muszę wysłać to?
Przecież ten układ zawsze działa jako transceiver. To że układ jest transceiverem nie oznacza że ma nadawać i odbierać.
Układ leżący na stole albo na półce w sklepie nie jest podłączony do zasilania a więc nic nie nadaje i nic nie odbiera.
A jednak nadal jest transceiverem Te układy są transceiverami bo mogą pracować zarówno jako nadajniki jak i odbiorniki.
Ale nigdzie nie pisze że mogą to robić jednocześnie. Nie zrobisz na nich tego co chcesz.
Te układy mogą pracować tylko w Half-Duplexie, czyli na zmianę jako nadajnik i odbiornik.
atom1477, masz racje, źle się wyraziłem Oczywiście mój układ nie będzie działać tak, że w tym samym momencie mam odbierać i nadawać itp.
Chodzi mi o to, że nie mogę przejść z nadawania na odbiór i odwrotnie w jednym układzie.
Gdy włączę odbiór to układ odbiera bez problemu.
W momencie kiedy nacisnę przycisk aby coś wysłał to owszem wyśle, ale już nie wróci do odbioru tylko zostaje skonfigurowany jako nadajnik I już mogę tylko wysyłać.
A według programu to po wyjściu z funkcji wysyłania zmieniam ustawienia na odbiornik. Ale tak jakby tą czynność akurat mijało
atom, to jeszcze jedno, ostatnie pytanie.
Czy przy zmianie konfiguracji z nadajnika na odbiornik wysyłałeś całą konfigurację czy tylko tą w której jest zmiana z "aktywowania" odbiornika zamiast nadajnika.
Z góry dzięki za odpowiedź.
Tylko że w tym przypadku korzystałem z UARTa. Czyli nie korzystałem z FIFO modułów RFM12B.
U Ciebie problem może leżeć w tym że moduł nie generuje jakiegoś przerwania czy coś.
Faktycznie też miałem problem z dwukierunkową transmisją między modułami RFM12(B)
z wykorzystaniem przerwań.
Wyglądało to mniej więcej tak:
Po włączeniu zasilania moduł był konfigurowany jako odbiornik
i wszystko pięknie odbierał
jak w trakcie pracy przełączyłem go na nadawanie to włączył nośną
ale nie generował kolejnych przerwań na NIRQ po wysłaniu bajtu
i tak pozostawał aż do momentu ponownego polecenia wysłania danych
wtedy się jakby odblokował i następne paczki wysyłał poprawnie
wszystko było już fajnie dopóki nie wyłączyłem zasilania
po ponownym załączeniu zasilania występował ten sam efekt
Kombinacje z opóźnieniami, podwójnym wysłaniem konfiguracji po włączeniu zasilania
nic nie pomagało
W końcu zrobiłem tak jak było w przykładzie na stronie producenta
tam konfiguracja i dla nadajnika i dla odbiornika zaczynała sie od włączenia nadawania
[ writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC ]
wyczytałem nawet uwagi w necie, że to błąd
ale mój problem z powodzeniem został rozwiązany
Teraz po wysłaniu bajtów konfiguracyjnych na końcu przełączam w tryb odbioru
Trzeba pamiętać o zresetowaniu FIFO po włączeniu trybu odbioru
i oczywiście o odczycie rejestru statusu
(odczyt tego rejestru powoduje powrót wyjścia NIRQ do stanu wysokiego )
U mnie to mniej więcej tak:
włączenie zasilania
odczekanie ok. 200ms
wysłanie bajtów konfiguracyjnych(jak dla nadajnika)
.....
8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC ]
.....
.....
.....
przełączenie w tryb odbiornika
82D9H ;TURN ON RX
reset FIFO
CA81H ; //wyłączenie FIFO
CA83H ; //włączenie FIFO -czeka na słowo synchronizacji
0000H ;odczyt statusu(powrót NIRQ do stanu wysokiego)
Pętla główna
i tutaj już sobie czeka na przerwanie po odebraniu danych do FIFO
---------------
Jeżeli chcemy nadawać:
przełączenie w tryb nadajnika
8239H ;TURN ON TX
wysyłamy kilka bajtów preambuły
wysyłamy nasze dane
i ze dwa nie znaczące bajty na zakończenie
ponownie wracamy do odbierania:
przełączenie w tryb odbiornika
82D9H ;TURN ON RX
reset FIFO
CA81H ; //wyłączenie FIFO
CA83H ; //włączenie FIFO -czeka na słowo synchronizacji
0000H ;odczyt statusu(powrót NIRQ do stanu wysokiego)
-------------------
Nie twierdzę, że to jest zgodne z zaleceniami twórców układu
ale działa poprawnie
i transmisja na przerwaniach śmiga aż miło
nie stosuję żadnych opóźnień po przełączeniu z nadawania na odbiór i odwrotnie
choć w dokumentacji jest taka pozycja
(może gubi się pierwszy bajt preambuły, ale mi to nie przeszkadza)
Uff widzę iż temat rzeka z tymi modułami, ale do rzeczy.
Potrzebuję mieć możliwość przesyłu danych z różnych pomieszczeń jednak nasuwają mi się następujące wątpliwości:
1. Czy jeden odbiornik jest wstanie odbierać dane z pozostałych n nadajników
(jeżeli tak to czy są restrykcje co do ich ilości).
Dane powinny być dostarczane do stacji odbiorczej powiedzmy co 5m (pomiar ciśnienia, wilgotności, temperatury)
2. Jaki algorytm byłby tu waszym zdaniem wskazany. Jak synchronizować nadajniki aby odbiornik był w stanie zebrać dane.
3. Stacje nadawcze nie zawsze będą miały dostęp do zasilania dlatego też zastanawia mnie jaki akumulator musiał by być zastosowany aby taki układ działał niezawodnie przez np rok.
Konstrukcyjnie byłby to RF12 + atmega8 bez kwarcu + kilka czujników.
4. Jakiego zasięgu jestem w stanie się spodziewać w pomieszczeniach zamkniętych np bloki, hale etc ?
5. Czy wobec powyższych punktów moduły serii RF12 spełnią swoją role czy też możecie polecić innego rodzaju rozwiązanie.
Po kilku dniach ciezkiej walki w koncu uruchomilem swojego RFM12. Bazowalem na przykladzie z datasheetu. Jest tam kilka bledow miedzy innymi:
-ostatnia dana inicjalizacji do ustawiania napiecia progowego i czestotliwosci wyjsciowej CLK jest 0xC400 a ma byc 0xC040 (2 cyfry sa zamienione a 0xC4XX to zupelnie inne polecenie).
-funkcja zapisu/odczytu ma pomylona kolejnosc polecen i nie odczytuje ostatniego bitu. Ma to znaczenie glownie przy odczycie bitow statusu bo sa wtedy przesuniete o 1 miejsce.
-opisy w inicjalizacji sa bledne ale same wartosci o ile dobrze pamietam sa poprawne (po opisach wynika, ze inicjalizacja odbiornika uruchamia transmiter).
- definicje DATA_PORT, DATA_PIN, DATA_DDR nie sa uzywane i mozna skasowac.
Piny mozna podlaczac do procka dowolnie tylko trzeba wtedy pozmieniac numery pinow w konfiguracji. Ja wybralem piny portu B (atmega8), te ktore nie sa wykorzystywane do programowania zeby modul sie z programatorem nie zarl. nIRQ podlaczylem do portu D3 (INT1).
Do testow najlepiej ustawic bitrate tak maly jak to tylko mozliwe (to chyba bylo cos kolo 0,3kbps).
Po poborze pradu nie bardzo widac czy modul nadaje czy nie. Ja mam radio, ktore odbiera 434MHz wiec slyszalem trzaski.
Komunikacje procka z RFem mozna bardzo latwo sprawdzic przez odczytanie rejestru statusu. Pierwsze odczytanie po zalaczeniu napiecia do madulu ma dac flage POR=1 (pamietac o bledzie w przykladzie producenta) drugi i dalsze odczyty POR=0.
Datasheet z HopeRF to totalna porazka, lepiej tam w ogole nie zagladac, tylko glowa moze rozbolec. Najlepiej przedstawiono uklad TRC101, ktory funkcjonalnie jest identyczny. Rozni sie tylko troche nazewnictwo.
Mam jeszcze jeden problem. RF przy bitrate 4,8kbps i wiecej zaczyna gubic dane (w tym samym stopniu w odleglosci 30cm jak i 30m) a przy 19,2kbps juz w ogole nie ma komunikacji. Przy transferze 1kbps mam idealna komunikacje przez 4 betonowe sciany, na odleglosci kulkudziesieciu metrow.
Jakies pomysly?
Prawidlowa funkcja nadawania/obioru ma wygladac tak:
Mam jeszcze jeden problem. RF przy bitrate 4,8kbps i wiecej zaczyna gubic dane (w tym samym stopniu w odleglosci 30cm jak i 30m) a przy 19,2kbps juz w ogole nie ma komunikacji. Przy transferze 1kbps mam idealna komunikacje przez 4 betonowe sciany, na odleglosci kulkudziesieciu metrow.
Jakies pomysly?
Prawdopodobnie procedura odczytu bajtu z FIFO jest dość długa.
Przy większej prędkości transmisji dane mogą przychodzić
jeszcze przed zakończeniem odbierania poprzedniego bajtu z FIFO
U mnie czas odbioru bajtu z FIFO (w przerwaniu) wynosi około 300us
i przy tej metodzie mogę zapomnieć o dużych prędkościach transmisji