Forum: Mikrocontroller und Digitale Elektronik Problem mit RFM12B


von Pirker (Gast)


Lesenswert?

Hallo!

Ich versuche gerade eine RFM12B Funkstrecke zum laufen zu bringen. 
Leider funzt es nicht und ich bin ratlos!! :-(

Hier mal das Bascom Beispiel von Elektor das ich verwende:

für den Sender:

   Init_rfm12
   Freq = 868.300
   Freq_rfm12

   'Sende key data
   Test3:
      D = Spi16(&H8238)
      Do
         Wait_rfm12
         D = Spi16(&Hb82d)
         Wait_rfm12
         D = Spi16(&Hb8d4)
      Loop


'----------------------------------------------------------------------- 
-------------------------


Sub Init_rfm12
  Nsel = 1
  Sck = 0
  'D = Spi16(&H80d7)                                         ' El , Ef , 
11.5pf, 433 MHz band
  D = Spi16(&H80e7)                                         ' El , Ef , 
11.5pf, 868 MHz band
  D = Spi16(&H82d9)                                         '!er , !ebb 
, Et , Es , Ex , !eb , !ew , Dc
  D = Spi16(&Ha67c)                                         ' 434,15 MHz 
/ 868,3 MHz
  D = Spi16(&Hc647)                                         ' 4.8kbps
  D = Spi16(&H94a0)                                         ' Vdi , Fast 
, 134 kHz , 0db , -79dbm
  D = Spi16(&Hc2ac)                                         ' Al , !ml , 
Dig , Dqd4
  D = Spi16(&Hca81)                                         ' Fifo8 , 
Sync , !ff , Dr
  D = Spi16(&Hc483)                                         ' @pwr , No 
Rstric , !st , !fi , Oe , En
  D = Spi16(&H9850)                                         '9854??' 90 
kHz , power - 0 dB
  D = Spi16(&He000)                                         '
  D = Spi16(&Hc800)                                         '
  D = Spi16(&Hc000)                                         ' 1 MHz , 
2.2V
End Sub

'----------------------------------------------------------------------- 
-------------------------

Sub Freq_rfm12
  If Freq < 800 Then Freq = Freq * 2
  Freq = Freq - 860
  D = Freq / 0.0050
  If D < 96 Then D = 96
  If D > 3903 Then D = 3903
  D = D + &HA000
  D = Spi16(d)
End Sub


Sub Send_rfm12
  D = Spi16(&H8238)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb82d)
  Wait_rfm12
  D = Spi16(&Hb8d4)
  For N = 1 To 10
    Wait_rfm12
    D = &HB800 + Data_out(n)
    D = Spi16(d)
  Next N
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&H8208)
End Sub

Sub Wait_rfm12
  Nsel = 0
  Do
  Loop Until Sdo = 1
End Sub


Sub Receive_rfm12
  Tt = Timeout * 10
  D = Spi16(&H82c8)
  D = Spi16(&Hca83)
  For N = 1 To 10
    Nsel = 0
    T = 0
    Do
      T = T + 1
      Waitus 100
      If T > Tt Then Goto Nosignal
    Loop Until Sdo = 1
    D = Spi16(&Hb000)
    Data_in(n) = D
  Next N
Nosignal:
  D = Spi16(&H8208)
End Sub


Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
  Nsel = 0
  Dsdo = 0
  For Nspi = 1 To 16
    Dspi = Dout And &H8000
    If Dspi = 0 Then
       Sdi = 0
    Else
       Sdi = 1
    End If
    Dout = Dout * 2
    Dsdo = Dsdo * 2
    Dsdo = Dsdo + Sdo
    Sck = 1
    Waitus 5
    Sck = 0
  Next Nspi
  Nsel = 1
  Spi16 = Dsdo
End Function



für den Empfänger:

   Init_rfm12
   Freq = 868.300
   Freq_rfm12

   'start receiver, all data
   D = &H00AA
   Print #2 , Chr(d)

   Wait 1

      Test4:
      D = Spi16(&H82c8)
      D = Spi16(&Hca8b)
      Print #2 , ""
      For N = 1 To 100
        Wait_rfm12
        D = Spi16(&Hb000)
        Data_in(n) = D
        Print #2 , Chr(d)
      Next N
      Do
      Loop


'----------------------------------------------------------------------- 
-------------------------


Sub Init_rfm12
  Nsel = 1
  Sck = 0
  'D = Spi16(&H80d7)                                         ' El , Ef , 
11.5pf, 433 MHz band
  D = Spi16(&H80e7)                                         ' El , Ef , 
11.5pf, 868 MHz band
  D = Spi16(&H82d9)                                         '!er , !ebb 
, Et , Es , Ex , !eb , !ew , Dc
  D = Spi16(&Ha67c)                                         ' 434,15 MHz 
/ 868,3 MHz
  D = Spi16(&Hc647)                                         ' 4.8kbps
  D = Spi16(&H94a0)                                         ' Vdi , Fast 
, 134 kHz , 0db , -79dbm
  D = Spi16(&Hc2ac)                                         ' Al , !ml , 
Dig , Dqd4
  D = Spi16(&Hca81)                                         ' Fifo8 , 
Sync , !ff , Dr
  D = Spi16(&Hc483)                                         ' @pwr , No 
Rstric , !st , !fi , Oe , En
  D = Spi16(&H9850)                                         '9854??' 90 
kHz , power - 0 dB
  D = Spi16(&He000)                                         '
  D = Spi16(&Hc800)                                         '
  D = Spi16(&Hc000)                                         ' 1 MHz , 
2.2V
End Sub

'----------------------------------------------------------------------- 
-------------------------

Sub Freq_rfm12
  If Freq < 800 Then Freq = Freq * 2
  Freq = Freq - 860
  D = Freq / 0.0050
  If D < 96 Then D = 96
  If D > 3903 Then D = 3903
  D = D + &HA000
  D = Spi16(d)
End Sub


Sub Send_rfm12
  D = Spi16(&H8238)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb82d)
  Wait_rfm12
  D = Spi16(&Hb8d4)
  For N = 1 To 10
    Wait_rfm12
    D = &HB800 + Data_out(n)
    D = Spi16(d)
  Next N
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&Hb8aa)
  Wait_rfm12
  D = Spi16(&H8208)
End Sub

Sub Wait_rfm12
  Nsel = 0
  Do
  Loop Until Sdo = 1
End Sub


Sub Receive_rfm12
  Tt = Timeout * 10
  D = Spi16(&H82c8)
  D = Spi16(&Hca83)
  For N = 1 To 10
    Nsel = 0
    T = 0
    Do
      T = T + 1
      Waitus 100
      If T > Tt Then Goto Nosignal
    Loop Until Sdo = 1
    D = Spi16(&Hb000)
    Data_in(n) = D
  Next N
Nosignal:
  D = Spi16(&H8208)
End Sub


Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
  Nsel = 0
  Dsdo = 0
  For Nspi = 1 To 16
    Dspi = Dout And &H8000
    If Dspi = 0 Then
       Sdi = 0
    Else
       Sdi = 1
    End If
    Dout = Dout * 2
    Dsdo = Dsdo * 2
    Dsdo = Dsdo + Sdo
    Sck = 1
    Waitus 5
    Sck = 0
  Next Nspi
  Nsel = 1
  Spi16 = Dsdo
End Function


Wenn ich mir dann die Daten anschaue die der Empfänger übermittelt 
(Filter nur auf &HD4 eingestellt), kommt dann das raus: &H00 &H2d &H00 
&HD4 &H00 .....

Wenn ich den empfänger aber auf &H2DD4 Filter einstelle, übermittelt er 
gar nichts mehr an die Serielle schnittstalle, da er bei Wait_RFM12 
hängen bleibt, weil der Filter nie Syncronisiert.

Was ist da los??? kann mir bitte jemand weiter helfen?!?!

Ich vermute mal, das der Sender nach oder vor jedem Byte nochmals ein 
Byte mit &H00 sendet, aber warum???


MFG Pirker

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.