bytie82
17.11.2010, 19:31
Hu zusammen,
ich habe ein kleines Problem mit meinem RFM12 Modulen. Ich kann senden was ich will, es kommt auf der Gegenseite immer nur Datenmüll an.
Ich hab nun schon zig Versuche hinter mir, aber seh den Fehler einfach nicht, hoffe ihr könnt mir da weiterhelfen.
Hier mal das Programm (dürften die meisten hier ja eh kennen)
' generated. Take care that the chip supports all fuse bytes.' ################################################## ######################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ################################################## ######################
$regfile = "m16def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 16000000
$baud = 19200
Baud = 19200
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_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Const Rf12freq = 868.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
Config Portd.5 = Output 'LED als Schleifenanzeige
Config Portd.6 = Output 'LED als Schleifenanzeige
Config Portb.3 = Output 'High auf FSK
Portb.3 = 1
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' 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
Dim Text As String * Maxchar At Rfdata Overlay
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
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' Print Chr(rfdata(count)) ; "-";
' Next Count
' Print
Toggle Portd.6
Loop
End 'end program
' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################
Sub Rf12_init:
Waitms 150
Temp = Rf12_trans(&Hc0e0)
Temp = Rf12_trans(&H80e7)
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 - 860.00
Temp = Freq / 0.0005
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)
Toggle Portd.5
Temp = Rf12_trans(&H8238)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb82d)
Rf12_ready
Temp = Rf12_trans(&Hb8d4)
Rf12_ready
For Count = 1 To Maxchar
Rf12_ready
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_ready
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_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
Und hier noch was im Terminal ankommt:
Init
Set Frequenz
Set Bandwith
Set Baudrate
Set Power
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-]-C--y-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A-?-À-—-¯-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-G-û-ü-g-ñ-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A---ñ-Ã-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-7-ç-w-á-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A--ø-->-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-~--;--
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-ÿ-Á---
Empfange
Da die ersten "Zeichen" zumindest immer gleich aussehen und nur das Ende der Empfangenen Daten immer anders aussieht wüsste ich ehrlich gesagt nicht wo ich zuerst nach dem Fehler suchen soll, die Übertragung scheint ja zu klappen, nur wohl die Verarbeitung nicht (meine Einschätzung).
Wäre schön wenn mal jmd. über den Code kucken könnte, irgendwo muss doch nen Fehler drin sein. Habe alle Stellen bei denen es nötig ist auf 868Mhz angepasst, hoffe ich zumindest ;)
ich habe ein kleines Problem mit meinem RFM12 Modulen. Ich kann senden was ich will, es kommt auf der Gegenseite immer nur Datenmüll an.
Ich hab nun schon zig Versuche hinter mir, aber seh den Fehler einfach nicht, hoffe ihr könnt mir da weiterhelfen.
Hier mal das Programm (dürften die meisten hier ja eh kennen)
' generated. Take care that the chip supports all fuse bytes.' ################################################## ######################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ################################################## ######################
$regfile = "m16def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
$crystal = 16000000
$baud = 19200
Baud = 19200
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_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Const Rf12freq = 868.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
Config Portd.5 = Output 'LED als Schleifenanzeige
Config Portd.6 = Output 'LED als Schleifenanzeige
Config Portb.3 = Output 'High auf FSK
Portb.3 = 1
' werden benötigt für rf12_ready
Spi_cs Alias Portb.4 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6 ' 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
Dim Text As String * Maxchar At Rfdata Overlay
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
' Hier ist die Senderoutine
Print "Sende"
Call Rf12_txdata(maxchar)
Wait 1
' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' Print Chr(rfdata(count)) ; "-";
' Next Count
Toggle Portd.6
Loop
End 'end program
' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################
Sub Rf12_init:
Waitms 150
Temp = Rf12_trans(&Hc0e0)
Temp = Rf12_trans(&H80e7)
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 - 860.00
Temp = Freq / 0.0005
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)
Toggle Portd.5
Temp = Rf12_trans(&H8238)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb8aa)
Rf12_ready
Temp = Rf12_trans(&Hb82d)
Rf12_ready
Temp = Rf12_trans(&Hb8d4)
Rf12_ready
For Count = 1 To Maxchar
Rf12_ready
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Next Count
Rf12_ready
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_ready
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub
Und hier noch was im Terminal ankommt:
Init
Set Frequenz
Set Bandwith
Set Baudrate
Set Power
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-]-C--y-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A-?-À-—-¯-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-G-û-ü-g-ñ-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A---ñ-Ã-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-7-ç-w-á-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-A--ø-->-
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-~--;--
Empfange
-Ã-‡-‘---Ù--C-Ã-±---I-Å--q------€-----€-C-ÿ-Á---
Empfange
Da die ersten "Zeichen" zumindest immer gleich aussehen und nur das Ende der Empfangenen Daten immer anders aussieht wüsste ich ehrlich gesagt nicht wo ich zuerst nach dem Fehler suchen soll, die Übertragung scheint ja zu klappen, nur wohl die Verarbeitung nicht (meine Einschätzung).
Wäre schön wenn mal jmd. über den Code kucken könnte, irgendwo muss doch nen Fehler drin sein. Habe alle Stellen bei denen es nötig ist auf 868Mhz angepasst, hoffe ich zumindest ;)