|
'####################################################################### ' ' RF12-Testprogramm in Bascom ' ' ###################################################################### ' ### generated. Take care that the chip supports all fuse bytes. ' ### Basiert auf Code von Benedikt K. ' ### und Joachim Fossie Bär Reiter 04/2007 ' ### ' ### von Wigbert Picht ' ### Elektro-Picht@gmx.de ' ### Version 03.06.07 ' ######################################################################## ' ' Dieses Programm testet Sende und Empfang von RFM12 Tranceiver ' Stringeingabe durch RS232 '-------------------------------------------------------------------------- $regfile = "m8def.dat" 'mein MC $hwstack = 128 ' default use 32 for the hardware stack $swstack = 40 'default use 10 for the SW stack $framesize = 20
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 9216000 'mein Crystall bei RFM12-Takt 10000000 o.ä.angeben $baud = 19200 Baud = 19200
Config Portd.5 = Output 'LED zur Schleifenkontrolle
Declare Sub Rf12_init Declare Function Rf12_trans(byval Wert As Word) As Word 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_readys Declare Sub Rf12_txdata(byval Maxchar As Byte) Declare Sub Rf12_rxdata(byval Maxchar As Byte) Declare Sub Senden Declare Sub Empfangen
Const Rf12freq = 433.92 Const Rf12baud = 19200 Const Maxchar = 32
'config the SPI in master mode.The clock must be a quarter of the slave cpu ' Hier ggf. den SoftSPI reinmachen Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
' werden benötigt für rf12_ready Spi_cs Alias Portb.2 ' SS-Pin Config Spi_cs = Output Spi_sdo Alias Pinb.4 ' MISO-PIN Set Spi_cs
'init the spi pins Spiinit
' was so gebraucht wird Dim Count As Byte Dim Temp As Word Dim Rfdata(32) As Byte 'String max 32 Dim Text As String * Maxchar At Rfdata Overlay Dim S As String * 10
'Einlesen der String durch Interrupt On Urxc Onrxd 'Interrupt Empfange String von RXD Enable Urxc 'Einschalten Enable Interrupts 'Zulassen
Print "Init" Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz) Print "Set Frequenz" Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen Print "Set Bandwith" Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm Print "Set Baudrate" Call Rf12_setbaud(rf12baud) ' 19200 baud Print "Set Power" Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
' ######################################################################## ' ###### Hauptproggi ' ########################################################################
'Text ="Dies ist ein 433MHz Test !!!!!{013}{010}"
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife Empfangen 'Goto Empf Schleife:
Toggle Portd.5 'Schleifenkontrolle
If Len(s) > 9 Then 'wenn String >... dann Ausgabe 'interrupt niRQ 'warten auf nIRQ ,später mal Senden Text = S S = "" Empfangen End If Goto Schleife
Zuruck:
Loop End
' ######################################################################## ' ####### Tranceiverroutinen ' ######################################################################## Sub Empfangen Print "Empfange" Call Rf12_rxdata(maxchar) For Count = 1 To Maxchar Print Chr(rfdata(count)) ; "-"; Next Count Print Goto Zuruck End Sub
Sub Senden 'Waitms 1 'e ' Hier ist die Senderoutine Print "Sende" Call Rf12_txdata(maxchar) Waitms 10 End Sub
' ######################################################################## ' ###### Unterroutinen ' ########################################################################
Sub Rf12_init: Waitms 150 Temp = Rf12_trans(&Hc0e0) Temp = Rf12_trans(&H80d7) Temp = Rf12_trans(&Hc2ab) Temp = Rf12_trans(&Hca81) Temp = Rf12_trans(&He000) Temp = Rf12_trans(&Hc800) Temp = Rf12_trans(&Hc4f7) End Sub
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) End Sub
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) End Sub
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
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
Sub Rf12_txdata(byval Maxchar As Byte) Temp = Rf12_trans(&H8238) Rf12_readys Temp = Rf12_trans(&Hb8aa) Rf12_readys Temp = Rf12_trans(&Hb8aa) Rf12_readys Temp = Rf12_trans(&Hb8aa) Rf12_readys Temp = Rf12_trans(&Hb82d) Rf12_readys Temp = Rf12_trans(&Hb8d4) Rf12_readys For Count = 1 To Maxchar Rf12_readys Temp = &HB800 + Rfdata(count) Temp = Rf12_trans(temp) Next Count Rf12_readys Temp = Rf12_trans(&H8208) End Sub
Sub Rf12_rxdata(byval Maxchar As Byte) Temp = Rf12_trans(&H82c8) Temp = Rf12_trans(&Hca81) Temp = Rf12_trans(&Hca83) For Count = 1 To Maxchar Rf12_ready Temp = Rf12_trans(&Hb000) Rfdata(count) = Temp Next Count Temp = Rf12_trans(&H8208) End Sub
Function Rf12_trans(byval Wert As Word) As Word Local Lowbyte As Byte Local Highbyte As Byte
Lowbyte = Wert And 255 Shift Wert , Right , 8 Reset Spi_cs
Highbyte = Spimove(wert) Lowbyte = Spimove(lowbyte) Set Spi_cs
Temp = Highbyte * 256 Temp = Temp + Lowbyte Rf12_trans = Temp End Function
Sub Rf12_readys 'ready Senden Reset Spi_cs nop While Spi_sdo = 0 Wend End Sub
Sub Rf12_ready 'ready Empfangen Reset Spi_cs nop While Spi_sdo = 0 If Len(s) > 0 Then 'Wenn ein string eingelesen Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren Temp = Rf12_trans(&H8208) 'Empf. ausschalten Goto Schleife 'Springe zum hauptprogramm Else 'sonst warte weiter auf Empfangsdaten Wend End If End Sub
' ################################################################# ' ######## String einlesen durch Interrupt ' #################################################################
Onrxd: S = S + Chr(udr) + Chr(170) Return
|