- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: RFM12 868Mhz Problem beim Empfang

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2008
    Beiträge
    5

    RFM12 868Mhz Problem beim Empfang

    Anzeige

    E-Bike
    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)
    Code:
    ' 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:
    Code:
    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2008
    Beiträge
    5
    Ganz vergessen:

    Ich benutze einmal das Pollin AVR Funk Eval Board (V1.2), da ist schon "ab Werk" kein Optokoppler mehr drauf. Das andere Board ist das normale AVR Eval Board + Addon Board, da hab ich ne Brücke von +5V auf Vcc vom RFM12 gelegt.

    Laufen sollten die Module ja auch, denn ohne Sender bleibt der Empfänger direkt stehen, heisst für mich soviel, dass ne Funkverbindung zwischen beiden besteht. Habe die Baudrate mal auf 9600 runter gedreht, aber immernoch Datenmüll

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: RFM12 868Mhz Problem beim Empfang

    Zitat Zitat von bytie82
    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.
    Ich habe mir jetzt nicht dein ganzes Programm angesehen. Wahrscheinlich hast du ja auch einiges von anderen, getesteten Programmen übernommen, sodass da weniger Gefahr von Fehlern ist.
    Was aber sofort auffällt sind deine ganzen Deklarationen von Subs und Funktionen mit Parametern, die sich teilweise noch gegenseitig wieder mit Parametern aufrufen. Dafür sind deine Stacks und Frame viel zu klein.
    Ohne weitere Analyse würde ich die einfach mal alle auf 100 setzen und sehen, ob der Fehler dann verschwindet.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2008
    Beiträge
    5
    Hi,

    danke für den Tipp. Habs probiert, aber leider mit dem selben Ergebnis.
    Seltsam ist für mich immernoch, dass ich zwar "Müll" empfange, aber der immerhin in den ersten 3/4 komplett unverändert ist, nur das letzte viertel schwankt nach Lust und Laune.

    Also der Code kommt sogar hier ausm RN-Forum und lief bei denjenigen ohne Probleme. Ich habe das ganze lediglich anstatt auf nem mega32 auf nen mega16 gepackt und die Definition des Chips (ganz oben im Code) auf mega16 geändert.
    Die zweite Änderung ist, dass ich kein 433Mhz sondern ein 868Mhz Modul nehme und habe eigentlich dafür alle nötigen Änderungen vorgenommen. Habe das Bit für die Freq. von 80d7 auf 80e7 geändert (stand so in mehreren Foren) und bei der Berechnung der Freq (in der Sub Rf12_setfreq) einmal den wert von 430 auf 860 und von 0.0025 auf 0.0005 geändert.

    Das sollten doch hoffentlich alle Werte sein die angepasst werden müssen, oder hab ich doch noch einen übersehen?

    Danke schonmal vorab für die Hilfe, die Teile machen mich hier noch Wahnsinnig

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi,

    wie ich sehe läuft der Code nicht nur bei mir nicht! Was habe ich bis jetzt herausgefunden:
    * mein RFM wird nicht richtig initialisiert:
    Code:
    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

    * ABER, habe ich das RFM richtig initialsiert, kann ich über :
    Code:
    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 
    
    
    
    und
    
    
    
    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
    Daten senden! Ich weiß nicht warum aber so geht das dann, wenn das jemand herausfinden könnte wäre ich happy.
    MAT

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2008
    Beiträge
    5
    Hi zusammen,

    also nach nochmaligen Tests kann ich sagen, dass ich net mehr weiter weiss

    Ich habe hier aus dem Forum und von bascom-forum.de sämtliche codes durchprobiert, hab sogar den von der ct und einen wo ich die init-bits
    selbst ausgerechnet hab versucht, aber immer das selbe Ergebnis, in der Console nur Datenmüll.

    Der Sender MUSS ok sein, denn der Empfäner scheint die Präambel korrekt zu bekommen, wenn ich sie weglasse hängt der Empfänger bis die ersten 2 richitigen Bits (Präambel halt) ankommen.
    Das kann nur irgendwie mit dem Timingunterschied von mega31 auf mega16 und leermachen vom FIFO auf Empfängerseite zu tun haben.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2008
    Beiträge
    5
    fällt mir grad ein, kann das auch daran liegen, dass ich fsk auf nen pin vom mega16 gelegt und den pin auf high gelegt hab? hab mal auf microcontroller.net gelesen, dass da nen pullup mit 10k auf vcc sein soll, da ich aber keinen hatte hab ich halt nen AVR-Pin genommen. Hat der nen zu hohen Wiederstand? oder kann man das ausschliessen?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests