Elektroda.pl
Elektroda.pl
X
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Transmisja radiowa - dzisiejsze realia sprzętowe

10 Paź 2007 18:51 8301 15
  • Poziom 12  
    Witam. Chciałbym zbudować radiowy przesył informacji z procesora. Mam na sumieniu wykonany układ w oparciu o moduły Telecontrolli RT1 i RR4, a jako enkoder i dekoder posłużyłem się MC145026 i -27.
    Jako, że czytając większość postów zauważyłem, że MC...26 i 27 są już dawno wyrzucone z użycia, więc chciałbym zapytać czym je można zamienić. Chciałbym również zapytać jakie moduły nadajnik+odbiornik polecacie.
    Mam do zrealizowania projekt, który właściwie można by wykonać na w.w. częściach składowych, jednakże chciałbym z duchem czasu stosować nowsze(a może nawet lepsze elementy).
    Pytanie więc jakie stawiam czym zastąpić MC145026/7? Gdzie tego szukać, ile pi*oko kosztują? Jakie moduły radiowe w miarę przystępnej cenie można wykorzystać - powiedzmy żeby można było zamknąć ich cenę poniżej 200zł za komplet nadajnik odbiornik. Jakie są ich wady i zalety?
  • Computer Controls

  • Poziom 26  
    Właśnie robię pracę inżynierską opartą na modułach TLX905 firmy eMOD. Zawierają one układy nRF905 firmy Nordic. Mają wszystko czego mi potrzeba - interfejs SPI, własny bufor nadawczo - odbiorczy, generator sumy CRC, sygnalizację wykrycia fali nośnej, rozpoczęcia odbioru i obecności poprawnych danych w buforze. Ładujesz dane do bufora, włączasz nadawanie, po drugiej stronie możesz korzystać z mikroprocesora i przerwania, które będzie obsłużone, gdy odbiornik odbierze dane i zweryfikuje ich poprawność dzięki sumie kontrolnej. Póki co raz robiłem kontrolę zasięgu, tak z ciekawości - ponad 100m, nawet niespecjalnie ustawiałem anteny względem siebie, po drodze jeszcze dwa parkingi z samochodami i krzaki. Za wadę można uznać, że przy każdym włączeniu urządzenia musisz ustawić parametry pracy, ale jeżeli wykorzystujesz jedynie dwa moduły, to możesz użyć wartości domyślnych. Zresztą konfiguracja polega jedynie na ustawieniu kanału (moduły są wielokanałowe), częstotliwości (pracują w paśmie ISM 433MHz, 868MHz, eMOD ma różne wersje) i paru innych parametrów, z których większość ma dogodne wartości domyślne i de facto nie trzeba ich zmieniać. Cena za jeden moduł nadawczo - odbiorczy to ok. 60zł.
  • Computer Controls
  • Poziom 27  
    Witaj
    jeśli niekonieczine interesuje Cie moduł + procek '51 to możesz kupić te moduły bez niego (TLX905) , ajeśli lubisz te procki to masz wersje z nim: TLXE5
    Sam kupiłem te moduły w KAMAMI ale czekają w szufladzie na moje zainteresowanie. Tak jak kolega wyżej napisał posiadają kilka przyjemnych cech, dzięki których procek może zająć się własna robotą.
    Częstotliwości jest nieco więcej, bo działają także powyżej 900MHz. KAMAMI jeszcze sprzedaje moduły o innej nazwie na częstotliwość 2,4GHz ale specjalnie nie brałem takich (za dużo urządzeń pracuje w tym paśmie: śmietnik)

    Nie polecam wersji CC1000 ponieważ procek qwtedy będzie zajmował się tylko obsługą tego modułu (sam kodujesz dane, liczysz CRC itp itd...)

    http://www.kamami.pl/?id_k1=52&id_k2=65

    Pozdrawiam
  • Poziom 27  
    Witam.
    Ja ostatnio zamówiłem moduły radiowe firmy HOPE RF : RF12B.
    Moduły te dostepne sa w JM elektronik,
    http://www.jm.pl/3w/nl_show.php?id=109&lang=pl
    Kosztuja one około 11zł netto, są wielkości 16x16mm!! i z tego co pisza posiadają przyzwoite parametry:

    Modulacja FSK
    Czułość odbiornika –102dB
    Moc nadajnika w RFM12B 7dBm (433); 5dBm (868)
    Zasięg w otwartym terenie >300m (433); >200m (868)
    Zasilanie od 2.2V do 5.5V (RFM12)
    Interfejs SPI, prędkość transmisji do 115.2kbps
    Wake-Up timer
    Detekcja stanu baterii
    Prąd w uśpieniu 0.3uA

    To strona producenta:
    http://www.jm.pl/3w/nl_show.php?id=109&lang=pl

    Niestety nie miałem jeszcze czasu by przetestować te moduły, jesli ktoś moze sie już nimi bawił chetnie usłysze opinie jak działają w praktyce.
  • Poziom 12  
    Rzeczywiście dość ciekawe są te moduły z eMOD-u. Tylko z tego co widzę wysłanie danych przez te moduły nie będzie takie proste jak w przypadku modułów telecontrolli. Pytanie więc miałbym do tomsyty oraz Ch.M. gdzie można znaleźć jakieś źródła z których możnaby o tym poczytać, jak się to obsługuje - domyślam się komunikacja następuje przez SPI. Pewnie trzeba jakiś kod napisać w uC.

  • Poziom 26  
    Na stronie producenta: http://www.nordicsemi.com/index.cfm?obj=product&act=display&pro=83 jest datasheet, zwięzły, opisane to co najważniejsze, jest graficznie przedstawiony algorytm nadawania i odbioru. Transmisja jest bardzo prosta, zależy kto w jakim języku pisze, ja robię w avr-gcc ale robiłem też w bascomie, przykład w avr-gcc - tylko kawałek kodu oczywiście, bo przecież jak ktoś pisze program to musi umieć dostosować go do swoich potrzeb i znać obsługę np. SPI, a jak nie potrafi napisać programu na podstawie kawałka kodu, to znaczy że nie będzie potrafił go zrobić i nawet cały program mu nic nie da bo nie będzie wiedział jak go przerobić i tyle :]

    Konfiguracja modułu:
    Code:

    void set_config_module(void)   //Konfiguracja modułu - ustawienie danych możliwych do zmiany (adres) i stałych (częstotliwość kwarcu, częstotliwość pracy numer kanału).
    {
       eeprom_read_char(g_RX_address, RX_ADDRESS_EEP, ADDRESS_LEN);
       print(g_RX_address, 4);
       
       PORTC &= ~(1<<PWR_UP);
       PORTC &= ~(1<<TX_EN);
       PORTC &= ~(1<<TRX_CE);   //Wyłączenie części radiowej, konfiguracja
       PORTC |= (1<<PWR_UP);
       wait_ms(5);
       
       PORTB &= ~(1<<CSN);   //Sygnał CSN - przed każdym wyborem rejestru wymagane jest opadające zbocze
       SPI_send_chr(5);   //W_Config - rejestr konfiguracyjny do zapisu, bajt 5..8 - adres RX, bajt 9 - tryb CRC, częstotliwość kwarcu
       SPI_send(g_RX_address, 0, ADDRESS_LEN);
       SPI_send_chr(219);   //11011011 - 16 bit CRC, CRC enable, kwarc w module 16MHz, zewnętrzny sygnał zegarowy włączony, częstotliwość 500kHz
       PORTB |= (1<<CSN);
       wait_us(1);
       
       PORTB &= ~(1<<CSN);   
       SPI_send_chr(130);   //142 - 10001110 - Rejestr szybkiej konfiguracji częstotliwości i kanału, moc 10dBm, 130 - 10000010 = -10dBm
       SPI_send_chr(118);   //01110110 - 868.4MHz
       PORTB |= (1<<CSN);
       wait_us(1);
       PORTC |= (1<<TRX_CE);   //Włączenie części radiowej, tryb odbioru (TX_EN = 0)
       wait_ms(1);
    }


    Wysyłanie danych:
    Code:

    PORTC &= ~(1<<TRX_CE);   //TX_EN = 1, TRX_CE = 0 - tryb nadawania.
    PORTC |= (1<<TX_EN);
    wait_ms(1);
       
    PORTB &= ~(1<<CSN);
    SPI_send_chr(34);   //W_TX_ADDRESS - rejestr adresu RX do zapisu
    SPI_send(g_TX_address, 0, ADDRESS_LEN);   //Ustawiany jest adres odbiorcy, do którego trafią dane
    PORTB |= (1<<CSN);
    wait_us(1);
       
    PORTB &= ~(1<<CSN);
    SPI_send_chr(32);   //Bufor nadawczy
    SPI_send(g_Buffer, 0, DEST_ADDRESS_POS + ADDRESS_LEN);   //Przesyła wszystkie bajty od początku (długość ramki) do adresu docelowego włącznie.
    SPI_send(g_RX_address, 0, ADDRESS_LEN);
    SPI_send(g_Buffer, DEST_ADDRESS_POS + 2 * ADDRESS_LEN, BUFFER_SIZE - 1 - 2 * ADDRESS_LEN);   //Przesyła resztę danych w ramce.
       
    PORTB |= (1<<CSN);
    wait_us(1);
       
    PORTC |= (1<<TRX_CE);   //Włączenie nadawania
    wait_us(20);
    wait_ms_break(2000);   //W tym czasie dane zostaną wysłane a przerwanie aktywowane sygnałem DR zakończy oczekiwanie.


    Odczyt (to jest po prostu zapis dowolnych danych do SPI celem odebrania danych znajdujących się w buforze):
    Code:
    void SPI_read(void)
    
    {
       unsigned char i;
       PORTB &= ~(1<<CSN);
       SPI_send_chr(36);   //R_RX_PAYLOAD - bufor odbiorczy do odczytu    
       SPI_send_chr('A');   //Wysłanie danych (dowolnych) celem odebrania znaku
       g_Buffer[0] = SPDR;   //Pobranie liczby, określającej ile znaków ma zostać odczytanych
       for(i=1; i<32; i++)
       {
          SPI_send_chr('A');
          g_Buffer[i] = SPDR;
       }
       PORTB |= (1<<CSN);
       wait_us(2);
    }


    Te kawałki kodu są w wielu miejscach rozbudowane po prostu do moich potrzeb, transmisję realizuję wg zalożeń jakie sobie narzuciłem (ramka danych, zawiera różne informacje o swoim składzie itp., nie jest to potrzebne do przeprowadzenia najprostszych transmisji, tak więc fragmenty te można znacznie odchudzić), czasami znajdą się jakieś instrukcje print które są oczywiście nadmiarowe, po prostu chcę widzieć na terminalu jakie dane trafiają do i z modułu.

    Kod w Bascomie mogę umieścić w całości, bo ten w avr-gcc to znajdzie się w mojej pracy inżynierskiej, więc żeby później nie mówili że jest na necie to więcej nie zamieszczam :]

    Code:
    Csn Alias Portb.0
    
    Am Alias Pinb.1

    Cd Alias Pinc.0
    Pwr_up Alias Portc.1
    Trx_ce Alias Portc.2
    Tx_en Alias Portc.3

    Dr Alias Pind.2

    Cd_led Alias Portd.5
    Am_led Alias Portd.6
    Dr_led Alias Portd.7

    Ddrb = &B00101101
    Ddrc = &B0001110
    Ddrd = &B11111011

    Cd_led = 1
    Am_led = 1
    Dr_led = 1
    Csn = 1
    'Portd.0 = 1
    Config 1wire = Portd.0
    Dim Pol_stopnia As Bit
    Dim Dane(2) As Byte , Temperatura As Integer


    Dim A As Byte , B As Byte , I As Byte , J As Byte , Z As Byte , Tekst As String * 32


    'Wait 1
    'Print "Wprowadz tekst (maks. 32 znaki, zakoncz ENTER): "
    'Input Tekst
    Tekst = "temperatura" + Chr(13) + Chr(10)
    'Print "Dziekuje. Odliczanie rozpoczete (5 sekund)."


    For I = 1 To 5
       Cd_led = 0
       Waitms 500
       Cd_led = 1
       Waitms 500
    Next I

    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128
    Trx_ce = 0
    Pwr_up = 1
    Waitms 5
    Tx_en = 1
    Waitms 1
    Spiinit

    Csn = 0
    B = 9
    A = Spimove(b)
    A = 219
    Spiout A , 1

    Csn = 1
    Waitus 1
    Csn = 0

    A = 142
    Spiout A , 1
    A = 118
    Spiout A , 1

    Trx_ce = 1
    Waitus 100
    Trx_ce = 0

    Csn = 1
    Waitus 1
    Csn = 0
    B = 32
    A = Spimove(b)
    Spiout Tekst , 32

    Trx_ce = 1
    Waitus 100
    Trx_ce = 0

    Csn = 1


    Do
       Tekst = Space(32)
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Temperatura = 1wread(2)

       If Temperatura.0 = 0 Then
          Pol_stopnia = 0
       Else
          Pol_stopnia = 1
       End If

       If Temperatura.8 = 0 Then
          Tekst = "+"
       Else
          Tekst = "-"
          Temperatura = 65536 - Temperatura
       End If
       Temperatura = Temperatura / 2
       Tekst = Tekst + Str(temperatura)

       If Pol_stopnia = 0 Then
          Tekst = Tekst + ".0"
       Else
          Tekst = Tekst + ".5"
       End If

       Tekst = Tekst + Chr(13) + Chr(10)

       Csn = 1
       Waitus 1
       Csn = 0
       B = 32
       A = Spimove(b)
       Tekst = Trim(tekst)
       Spiout Tekst , 32

       Trx_ce = 1
       Waitus 100
       Trx_ce = 0
    Loop




    Do
    Loop


    oraz

    Code:
    Csn Alias Portb.0
    
    Am Alias Pinb.1

    Cd Alias Pinc.0
    Pwr_up Alias Portc.1
    Trx_ce Alias Portc.2
    Tx_en Alias Portc.3

    Dr Alias Pind.2

    Cd_led Alias Portd.5
    Am_led Alias Portd.6
    Dr_led Alias Portd.7

    Ddrb = &B00101101
    Ddrc = &B0001110
    Ddrd = &B11111011

    Cd_led = 1
    Am_led = 1
    Dr_led = 1
    Csn = 1

    Dim L1 As Bit , L2 As Bit , L3 As Bit
    Dim A As Byte , B As Byte , I As Byte , J As Byte , Z As Byte , Tekst As String * 1

    L1 = 0
    L2 = 0
    L3 = 0

    Print "Podlaczono; oczekiwanie: "


    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128
    Trx_ce = 0
    Pwr_up = 1
    Waitms 5
    Tx_en = 0
    Waitms 1
    Spiinit


    Csn = 0
    B = 9
    A = Spimove(b)
    A = 219
    Spiout A , 1

    Csn = 1
    Waitus 1
    Csn = 0

    A = 142
    Spiout A , 1
    A = 118
    Spiout A , 1



    Csn = 1

    Waitus 1

    Csn = 0

    Trx_ce = 1
    Waitms 1



    Do
       If Cd = 1 Then
          L1 = 1
          Cd_led = 0
       End If

       If Cd = 0 And L1 = 1 Then
          L1 = 0
          'Wait 2
          Cd_led = 1
       End If

       If Am = 1 Then
          L2 = 1
          Am_led = 0
       End If

       If Am = 0 And L2 = 1 Then
          L2 = 0
          'Wait 2
          Am_led = 1
       End If

       If Dr = 1 Then
          Csn = 0
          L3 = 1
          Dr_led = 0
          Wait 20
          A = 36
          Spiout A , 1
          For I = 1 To 32
             Spiin Tekst , 1
             Tekst = Trim(tekst)
             Print Tekst;
          Next I
          Csn = 1
       End If

       If Dr = 0 And L3 = 1 Then
          L3 = 0
          Dr_led = 1
       End If
    Loop


    w Bascomie to pisałem na szybkiego, bez zabawy w optymalizację, tak żeby tylko uruchomić te moduły (termometr na 1-wire, drugi moduł podpięty do kompa wyświetla w terminalu temperaturę), zresztą porzuciłem ten język i przeniosłem się na avr-gcc.
  • Poziom 9  
    Ja w tej chwili w swojej pracy projektowej wykorzystuję moduł CC1000PP, również całkiem ciekawy moduł radiowy na bazie układu CC1000 firmy Texas Instruments... Może takowy Cię zainteresuje... ;)
  • Poziom 15  
    Witam.
    Ja używałem w swojej pracy magisterskiej też TLX9E5 i jestem z niego zadowolony. Mamy bardzo duże możliwości konfiguracji. Nawet zmiane programową częstotliwości na jakiej wysyłamy 433/868 i kanały na których transmitujemy.
    Wczesniej walczyłem z modułami telecontrolii RT4 i RR6... poległem. Za dużo łapały zakłóceń. Jak przesłałem dany kod ileś razy to dopiero załapały. W TLX nie martwisz się już o jakieś kodowanie informacji w celu większej poprawności przesyłu danych. Po prostu wysyłasz.
  • Poziom 10  
    Witam

    Czy ktoś, może bawił sie już układem RFM12B firmy Hope? Ja trochę zacząłem ale niestety sam datasheet zawiera sporo błędów nie mówiąc o przykładowym programie do komunikacji.

    Zależy mi na jakimś schemacie i dosłownie jakimś prostym programie, żeby sprawdzić działanie.

    Pozdrawiam
  • Poziom 11  
    Witam

    Demax, dlaczego twierdzisz, że datasheet zawiera błędy? Ja właśnie sobie zamówiłem te moduły i zaraz zaczynam zabawę. Jeżeli wychwyciłeś jakieś błędy to podaj jakie. Chętnie je poznam. Możesz też podać linka do tego programu przykładowego do komunikacji?

    Interesuje też mnie sprawa anteny. Czy ktoś wie jak wykonać antenę do tego modułu?
  • Poziom 10  
    Jeżeli chodzi o antenę to pytałem u dystrybutora. Wystarczy zwykły kabelek 1cm. Błędy były i chyba już ich nie ma ponieważ na stronce Hope jest nowa wersja tego pliku.

    Dalej mi to nie działa, jeżeli ma ktoś coś działającego to oczywiście się odwdzięczę ( czyt. $ :) ) .
  • Poziom 43  
    Zabieram się za realizację projektu zaweirającego m.in. RFM12. Projekt działający.
    Załączam kod obsługi RFM.
    Code:
    '#######################################
    
    'inculde file for RF12-device
    'info about RF12 Transceiver:       www.hoprf.com or www.integration.com
    'info about using RF12 with Bascom: www.comwebnet.de
    '
    'Version History
    '---------------
    'Initial Version: v0.10
    'Date: 200711
    'Author:  Kurzschluss
    '---------------
    'Version: v0.11
    'Date: 20071120
    'Added by: Eisbaeeer
    'Added: Get status from RF12
    'Description:
    'To get information about Statis as Offset, FIFO or something else you can
    'decode the Rf12_status. More information about the RF12_status at the End
    'of File
    '#######################################
    '------[Inculde-Datei: Treiber für RF12 Chip]-----------------------------
    '$nocompile

    Declare Sub Rf12_init()
    Declare Sub Rf12_setfreq(byval Freq As Single)
    Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
    Declare Sub Rf12_setbaud(byval Rfbaud As Long)
    Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
    Declare Sub Rf12_ready
    Declare Sub Rf12_txdata(byval Txlen As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Function Rf12_trans(byval Wert As Word) As Word

    Dim Rf12_timeout As Word
    Dim Rf12_err As Byte
    Dim Rf12_status As Word


    '------[Sende Daten]-------------------
    Sub Rf12_txdata(byval Txlen As Byte)
      Temp = Rf12_trans(&H8238) : Rf12_ready                    'Power CMD: synt.& PLL on
      Temp = Rf12_trans(&H0000) : Rf12_ready                    'Status holen
      Rf12_status = Temp                                        'Status einlesen
      Temp = Rf12_trans(&Hb8aa) : Rf12_ready                    'Preamble
      Temp = Rf12_trans(&Hb8aa) : Rf12_ready                    'Preamble
      Temp = Rf12_trans(&Hb8aa) : Rf12_ready                    'Preamble in FIFO schieben
      Temp = Rf12_trans(&Hb82d) : Rf12_ready                    'Startzeichen: 2D für den Empfänger
      Temp = Rf12_trans(&Hb8d4) : Rf12_ready                    'Startzeichen: D4 für den Empfänger
      For Lv = 1 To Txlen
          Rf12_ready
          Temp = &HB800 + Rf12_data(lv)                         'Sende Nutzdaten
          Temp = Rf12_trans(temp)
          Next Lv
      Temp = Rf12_trans(&Hb8aa) : Rf12_ready                    'Dummybyte nachschieben
      Temp = Rf12_trans(&H8208) : Rf12_ready                    'Power CMD: synt.& PLL off, Quarz-clk läuft weiter
    End Sub

    '------[Empfange Daten]---------------
    Sub Rf12_rxdata(byval Maxchar As Byte)
      Temp = Rf12_trans(&H82c8)                                 'Power CMD: Empfänger an, Quarz-clk läuft weiter
      Temp = Rf12_trans(&H0000)                                 'Status auslesen
      Rf12_status = Temp                                        'Status einlesen
      Temp = Rf12_trans(&Hca81)                                 'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
      Temp = Rf12_trans(&Hca83)                                 'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
    For Lv = 1 To Maxchar
          Rf12_ready :
          Temp = Rf12_trans(&Hb000)                             'lese 1Byte vom FIFO
          Rf12_data(lv) = Temp                                  'Nutzdaten einlesen
          Next Lv
      Temp = Rf12_trans(&H8208)                                 'Power CMD: Empfänger aus, Quarz-clk läuft weiter
    End Sub


    '------[SPI Busroutinen]----------------
    Function Rf12_trans(byval Wert As Word) As Word
      Local Lowbyte As Byte
      Local Highbyte As Byte

      Lowbyte = Low(wert) : Highbyte = High(wert)
      Reset Spi_cs
      Highbyte = Spimove(highbyte) : Lowbyte = Spimove(lowbyte)
      Set Spi_cs
      Temp = Makeint(lowbyte , Highbyte)
      'print "SPI receive: ";hex(temp)            'debug
      Rf12_trans = Temp
    End Function


    '------[Busy check]-----------------------
    Sub Rf12_ready
      Rf12_timeout = 50000
      Reset Spi_cs                                              'SS-Pin--> select RF12
      While Spi_sdo = 0                                         'MISO muss von RF12 auf high gehen  'In der Sim. auf 1 stellen
         If Rf12_timeout > 0 Then                               'Timeout Loop
            Decr Rf12_timeout
            Else
            Rf12_err = 1                                        'Flag setzen
            Exit While                                          'Timeout --> Abbruch kein ready vom RF12
            End If
         Waitus 20
      Wend                                                      'Warten bis senden bzw. empfangen fertig
    End Sub


    '------[INIT]-------------------------------------
    Sub Rf12_init()
      Waitms 150
      Temp = Rf12_trans(&H0000)                                 ': print Temp     '0000 -Status
      Temp = Rf12_trans(&Hc0e0)                                 ': print Temp     'C0E0 -Clock Output 10MHz
      Temp = Rf12_trans(&H80d7)                                 ': print Temp     '80D7 -Datareg used,FIFO enabled,433MHz,CL=15pF
      Temp = Rf12_trans(&Hc2ab)                                 ': print Temp     'C2AB -Datafilter:Autolock-slow mode-Digital Filter,f1=1;f0=1
      Temp = Rf12_trans(&Hca81)                                 ': print Temp     'CA81 -FIFO/ResetMode  (Brownoutdektion ausgeschaltet)
      Temp = Rf12_trans(&He000)                                 ': print Temp     'E000 -WakeUP Timer
      Temp = Rf12_trans(&Hc800)                                 ': print Temp     'C800 -LowDuty Cycle
      Temp = Rf12_trans(&Hc4f7)                                 ': print Temp     'C4F7 -AFC-command -eingeschaltet
    End Sub


    '------[Setze TrägerFrequenz]---------------------
    Sub Rf12_setfreq(byval Freq As Single)
      Freq = Freq - 430.00
      Temp = Freq / 0.0025
      If Temp < 96 Then
        Temp = 96
      Elseif Temp > 3903 Then
        Temp = 3903
      End If
      Temp = Temp + &HA000
      Temp = Rf12_trans(temp)                                   'Axxx - Frequenzsetting (Kanal Einstellung)
    End Sub


    '------[Setze Bandweite]---------------------------
    Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
      Drssi = Drssi And 7
      Gain = Gain And 3
      Temp = Bandwith And 7
      Shift Temp , Left , 2
      Temp = Temp + Gain
      Shift Temp , Left , 3
      Temp = Temp + Drssi
      Temp = Temp + &H9400
      Temp = Rf12_trans(temp)                                   'Revicer Control Command (Pin20 VDI output)
    End Sub


    '------[Einstellung der Baudrate]--------------------
    Sub Rf12_setbaud(byval Rfbaud As Long )
      Local Ltemp As Long
      If Rfbaud < 663 Then Exit Sub
      If Rfbaud < 5400 Then
         Temp = 43104 / Rfbaud
         Temp = Temp + &HC680
         Else
         Ltemp = 344828 / Rfbaud
         Temp = Ltemp
         Temp = Temp + &HC600
         End If
      Decr Temp
      Temp = Rf12_trans(temp)
    End Sub


    '------[Sendeleistung einstelllen]-----------------
    Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
      Outpower = Outpower And 7
      Temp = Fskmod And 15
      Shift Temp , Left , 4
      Temp = Temp + Outpower
      Temp = Temp + &H9800
      Temp = Rf12_trans(temp)
    End Sub

    '-------------------------------------------------------------------------------
    'Info:
    '=== Status Read ===
    'Dieses Kommando löst die Rückgabe des Statusregisters aus, welches nach der ersten 0 im ersten Bit syncron übertragen wird.
    'Hex = 0000
    'Bit-Syntax: 0000000000000000<000>
    'Rückgabe-Syntax: x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18
    'x0 -> x5 = Interrupt bits
    'x6 -> x15 = Status Bits
    'x16 -> x18 = FIFO
    'x0 = FFIT / RGIT (RGIT = TX Register ist bereit neue Daten zu senden ... kann mit dem TX Register gelöscht werden)(FFIT = Die anzahl der Datenbits im FIFO Puffer hat das eingestellte Limit erreicht. Kann mit einer der FIFO-Lese methoden gelöscht werden)
    'x1 = POR (PowerOnReset)
    'x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da nicht schnell genug Daten nachgeladen wurden)(FFOV = Der RX FIFO ist übergelaufen)
    'x3 = WKUP
    'x4 = EXT
    'x5 = LBD
    'x6 = FFBM (Der FIFO Puffer ist leer)
    'x7 = RSSI/ATS (ATS = )(RSSI = Die Signalstärke ist über dem eingestelltem Limit)
    'x8 = DQD
    'x9 = CRL
    'x10 = ATGL
    'x11 = OFFS_4
    'x12 = OFFS_3
    'x13 = OFFS_2
    'x14 = OFFS_1
    'x15 = OFFS_0
    'x16 = FO
    'x17 = FO+1
    'x18 = FO+2

    '=== FIFO und RESET-Mode ===
    'Hex = ca & xx
    'Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | -unknow- (0) | al | ff | dr
    'f... = (FIFO interrupt Level)
    '-unknow- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)
    'al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt. (0=Syncron / 1=Ständig). Bei nutzung des Syncronen Modus, werden erst dann Daten in den FIFO geschrieben, wenn eine definierte 16Bit Datenfolge empfangen wurde (Standard ist Hex: 2dd4).
    'ff = (FIFO Fill) Startet das einlesen der Empfangenen Daten in den FIFO Puffer. Wenn al (FIFO Fill Condition) auf Syncron steht, dann startet das Setzen dieses Bits die Syncronisation Bit Erkennung.
    'dr = (Sens Reset Mode) Wenn dieses Bit auf 1 steht, wir bei einer schwankung von 200mV auf der VCC (Spannungsversorgung des Chips) Leitung, ein System-Reset ausgelöst.

  • Poziom 32  
    Też walczę z tymi modułami. Komunikacja już chodzi ale nie potrafię zupełnie uśpić tego modułu. Wysyłam comendę:
    Code:
      RFXX_WRT_CMD(0x8201);//         Power_Down
    potem usypiam ATmega169 i całość pobiera dalej około 1ma. Dodam że bez modułu RFM12B procek a konkretnie moduł Butterfly pobiera prawie "nic". O czym jeszcze zapomniałem ?
  • Poziom 43  
    A dlaczego tak wysyłasz ? W instrukcji powiedziano, aby wejść w tryb sleep trzeba wyłączyć oscylator. a to jest 8208h
    8201h to jest "disable clock"

    Code:
    When the microcontroller turns the crystal oscillator off by clearing the appropriate bit using the Configuration Setting Command, the chip provides a fixed number (196) of further clock pulses (“clock tail”) for the microcontroller to let it go to idle or sleep mode.


    Transmisja radiowa - dzisiejsze realia sprzętowe
  • Poziom 32  
    Po prostu wszystko ustawiam na nieaktywne, zgodnie z tabelą. A co do tego poboru to się wyjaśniło. Po prostu na tej samej lini miałem jeszcze CS pamięci flash. Po odłączeniu tej linii (nIRQ) na tych ustawieniach (0x8201) całość RFM12B + Butterfly pobiera prawie "nic" i oto mi chodziło.
    Co do zasięgu to na modułach na 433MHz ale na drutach tylko po 8cm uzyskałem około 50m. Muszę dać trochę dłuższe antenki dla tej częstotliwości to może 100m uzyskam.
  • Poziom 17  
    Ważne dla mnie jest czy po uśpieniu musisz wysyłać wszystkie dane konfiguracyjne? Bo sposób na wyłączenie modułu np prądem , nie daje podobnego efektu? Chodzi mi o minimalizacje poboru prądu. Chcę budzić moduł i procka kilka razy w ciągu sekundy na nasłuch. I zależy mi na szybkości. Może jednak wysłanie kilku linijek trwa dosyć szybko? Mam zamiar procka ustawić na 1MHz. Wiele pytań a dopóki nie będę miał gotowego układu niewiele się dowiem. :|