Funkbrücke
RFM12 Experimentierboard

In Vorbereitung einer RS232 Funkbrücke wurde auf einem RFM12 Experimentierboard das Zusammenspiel des RFM12 Tranceivermoduls und eines Mega8 erprobt

RFM12 Platine

Die Platine entstand in Kooperation, die Flachantenne eine Eigenentwicklung

 

und ein Bascom Testcode


'#######################################################################
'
'              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

[Funkbrücke]