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

RFM01 i RFM02 Pod Bascom poraz kolejny

10 Kwi 2009 23:09 9576 41
  • Poziom 22  
    Witam

    Chciałbym użyć łącza radiowego zbudowanego z pary RFM01 i RMF02. Nie mam zamiaru wysyłać danych,ale bardziej coś na zasadzie włącz/wyłącz. Np wysyłam bajt 128 jako włączenie ,a 256 jako wyłączenie. Niestety nie wiem czy zawsze muszę korzystać z FIFO (nie miałem z tym nigdy doczynienia). Czy istnieje jakiś prosty sposób żeby to wykonać na tych nadajnikach? Nie liczę na gotowy program ,ale byłbym bardzo wdzięczny (i to w punktach), gdyby ktoś przybliżył mi sposób transmisji przez te układy (jak odczytywać dane z odbiornika,czy musze korzystać z przerwania ,co to jest fsk-serial data input for FSK mod itp)

    Zaznaczam że zapoznałem się z dokumentacją (jeżeli tak można ją nazwać), oraz z postami na forum.
  • Multimetr FlukeMultimetr Fluke
  • Poziom 22  
    No więc proszę o opis trybu nie fifo. Dane odbierane przez odbiornik od razu będą wysyłane przez SPI (odbiornik jako Master?).
    I czy mógłby ktoś przybliżyć mi jak wysłać dane przez ten nadajnik?Np. w tej postaci

    -Inicjalizuję nadajnik przez SPI
    -Konfiguruje odpowiednie rejestry
    -wysyłam preambułe (przez SPI)
    -wysyłam bajty kalibracyjne
    -wysyłam dane
    Ale co dalej? To już idzie w eter? Czy może najpierw do bufora ,a potem jakimś specjalnym bajtem odpala się nadawanie?O co chodzi z tym FSK?
  • Poziom 43  
    Nie no. Coś motasz.

    Inicjalizujesz nadajnik przez SPI, co jest równoznaczne z Konfiguracją odpowiednich rejestrów.
    I tyle.

    Teraz w nadajniku wystawiasz 1 albo 0 a w odbiorniku pojawia sie 1 albo 0 (wystawiasz i odbierasz na pinie którego nazwy teraz nie pamiętam).

    Dodano po 3 [minuty]:

    No właśnie to ten pin. FSK. W nadajniku podajesz na niego 0 albo 1 a w odbiorniku będzie Ci się to pojawiało. Oczywiście jak w ogóle zacznie to działać.
  • Poziom 22  
    tak mam je,tylko mam jedną płytkę testowa i będe musiał je uruchamiać niejako po kolei
  • Multimetr FlukeMultimetr Fluke
  • Poziom 43  
    No to jest pin FSK :)
    A w odbiornku DATA/nFFS.

    Dodano po 1 [minuty]:

    Szkoda że masz tylko jedną płytkę testową. Ale i tak na początek przewidywałem że uruchomimy komunikacje SPI z modułami, bo to ona na samym początku będzie robiła problemy.
    No to zyć jakiś schemat.
    Potem ja rzucę program ;)
  • Poziom 22  
    Czyli jeżeli dobrze rozumie to mogę na tych pinach zrobić sobie taką niesynchornizowaną magistralkę ?
  • Poziom 22  
    W konfiguracji trzeba gdzieś pewnie podać że nie używam FIFO? Biore się za ponowną lekturę tego słynnego postu na temat tych modułów ,bo gdzieś tam w nocie był błąd przy inicjalizacji tych układów.
  • Poziom 43  
    Na początek może spróbuj uruchomić komunikację SPI. Najlepiej to zmieniaj częstotliwość na pinie CLK i zobacz czymś, najlepiej oscyloskopem, czy faktycznie się zmienia.
    Ja na początku zabawy z RFM12B miałem właśnie problemy ze SPI. Dziwię się że ludzie (z tamtego tematu) nie wpadli na to żeby wykorzystać CLK do sprawdzenia komunikacji po SPI. Ja od razu zobaczyłem że sygnał CLK się nie zmienia więc od razu wiedziałem że to sama komunikacja z modułem nie działa. I od tego zacząłem kombinowanie zamiast szukać błędu w ciemno.
  • Poziom 22  
    układ wygląda następująco:
    Do SDI do PC1
    SCK do PC2

    CLK do oscyloskopu

    Uc to Atmega8

    Teraz na CLK jest przebieg około 1MHz
  • Poziom 22  
    nSel mam do masy na stałe,a podłączony mam RFM01
  • Poziom 22  
    nSEL podpiety pod port PC3,FSK przez rezystor do plusa
  • Poziom 43  
    Dobra.
    SDI <--> PC1
    SCK <--> PC2
    nSEL <--> PC3
    FSK <--> VCC

    Code:

    $regfile = "M8def.dat"
    $crystal = 8000000
    $hwstack = 64
    '-------------------------------------------------------------------------------
    Dim Dana As Byte

    Dim I As Byte

    Dim Data_out As Word
    Dim Data_in As Word

    Dim Data_to_send As Byte
    Dim Received_data As Byte
    '-------------------------------------------------------------------------------
    Rf_sck Alias Portc.2
    Rf_sdo Alias Pinc.4
    Rf_sdi Alias Portc.1
    Rf_nsel Alias Portc.3
    '-------------------------------------------------------------------------------
    Portb = &B00000000
    Portc = &B00011010
    Portd = &B00000000

    Config Portb = &B00000000
    Config Portc = &B00001110
    Config Portd = &B00000000



    Gosub Rf02_init
    Waitms 100
    Gosub Rf02_init


    Wait 5

    Data_out = &H9382                                           '868MHz, CLK = 2MHz
    Gosub Rf02_wrt_cmd_2

    Do
    Loop
    '-------------------------------------------------------------------------------
    Rf02_init:
        Data_out = &HCC00                                       'Status Register Read Command
        Gosub Rf02_wrt_cmd_2
        Data_out = &H9082                                       '868MHz, Frequency deviation = 90kHz, CLK = 1MHz
        Gosub Rf02_wrt_cmd_2
        Data_out = &HA640
        Gosub Rf02_wrt_cmd_2
        Data_out = &HD0D4
        Gosub Rf02_wrt_cmd_2
        Data_out = &HC823                                       'Baud Rate = ileśtam
        Gosub Rf02_wrt_cmd_2
        Data_out = &HC220                                       'FIFO enabled
        Gosub Rf02_wrt_cmd_2
        Data_out = &HC000
        Gosub Rf02_wrt_cmd_2
    Return
    '-------------------------------------------------------------------------------
    Rf02_wrt_cmd_2:
        Rf_sck = 0
        Rf_nsel = 0



        Data_in = 0

        For I = 0 To 15
           Rf_sdi = Data_out.15

           Shift Data_out , Left , 1

           Rf_sck = 1

           Shift Data_in , Left , 1.

           Data_in.0 = Rf_sdo

           Rf_sck = 0
        Next I



        Rf_sck = 0
        Rf_nsel = 1
    Return
    '-------------------------------------------------------------------------------



    Zobacz czy pojawi się CLK 1MHz a po 5-siu sekundach zmieni się na 2MHz.

    No tak, tylko że to jest dla RFM02 :/
  • Poziom 22  
    nie mam kwarcu 16MHz. Na jakimś wolniejszym nie da rady ?
  • Poziom 43  
    Kwarc może być dowolny. Może byc i wewnętrzny generator RC z wnętrza ATMega8.

    Tutaj kod dla RFM01:

    Code:

    $regfile = "M8def.dat"
    $crystal = 8000000
    $hwstack = 64
    '-------------------------------------------------------------------------------
    Dim Dana As Byte

    Dim I As Byte

    Dim Data_out As Word
    Dim Data_in As Word

    Dim Data_to_send As Byte
    Dim Received_data As Byte
    '-------------------------------------------------------------------------------
    Rf_sck Alias Portc.2
    Rf_sdo Alias Pinc.4
    Rf_sdi Alias Portc.1
    Rf_nsel Alias Portc.3
    '-------------------------------------------------------------------------------
    Portb = &B00000000
    Portc = &B00011010
    Portd = &B00000000

    Config Portb = &B00000000
    Config Portc = &B00001110
    Config Portd = &B00000000



    Gosub Rf01_init
    Waitms 100
    Gosub Rf01_init


    Wait 5

    Data_out = &HC260                                           'CLK = 2MHz
    Gosub Rf01_wrt_cmd_2

    Do
    Loop
    '-------------------------------------------------------------------------------
    Rf01_init:
        Data_out = &H0000                                       'Status Register Read Command
        Gosub Rf01_wrt_cmd_2
        Data_out = &H918C                                       '868MHz, Bndwidth = 67kHz, !dc
        Gosub Rf01_wrt_cmd_2
        Data_out = &HA640
        Gosub Rf01_wrt_cmd_2
        Data_out = &HC847                                       'Baud Rate = ileśtam
        Gosub Rf01_wrt_cmd_2
        Data_out = &HC69B
        Gosub Rf01_wrt_cmd_2
        Data_out = &HC42A
        Gosub Rf01_wrt_cmd_2
        Data_out = &HC200                                       'CLK = 1MHz
        Gosub Rf01_wrt_cmd_2
        Data_out = &HCE8B                                       'FIFO enabled
        Gosub Rf01_wrt_cmd_2
        Data_out = &HC081
        Gosub Rf01_wrt_cmd_2
    Return
    '-------------------------------------------------------------------------------
    Rf01_wrt_cmd_2:
        Rf_sck = 0
        Rf_nsel = 0



        Data_in = 0

        For I = 0 To 15
           Rf_sdi = Data_out.15

           Shift Data_out , Left , 1

           Rf_sck = 1

           Shift Data_in , Left , 1.

           Data_in.0 = Rf_sdo

           Rf_sck = 0
        Next I



        Rf_sck = 0
        Rf_nsel = 1
    Return
    '-------------------------------------------------------------------------------
  • Poziom 22  
    Niestety nie zmienia się nic. Wstawiłem nawet jakiś kwarc 17MHz na próbę.

    Jakieś sygnały do niego docierają bo co chwile coś tam przeskakuje na oscyloskopie ,ale częstotliwość sie nie zmienia
  • Poziom 22  
    Tak testuje RMF01 .Zwolniłem transmisję i to co widziałem jako przeskakiwanie na oscyloskopie to nic innego jak spadek napięcia na wyjściu SCK o jakieś 100mV
  • Poziom 43  
    Dla RFM01 w RF01_Init można jeszcze zamiast:
    Code:

        Gosub Rf01_wrt_cmd_2
        Data_out = &H918C                                       '868MHz, Bndwidth = 67kHz, !dc


    wstawić:
    Code:

        Gosub Rf01_wrt_cmd_2
        Data_out = &H918D                                       '868MHz, Bndwidth = 67kHz, dc


    i zobaczyć czy sygnał CLK zniknie.

    Dodano po 2 [minuty]:

    Acha. Przeskakiwanie poziomu CLK i u mnie było. Czyli coś jednak odbiera bo pobór prądu skacze.
  • Poziom 22  
    Już działa. Zrobiłem sobie małego hardwarowego buga :) .Zmienił częstotliwość na 2MHz. Czyli SPI działa.

    Dodano po 12 [minuty]:

    Zrobimy tak ,że jakbyś mógł to zamieść kod dla RFM02 ze skróconym opisem uruchomienia. Ja zaś udam się w podróż do znajomego po drugą płytkę testową do ATMEGi:) Postaram się jak najwięcej uciułać samemu a gdybym coś nie wiedział to będe pytał.

    A propo pytań:
    1.Ten sygnał SCK służy do? To jakaś synchronizacja transmisji z uC?
    2.Czy na wyjściu FSK mogą od zakłóceń zmieniać się stany? Ponieważ chciałbym obsługiwać odbiór informacji (włącz/wyłącz) w przerwaniu które podpiąłbym do FSK.

    Pozdrawiam i wielkie dzięki za dotychczasową pomoc
  • Poziom 43  
    To jest raczej CLK. To jest sygnał zegarowy którym można taktować procesor.
    Na wyjściu DATA/nFFS (FSK to jest wejście) mogą pojawiać się śmieci. Jeżeli to ma być proste sterowanie włącz/wyłącz to zwykle wystarczy obród RC o dużej stałej czasowej, rzędu 100...200ms.
    Kody programów na razie włączają bufor FIFO. Trzeba więc je zmienić.
  • Poziom 22  
    Tzn to bedzie jednym przyciskiem włączane ,a drugim wyłączane. Rozwiąże to raczej w ten sposób że będe wysyłał na początku 3-4 bajty samych jedynek(tak żeby wraz z ukladem RC dostać na wyjściu pewny stan nadający się na wywołanie przerwania),a potem jeden bajt odpowiadający za włącz/wyłącz