Forum: Mikrocontroller und Digitale Elektronik RFM12 Sende und Empfangsprobleme


von Philipp K. (philipp_k84)


Lesenswert?

Guten Abend,

mir ist bewusst, dass es schon viele Beiträge zu diesem Thema gibt, aber 
diese haben mir leider nicht weitergeholfen.

Ich verwende 2 RFM12 mit 2 Atmega32.

Da ich mir nicht sicher war ob mein Code Falsch ist habe ich den von 
Bastelbaer aus diesem Forum verwendet, dieser Code funktioniert bei ihm.

Um festzustellen ob die SPI-Funktion korrekt arbeitet, habe ich das 
Statusregister am Anfang ausgelesen, der HEX-Code lautet 4000, was 
bestätigt das kein SPI-Fehler vorliegt.

Desweiteren habe ich das Statusregister während der Senderoutine 
ausgelesen, dort ist das 15 Bit und 13 Bit auf 1, was bedeutet, dass der 
Sender bereit für das Senden ist, aber der Datenstrom abgebrochen ist, 
bzw zu langsam gesendt wurde.

Hier habe ich die Clockfrequenz von SPI auf max gestellt, Quarz statt 8 
MHZ, 10 MHZ verwendet. Leider ohne Erfolg.

Zur weiteren Information, beim Empfänger gibt er mir zuer Empfange und 
dann Nullen über die RS-232 Schnittstelle aus.

Anbei habe ich den Code des Senders, ich habe hier nur ein Unterprogramm 
(Sub) für die Statusabfrage eingefügt sonst keine Änderungen des Codes 
vorgenommen.

Anschluss des RFM12:

uC(Atmega32)   rfm12
pb4(SS)        nSEL
pb5(MOSI)      SDI
pb6(MISO)      SDO
pb7(SCK)       SCK
10K Pullup an  FSK

und Antenne ist 16 cm lang

Hoffe es kann mir jemand weiterhelfen

' 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 = "m32def.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 = 8000000
$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_readys
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Rf12_sta

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.4                                        ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6                                        ' MOSI-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)
  ' Waitms 10
  Wait 1

' Hier ist die Empfangsroutine
 'Print "Empfange"
  'Call Rf12_rxdata(maxchar)
  'For Count = 1 To Maxchar

   'Print Chr(rfdata(count)) ; "-";
  'Next Count
  'Print

 gosub rf12_sta
Loop


End                                                         'end program


' 
########################################################################
' ###### Unterroutinen
' 
########################################################################

Sub Rf12_init:
  Waitms 150
  Gosub Rf12_sta
  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_readys
    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
  While Spi_sdo = 0
  Wend
End Sub

Sub Rf12_sta
       Temp = Rf12_trans(&H0000)
    Print "   "
    Print Hex(temp)
    Print "   "
End Sub

von RFM (Gast)


Lesenswert?

Philipp K. schrieb:
> mir ist bewusst, dass es schon viele Beiträge zu diesem Thema gibt,

Und im Bascom Forum gibts sogar funktionierenden Code für die RFMs.

von Philipp K. (philipp_k84)


Lesenswert?

Ja ich verwende auch einen davon aber es funktioniert troztdem nicht

von RFM (Gast)


Lesenswert?

Philipp K. schrieb:
> ich verwende auch einen davon

Toll, sehr aufschlussreich. Dann nimm die einfach für beide Seiten.

von Philipp K. (philipp_k84)


Lesenswert?

Dieser Code ist für beide Seiten, daher habe ich ja in dieses Forum 
geschrieben da ich Selbst mit dem auslesen des Statusregisters nicht 
mehr weiter komme!

von Verwirrter Anfänger (Gast)


Lesenswert?

Philipp K. schrieb:
> Ja ich verwende auch einen davon aber es funktioniert troztdem nicht

Falls du auf beiden Seiten Beispielcode verwendest, der bei anderen 
funktioniert, würde ich nochmal kontrollieren, ob du tatsächlich mit 
10MHz läufst, und nicht mit 1,25 MHz.

Hast du eine LED, oder etwas ähnliches auf dem Board, die du mit einem 
einfachen Code z.B. im Sekundentakt blinken lassen kannst?

von Philipp K. (philipp_k84)


Lesenswert?

bezüglich der Taktfrequenz:

Der Takt funktioniert korrekt, die Fuses sind am Atmega richtig gesetzt, 
das Funktmodul kann ich auch am CLK in den verschiedenen Frequenzen 
einstellen

eine LED benötige ich nicht, da ich über die RS-232 Schnittstelle ein 
Senden jede Sekunde empfange

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.