۲۳-مرداد-۱۳۸۹, ۱۳:۴۷:۳۱
سلام خدمت دوستان گرامی
روی رباتی کار می کنم که اطلاعات 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 کار کردن تقاضای یاری دام ( زکات علم آموختنه )
راجع به انتن هم از همین آنتن های 433MHZ استفاده کردم برای هر دو طرف
سورس کد ربات
================================================= ====
اینم سورس کد بری که اطلاعات را از کامپیوتر میگیره و به ربات می فرسته و بلعکس
jadeyeabi@gmail.com
elecom@rocketmail.com
Pcb , schematic ضمیمه شده و برای هر دو برد یکسان است تفاوت در مونتاژ و سورس کد هست
روی رباتی کار می کنم که اطلاعات 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 کار کردن تقاضای یاری دام ( زکات علم آموختنه )
راجع به انتن هم از همین آنتن های 433MHZ استفاده کردم برای هر دو طرف
سورس کد ربات
کد php:
$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
اینم سورس کد بری که اطلاعات را از کامپیوتر میگیره و به ربات می فرسته و بلعکس
کد php:
$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
================================================================ ====================================================================== =======================
jadeyeabi@gmail.com
elecom@rocketmail.com
Pcb , schematic ضمیمه شده و برای هر دو برد یکسان است تفاوت در مونتاژ و سورس کد هست