اطلاعیه

Collapse
No announcement yet.

افزایش برد RFM12BP جی پی اس و قطب نما

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    افزایش برد RFM12BP جی پی اس و قطب نما

    افزایش برد RFM12BP جی پی اس و قطب نما

    سلام خدمت دوستان گرامی
    روی رباتی کار می کنم که اطلاعات GPS را باکمک مازول GT720 و یک ماژول قطب نما به نام CMPSO3 را به PC میفرسته
    و PC با کمک یک برنامه اونو هدایت میکنه
    تا حدود زیادی هم موفق به این کار شدم ار تباط نیمه دو طرفه
    اما مشکل اینجاست که برد RFM12BP خیلی کمه در حد 30 متر
    در ضمن پایه های TX_En و RX_EN را هم کنترل می کنم ( یعنی برای ارسال پایه TX_Enرا یک و RX_En راصفر و برای در یافت برعکس عمل می کنم) ولتاژ VCC-PA را 12 ولت توسط رگولاتور LM7812 و ولتاژ VDD را هم 3.1 ولت میدم توسط LM817

    حالا سورس کدی هم که ازش استفاده می کنم قرار میدم تا دوستان اگه تونستن کمکم کنن و افرادی که دوست دارن طریقه استفاده ار ماژول قطب نمای CMPSO3 را یاد یگیرن یک زیر برنامه آماده تر وتمیز داشته باشن و همینطور دوستانی که با این GPS GT720F آشنایی ندارن
    در مورد GT720F بگه که خروجی TTL , RS232 داره نیازی به هیچ ورودی اطلاعات نداره با 64 ماهواره در ارتباطه زمان باسخگویی اون در اتاق زیر 2 ثانیه هست با پرتکل NMEA خروجی میده یک آنتن سرامیکی رو خودش داره و حتی توی اتاقی که پنجره نداره هم به من جواب داد البته فیلد RMC و GSV و GSA الیته بقیه فیلدها را نمیتونه بگیره و
    ولی در فضای آزاد و آسمان باز بقیه فیلدهاا را هم زیر 0.5 ثانیه میده

    حالا از دوستانی که با RFM12 کار کردن تقاضای یاری دام ( زکات علم آموختنه )
    این سورس کد ربات

    کد:
    $regfile = "m8def.dat" 
     $hwstack = 32 
     $swstack = 10 
     $framesize = 40 
     $baud = 9600 
     $crystal = 8000000 
    
     Config Sda = Portc.4 
     Config Scl = Portc.5 
     Config Portb.1 = Output 
     Config Portb.0 = Output 
     Config Portd.7 = Output 
     Reset Portb.1 
     Reset Portb.0 
     Reset Portd.7 
    
     Rfm12_rst Alias Portd.4 
     Config Rfm12_rst = Input 
    
     Test_pin Alias Portc.3 
    
     Rfm12_cs Alias Portb.2 
     Config Portb.2 = Output 
     Set Rfm12_cs 
    
     Rfm12_sdi Alias Portb.3 
     Config Portb.3 = Output 
    
     Rfm12_sdo Alias Pinb.4 
     Config Pinb.4 = Input 
     Set Portb.4 
    
     Rfm12_sck Alias Portb.5 
     Config Portb.5 = Output 
    
     Rx_led Alias Portc.0 
     Config Portc.0 = Output 
    
     Tx_led Alias Portc.1 
     Config Portc.1 = Output 
    
     Error_led Alias Portc.2 
     Config Portc.2 = Output 
    
     Rx_en Alias Portb.6 
     Config Portb.6 = Output 
    
     Tx_en Alias Portb.7 
     Config Portb.7 = Output 
    
     Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , _ 
     Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 
     Spiinit 
    
     Declare Function Compass() As String 
     Declare Sub Rfm12_spi_wrt 
     Declare Sub Rfm12_tx(txarray As Byte) 
     Declare Sub Rfm12_rx(rxarray As Byte) 
     Declare Sub Rfm12_tx_ready 
     Declare Sub Rfm12_rx_wait 
     Declare Sub Rfm12_get_status_bit 
     Declare Sub Saveflags 
     Declare Sub Rfm12_clear_fifo 
     Declare Sub Rfm12_rx_on 
     Declare Sub Rfm12_init 
     Declare Sub Printflags 
     Declare Sub Send(send_str As String) 
    
     Const Fc = 435.00 
     Const Fr =(fc - 430) * 400 
     Const Fcmnd = &HA000 + Fr 
     Const Payload_size = 90 
     Const Pls_plus1 = Payload_size + 1 
    
     Dim Gga As String * 90 
     Dim Gll As String * 60 
     Dim Gsa As String * 80 
     Dim Gsv As String * 80 
     Dim Rmc As String * 90 
     Dim Vtg As String * 60 
     Dim Zda As String * 50 
     Dim Cmpss As String * 13 
    
    
     Dim Spi_tx_wrd As Word 
     Dim Spi_tx_l As Byte At Spi_tx_wrd Overlay 
     Dim Spi_tx_h As Byte At Spi_tx_wrd + 1 Overlay 
     Dim Spi_rx_wrd As Word 
     Dim Spi_rx_l As Byte At Spi_rx_wrd Overlay 
     Dim Spi_rx_h As Byte At Spi_rx_wrd + 1 Overlay 
    
     Dim Rx_status_bit As Bit 
     Dim Rxbuffer(pls_plus1) As Byte 
     Dim Rxstring As String * Payload_size At Rxbuffer(1) Overlay 
     Rxbuffer(pls_plus1) = 0 
    
     Dim Txindex As Byte 
     Dim Txbuffer(pls_plus1) As Byte 
     Dim Txstring As String * Payload_size At Txbuffer(1) Overlay 
     Txbuffer(pls_plus1) = 0 
    
     Dim Timeout As Word 
     Dim Flags As Byte 
    
     Echoflag Alias Flags.0 
     Beaconflag Alias Flags.1 
     Sermsgflag Alias Flags.2 
     Rxonflag Alias Flags.3 
     Txonflag Alias Flags.4 
    
     Dim Savedflags As Eram Byte 
     Wait 1 
     Set Rx_led 
     Set Tx_led 
     Set Error_led 
     Waitms 500 
     Reset Rx_led 
     Reset Tx_led 
     Reset Error_led 
     Waitms 500 
    
     Rfm12_init 
     Rfm12_rx_on 
     Flags = Savedflags 
    
     Dim St_b As Byte 
     St_b = 1 
     Dim Inp_str_temp As String * 6 
     Dim Str_temp As String * Payload_size 
     Str_temp = "" 
     Dim Get_str As String * Payload_size 
     Dim Comp_buffer As Byte 
     Comp_buffer = 0 
     Dim Count As Long 
     Dim Index As Word 
     Index = 0 
     On Urxc Rec_isr 
     Enable Serial 
     Enable Interrupts 
     'Gga = "$GPGGA,104549.04,2447.2038,N,12100,4990,E,1,06,01.7,00078.8,M,0016.3, M,,*5C" 
     'Gll = "$GPGLL,10454904,A,2447.2038,N,12100.4990,E,016.0,3.3,W,A*22" 
     'Gsa = "$GPGSA,10454904,A,2447.2038,N,12100..0,221.0,250304,003.3,W,A*22" 
     'Gsv = "$GPGSV,10454904,A,2447.20.4990,E,016.0,221.0,250304,003.3,W,A*22" 
     'Rmc = "$GPRMC,10454904,A,2447.2038,N,12100.4990,E,016.0,221.0,250304,003.3,W ,A*22" 
     'Vtg = "$GPVTG,10454904,A,2447.2038,016.0,221.0,250304,003.3,W,A*22" 
     'Zda = "$GPZDA,10454904,E,016.0,221.0,250304,003.3,W,A*22" 
    
     Cmpss = "000.0" 
     Do 
     Reset Tx_en 
     Set Rx_en 
     Rfm12_get_status_bit 
     If Rx_status_bit = 1 Then 
     Disable Urxc 
     Rfm12_rx Rxbuffer(1) 
     Reset Rx_en 
     Get_str = Rxstring 
     If Get_str = "0" Then 
     Get_str = Get_str + " is OK" 
     Reset Portb.1 
     Reset Portb.0 
     Reset Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "1" Then 
     Reset Portb.1 
     Reset Portb.0 
     Set Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "2" Then 
     Reset Portb.1 
     Set Portb.0 
     Reset Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "3" Then 
     Reset Portb.1 
     Set Portb.0 
     Set Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "4" Then 
     Set Portb.1 
     Reset Portb.0 
     Reset Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "5" Then 
     Set Portb.1 
     Reset Portb.0 
     Set Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "6" Then 
     Reset Portb.1 
     Set Portb.0 
     Set Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "7" Then 
     Set Portb.1 
     Set Portb.0 
     Set Portd.7 
     Get_str = Get_str + " is OK" 
     End If 
     If Get_str = "8" Then Get_str = Get_str + " is incorrect" 
     If Get_str = "9" Then Get_str = Get_str + " is incorrect" 
    
     Call Send(get_str) 
     If Gga <> "" Then 
     Call Send(gga) 
     Gga = "" 
     End If 
     Cmpss = Compass() 
     If Cmpss <> "" Then 
     Cmpss = "Compass=" + Cmpss 
     Call Send(cmpss) 
     End If 
     If Gll <> "" Then 
     Call Send(gll) 
     Gll = "" 
     End If 
     If Gsa <> "" Then 
     Call Send(gsa) 
     Gsa = "" 
     End If 
     If Gsv <> "" Then 
     Call Send(gsv) 
     Gsv = "" 
     End If 
     Cmpss = Compass() 
     If Cmpss <> "" Then 
     Cmpss = "Compass=" + Cmpss 
     Call Send(cmpss) 
     End If 
     If Rmc <> "" Then 
     Call Send(rmc) 
     Rmc = "" 
     End If 
     If Vtg <> "" Then 
     Call Send(vtg) 
     Vtg = "" 
     End If 
     If Zda <> "" Then 
     Call Send(zda) 
     Zda = "" 
     End If 
     Cmpss = Compass() 
     If Cmpss <> "" Then 
     Cmpss = "Compass=" + Cmpss 
     Call Send(cmpss) 
     End If 
     Enable Urxc 
     End If 
     Loop 
    
     End 'end program 
    
    
     Rec_isr: 
     Disable Serial 
     If Udr = 36 Then '36=$ 
     'star buffer 
     St_b = 1 
     Str_temp = "" 
     End If 
    
     If St_b = 1 Then 
    
     If Udr > 35 Then 
     If Udr < 123 Then 
     Str_temp = Str_temp + Chr(udr) 
     End If 
     End If 
    
     If Udr = 13 Then 
     St_b = 0 'stop buffer 
     Inp_str_temp = Mid(str_temp , 1 , 6) 
    
     Select Case Inp_str_temp 
    
     Case "$GPGGA": 
     Gga = Str_temp 
     Case "$GPGLL": 
     Gll = Str_temp 
     Case "$GPGSA": 
     Gsa = Str_temp 
     Case "$GPGSV": 
     Gsv = Str_temp 
     Case "$GPRMC": 
     Rmc = Str_temp 
     Case "$GPVTG": 
     Vtg = Str_temp 
     Case "$GPZDA": 
     Zda = Str_temp 
     End Select 
     End If 
    
     End If 
    
     Enable Serial 
     Return 
    
     Sub Send(send_str As String) 
     Txstring = Send_str 
     Reset Rx_en 
     Set Tx_en 
     Rfm12_tx Txbuffer(1) 
     Reset Tx_en 
     Txstring = "" 
     Waitus 350 
     End Sub 
    
     Sub Printflags 
     If Beaconflag = 1 Then 
     Print "Beacon ON" 
     Else 
     Print "Beacon OFF" 
     End If 
     If Echoflag = 1 Then 
     Print "Echo ON" 
     Else 
     Print "Echo OFF" 
     End If 
     End Sub 
    
     Sub Saveflags 
     'save to eram 
     Flags = Flags And 3 
     Savedflags = Flags 
     End Sub 
    
     Sub Rfm12_init 
     Local I As Byte 
     'Print "Init values:" 
     'Initialize RFM12 
     Restore Init_data 
     For I = 1 To 14 
     Read Spi_tx_wrd 
    Rem Print Hex(spi_tx_wrd) 
     'send init data to RFM12. 
     Rfm12_spi_wrt 
     'waitms 100 
     Next I 
     'Print 
     End Sub 
    
     '******************************************************************** *** 
     'The following data lines are RFM12 commands used to initialize the device. 
     'read the RFM12 progamming guide and data sheets for a complete 
     'description of these commands. 
     ' 
     'Configuration settings: 
     ' 
     '&h80D8 = Configure module for 433Mhz band. 
     ' 
     'RF center Freq. setting 
     'select freq with const "Fc" above. 
     'Fcmnd is a constant that holds the Freq command. 
     'see the "const" statments at the top of this code. 
     'example: &hA000 + Fr = &hA7D0 for 435MHz 
     ' 
     'To change the data rate the following values will need to be adjusted. 
     ' 
     'bit rate 
     '&hC611 = 19.2kbps works well at 8MHz 
     '&hC608 = 38.3kbps works at 8MHz 
     ' 
     'Rx band width 
     '&h94A0 = Rx BW = 134KHz works at 8MHz 
     '&h9480 = 200kHz works at 8MHz 
     ' 
     'Tx deviation 
     '&h9850 = 90kHz works at 8MHz 
     '&h9870 = 120kHz works at 8MHz 
    
     Init_data: 
     Data &H80D8% , &H8298% , Fcmnd% , &HC611% , &H94A0% , &HC2AC% , &HCA81% 
     Data &HCED4% , &HC483% , &H9850% , &HCC17% , &HE000% , &HC800% , &HC040% 
     '******************************************************************** ***** 
    
     Sub Rfm12_clear_fifo 
     'Clear FIFO 
     Spi_tx_wrd = &HCA81 
     Rfm12_spi_wrt 
     Spi_tx_wrd = &HCA83 
     Rfm12_spi_wrt 
     End Sub 
    
     Sub Rfm12_tx(txarray As Byte) 
     Local I As Byte 
     Set Tx_led 
     'turn on Tx 
     Spi_tx_wrd = &H8239 
     Rfm12_spi_wrt 
     Txonflag = 1 
     Waitus 150 
     'Send Preamble. 
     Restore Txpreamble_data 
     For I = 1 To 5 
     Read Spi_tx_wrd 
     Rfm12_tx_ready 
     If Timeout = 0 Then Exit For 
     Rfm12_spi_wrt 
     Next I 
     'Send payload. 
     For I = 1 To Payload_size 
     Rfm12_tx_ready 
     If Timeout = 0 Then Exit For 
     Spi_tx_wrd = &HB800 + Txarray(i) 
     Rfm12_spi_wrt 
     Next I 
     Rfm12_tx_ready 
     Rfm12_rx_on 
     Reset Tx_led 
     End Sub 
    
     Txpreamble_data: 
     Data &HB8AA% , &HB8AA% , &HB8AA% , &HB82D% , &HB8D4% 
    
     Sub Rfm12_tx_ready 
     Reset Rfm12_cs 
     Timeout = 65500 
     While Rfm12_sdo = 0 
     Decr Timeout 
     Waitus 6 
     If Timeout = 0 Then 
     'Print "Tx Timeout" 
     Exit While 
     End If 
     Wend 
     End Sub 
    
     Sub Rfm12_rx_on 
     'Start Rx 
     Spi_tx_wrd = &H8299 
     Rfm12_spi_wrt 
     Rfm12_clear_fifo 
     Rxonflag = 1 
     Waitus 80 
     End Sub 
    
     Sub Rfm12_rx(rxarray As Byte) 
     Local I As Byte 
     Timeout = 1 
     Set Rx_led 
     Spi_tx_wrd = &HB000 
     For I = 1 To Payload_size 
     Rfm12_rx_wait 
     If Timeout = 0 Then 
     Reset Rx_led 
     Set Error_led 
     Exit For 
     End If 
     Rfm12_spi_wrt 
     Rxarray(i) = Spi_rx_l 
     Next I 
     Rxarray(i) = 0 
     Rfm12_clear_fifo 
     Reset Rx_led 
     End Sub 
    
     Sub Rfm12_rx_wait 
     Timeout = 35500 
     Do 
     Rfm12_get_status_bit 
     'timeout if nothing happens. 
     Decr Timeout 
     If Timeout = 0 Then 
     Reset Error_led 
     'Print "Rx Timeout" 
     Exit Do 
     End If 
     Loop Until Rx_status_bit = 1 
     End Sub 
    
     Sub Rfm12_get_status_bit 
     Reset Rfm12_sdi 
     Reset Rfm12_cs 
     Set Rfm12_sck 
     Rx_status_bit = Rfm12_sdo 
     Reset Rfm12_sck 
     Set Rfm12_cs 
     End Sub 
    
     Sub Rfm12_spi_wrt 
     'Send word (SPI_Tx_wrd) to RFM12. 
     'Also receive word (SPI_Rx_wrd). 
     'RFM12 Chip select 
     Reset Rfm12_cs 
     'send hi byte. 
     Spi_rx_h = Spimove(spi_tx_h) 
     'send lo byte. 
     Spi_rx_l = Spimove(spi_tx_l) 
     'deselect chip. 
     Set Rfm12_cs 
     End Sub 
    '-------------------------------- Function ------------------------------------- 
     Function Compass() As String 
     Dim Hi As Byte 
     Dim Lo As Byte 
     Dim Heading As Integer 
     Dim Heading_si As Single 
    
     I2cstart 
     I2cwbyte &HC0 
     I2cwbyte &HC1 
     I2cstop 
    
     I2cstart 
     I2cwbyte &HC1 
     I2crbyte Hi , Ack 
     I2crbyte Hi , Ack 
     I2crbyte Lo , Nack 
     I2cstop 
     'Waitms 50 
     'Hi = 14 'Max Hi 360 
     'Lo = 16 'Max Lo 360 
    
     Heading = Makeint(lo , Hi) 
     Heading_si = Heading / 10 
     Compass = Str(heading_si) 
     Compass = Fusing(heading_si , "&.#") 
     End Function
    این هم سورس کد مدار اینتر فیس
    کد:
    $regfile = "m8def.dat" 
     $hwstack = 32 
     $swstack = 10 
     $framesize = 40 
     $baud = 57600 
     $crystal = 8000000 
    
    
     Rfm12_rst Alias Portd.4 
     Config Rfm12_rst = Input 
    
     Test_pin Alias Portc.3 
    
     Rfm12_cs Alias Portb.2 
     Config Portb.2 = Output 
     Set Rfm12_cs 
    
     Rfm12_sdi Alias Portb.3 
     Config Portb.3 = Output 
    
     Rfm12_sdo Alias Pinb.4 
     Config Pinb.4 = Input 
     Set Portb.4 
    
     Rfm12_sck Alias Portb.5 
     Config Portb.5 = Output 
    
     Rx_led Alias Portc.0 
     Config Portc.0 = Output 
    
     Tx_led Alias Portc.1 
     Config Portc.1 = Output 
    
     Error_led Alias Portc.2 
     Config Portc.2 = Output 
    
     Rx_en Alias Portb.6 
     Config Portb.6 = Output 
    
     Tx_en Alias Portb.7 
     Config Portb.7 = Output 
    
    
     Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , _ 
     Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 
     Spiinit 
    
    
    
     Declare Sub Rfm12_spi_wrt 
     Declare Sub Rfm12_tx(txarray As Byte) 
     Declare Sub Rfm12_rx(rxarray As Byte) 
     Declare Sub Rfm12_tx_ready 
     Declare Sub Rfm12_rx_wait 
     Declare Sub Rfm12_get_status_bit 
     Declare Sub Saveflags 
     Declare Sub Rfm12_clear_fifo 
     Declare Sub Rfm12_rx_on 
     Declare Sub Rfm12_init 
    
     'From: RF12 Programing Guide 
     'Min Freq 430.24 
     'Max Freq 439.75 
     'in 2.5KHz steps 
     ' 
     'That makes 3800 possible frequencies 
     'to choose from. 
    
     'Fc = the center Freq. in MHz 
     'Fr = the Freq. register value. 
     'Fc = 430 + Fr * 0.0025 (MHz) 
     'Fr = (Fc - 430) * 400 
     Const Fc = 435.00 
     Const Fr =(fc - 430) * 400 
     Const Fcmnd = &HA000 + Fr 
    
     'Payload can be up to 254 bytes. 
     'I have tested up to 128 bytes only. 
     Const Payload_size = 128 
     'Const Payload_size = 32 
     'const Payload_Size = 16 
     Const Pls_plus1 = Payload_size + 1 
    
     'make the test beacon length Payload_Size - 2 
     Const Beacon = "123456789012345678901234567890" 
    
     Dim Tempbit As Bit 
     Dim Temp As Byte 
     Dim Tempw As Word 
    
     Dim Spi_tx_wrd As Word 
     Dim Spi_tx_l As Byte At Spi_tx_wrd Overlay 
     Dim Spi_tx_h As Byte At Spi_tx_wrd + 1 Overlay 
     Dim Spi_rx_wrd As Word 
     Dim Spi_rx_l As Byte At Spi_rx_wrd Overlay 
     Dim Spi_rx_h As Byte At Spi_rx_wrd + 1 Overlay 
    
     Dim Rx_status_bit As Bit 
     Dim Rxbuffer(pls_plus1) As Byte 
     Dim Rxstring As String * Payload_size At Rxbuffer(1) Overlay 
     Rxbuffer(pls_plus1) = 0 
    
     Dim Txindex As Byte 
     Dim Txbuffer(pls_plus1) As Byte 
     Dim Txstring As String * Payload_size At Txbuffer(1) Overlay 
     Txbuffer(pls_plus1) = 0 
    
     Dim Timeout As Word 
     Dim Cmnd As String * 4 
     Dim Flags As Byte 
    
     Echoflag Alias Flags.0 
     Beaconflag Alias Flags.1 
     Sermsgflag Alias Flags.2 
     Rxonflag Alias Flags.3 
     Txonflag Alias Flags.4 
     Dim Count As Byte ' for loop 
     Dim Val_bin As Byte 
    
     'I have read somewhere that eram address 0 has a bug 
     'so I don't use it. 
     Dim Dummy As Eram Word At 0 
     'ProgCntr must be at eram address 2. 
     'ProgCntr is incramented by the bootloader 
     'each time the chip is flashed. 
     Dim Progcntr As Eram Word At 2 
     Dim Savedflags As Eram Byte 
    
    
     Tempw = Progcntr 
     'Print "uC flashed " ; Tempw ; " times." 
     'Print 
    
     'kill some time here while 
     'rfm12 does a power on reset. 
     Set Rx_led 
     Set Tx_led 
     Set Error_led 
     Waitms 500 
     Reset Rx_led 
     Reset Tx_led 
     Reset Error_led 
    
     Rfm12_init 
     Rfm12_rx_on 
     Flags = Savedflags 
     Cmnd = "" 
     On Urxc Rec_isr 
     Enable Urxc 
     Enable Interrupts 
    
     Do 
     Reset Tx_en 
     Set Rx_en 
     Rfm12_get_status_bit 
     If Rx_status_bit = 1 Then 
     Disable Urxc 
     Rfm12_rx Rxbuffer(1) 
     Reset Rx_en 
     Print Rxstring 
     Rxstring = "" 
     Enable Urxc 
     Else 
     If Txstring <> "" Then 
     Disable Urxc 
     Reset Rx_en 
     Set Tx_en 
     Rfm12_tx Txbuffer(1) 
     Reset Tx_en 
     Waitus 350 
     Txstring = "" 
     Enable Urxc 
     End If 
     End If 
     Loop 
    
     End 'end program 
    
     Rec_isr: 
     Txstring = "" 
     Txstring = Chr(udr) 
     Return 
    
    
     Sub Saveflags 
     'save to eram 
     Flags = Flags And 3 
     Savedflags = Flags 
     End Sub 
    
     Sub Rfm12_init 
     Local I As Byte 
     Print "Init values:" 
     'Initialize RFM12 
     Restore Init_data 
     For I = 1 To 14 
     Read Spi_tx_wrd 
    Rem Print Hex(spi_tx_wrd) 
     'send init data to RFM12. 
     Rfm12_spi_wrt 
     'waitms 100 
     Next I 
     Print 
     End Sub 
    
     '******************************************************************** *** 
     'The following data lines are RFM12 commands used to initialize the device. 
     'read the RFM12 progamming guide and data sheets for a complete 
     'description of these commands. 
     ' 
     'Configuration settings: 
     ' 
     '&h80D8 = Configure module for 433Mhz band. 
     ' 
     'RF center Freq. setting 
     'select freq with const "Fc" above. 
     'Fcmnd is a constant that holds the Freq command. 
     'see the "const" statments at the top of this code. 
     'example: &hA000 + Fr = &hA7D0 for 435MHz 
     ' 
     'To change the data rate the following values will need to be adjusted. 
     ' 
     'bit rate 
     '&hC611 = 19.2kbps works well at 8MHz 
     '&hC608 = 38.3kbps works at 8MHz 
     ' 
     'Rx band width 
     '&h94A0 = Rx BW = 134KHz works at 8MHz 
     '&h9480 = 200kHz works at 8MHz 
     ' 
     'Tx deviation 
     '&h9850 = 90kHz works at 8MHz 
     '&h9870 = 120kHz works at 8MHz 
    
     Init_data: 
     Data &H80D8% , &H8298% , Fcmnd% , &HC611% , &H94A0% , &HC2AC% , &HCA81% 
     Data &HCED4% , &HC483% , &H9850% , &HCC17% , &HE000% , &HC800% , &HC040% 
     '******************************************************************** ***** 
    
     Sub Rfm12_clear_fifo 
     'Clear FIFO 
     Spi_tx_wrd = &HCA81 
     Rfm12_spi_wrt 
     Spi_tx_wrd = &HCA83 
     Rfm12_spi_wrt 
     End Sub 
    
     Sub Rfm12_tx(txarray As Byte) 
     Local I As Byte 
     Set Tx_led 
     'turn on Tx 
     Spi_tx_wrd = &H8239 
     Rfm12_spi_wrt 
     Txonflag = 1 
     Waitus 150 
     'Send Preamble. 
     Restore Txpreamble_data 
     For I = 1 To 5 
     Read Spi_tx_wrd 
     Rfm12_tx_ready 
     If Timeout = 0 Then Exit For 
     Rfm12_spi_wrt 
     Next I 
     'Send payload. 
     For I = 1 To Payload_size 
     Rfm12_tx_ready 
     If Timeout = 0 Then Exit For 
     Spi_tx_wrd = &HB800 + Txarray(i) 
     Rfm12_spi_wrt 
     Next I 
     Rfm12_tx_ready 
     Rfm12_rx_on 
     Reset Tx_led 
     End Sub 
    
     Txpreamble_data: 
     Data &HB8AA% , &HB8AA% , &HB8AA% , &HB82D% , &HB8D4% 
    
     Sub Rfm12_tx_ready 
     Reset Rfm12_cs 
     Timeout = 65500 
     While Rfm12_sdo = 0 
     Decr Timeout 
     Waitus 6 
     If Timeout = 0 Then 
     Print "Tx Timeout" 
     Exit While 
     End If 
     Wend 
     End Sub 
    
     Sub Rfm12_rx_on 
     'Start Rx 
     Spi_tx_wrd = &H8299 
     Rfm12_spi_wrt 
     Rfm12_clear_fifo 
     Rxonflag = 1 
     Waitus 80 
     End Sub 
    
     Sub Rfm12_rx(rxarray As Byte) 
     Local I As Byte 
     Timeout = 1 
     Set Rx_led 
     Spi_tx_wrd = &HB000 
     For I = 1 To Payload_size 
     Rfm12_rx_wait 
     If Timeout = 0 Then 
     Reset Rx_led 
     Set Error_led 
     Exit For 
     End If 
     Rfm12_spi_wrt 
     Rxarray(i) = Spi_rx_l 
     Next I 
     Rxarray(i) = 0 
     Rfm12_clear_fifo 
     Reset Rx_led 
     End Sub 
    
     Sub Rfm12_rx_wait 
     Timeout = 35500 
     Do 
     Rfm12_get_status_bit 
     'timeout if nothing happens. 
     Decr Timeout 
     If Timeout = 0 Then 
     Reset Error_led 
     Print "Rx Timeout" 
     Exit Do 
     End If 
     Loop Until Rx_status_bit = 1 
     End Sub 
    
     Sub Rfm12_get_status_bit 
     Reset Rfm12_sdi 
     Reset Rfm12_cs 
     Set Rfm12_sck 
     Rx_status_bit = Rfm12_sdo 
     Reset Rfm12_sck 
     Set Rfm12_cs 
     End Sub 
    
     Sub Rfm12_spi_wrt 
     'Send word (SPI_Tx_wrd) to RFM12. 
     'Also receive word (SPI_Rx_wrd). 
     'RFM12 Chip select 
     Reset Rfm12_cs 
     'send hi byte. 
     Spi_rx_h = Spimove(spi_tx_h) 
     'send lo byte. 
     Spi_rx_l = Spimove(spi_tx_l) 
     deselect chip. 
     Set Rfm12_cs 
     End Sub

    #2
    پاسخ : ادامه: افزایش برد RFM12BP جی پی اس و قطب نما

    سلام اگه برد بالا و بدون نویز می خوای RFM12 رو باید حتما با آنتن یاگی استفاده کنی.
    من یه آنتن از yagiuda.blogfa.com خریدم و تا 5 کیلومتر جواب گرفتم.با آنتن ها سیمی برد زیادی نداره و خیلی هم نویز می ده..
    موفق باشی.

    دیدگاه

    لطفا صبر کنید...
    X