- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: RF12 - 433Mhz Funkmodul von Pollin. Fragen zum Code

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    03.06.2010
    Ort
    Deutschland
    Alter
    31
    Beiträge
    13
    Anzeige

    Powerstation Test
    Ist der Interrupt denn zwingend nötig? Wenn wir doch mit einer loop den spi_sdo abfragen, ist das doch ähnlich, oder?



    Das Initialisieren haben wir genauso wie Eisbaeeer gemacht. Ist das eigentlich normal, dass der Wert Temp dann immer den Wert 0 hat?



    Wir haben im Programm außerdem im sub tx_data die statusabfrage gemacht (&H0000) und bekommen komische (zufalls)zahlen zurück, welche aber nur ca. 10 bit groß sind. Leider sind sie immer verschieden. Das ist immerhin der erste Beweis, das die funkmodule wenigstens irgendetwas machen =D> =D>



    Vielleicht liegt der Fehler auch im Anschluss. Wir haben die Module so angeschlossen:

    SDI über 1k an MOSI
    SDO über 1k an MISO
    SCK über 1k an SCK
    nSEL über 1k an SS
    FSK/DATA/nFFS über 10k an VDD
    VDD an +5V
    GND an GND (beide GND's)
    CLK an XTAL1
    ANT an ca. 15cm Draht

    Könnte der Fehler an den 1k's liegen? Aber immerhin bekommen wir bei der statusabfrage eine Zahl zurück, an den anderen Befehlen aber nicht. Das würde ja dagegen sprechen...

    Vielen Dank schonmal [-o<

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi Ihr's,

    leider kann ich dem Fragenstellenden keine Antwort geben aber vielleicht kann uns gemeinsam geholfen werden.

    Also ich versuche nun auch schon seit geraumer Zeit meine RFM12S 868Mhz zum Laufen zu bringen. Erfolge habe ich auch, eine funktionierende Funkbrücke läuft. Nun wollt ich aber nun die Lib, wie Eisbaeeer beschrieben, nutzen. Habe alle wichtigen Variablen an meine Umgebung angepasst. als Sender nutze ich einen Mega128 (Auszüge):
    Code:
    $regfile = "m128def.DAT"
    $crystal = 16000000
    $baud = 38400
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    Const Rf12freq = 868.35                                                         'Kanal-Einstellung
    Const Rf12baud = 19200                                                          'Baudrate
    Const Myadress = 10                                                             'NodeAdress
    Const Snap_sync = &H54
    'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0 , Spiin = 0
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
    
    Spi_cs Alias Portb.0 : Ddrb.0 = 1                           'Config Spi_cs = Output  chipselect
    Spi_sdo Alias Pinb.3                                        ' MISO-PIN
    Set Spi_cs
    Spiinit
    Dim Lv As Byte
    Dim Temp_rfm As Word
    Dim Rf12_data(40) As Byte , Rf12_s As String * 40 At Rf12_data Overlay
    Dim Byteanzahl As Byte , Framelength As Byte , Crclength As Byte                'Anzahl Sendebytes
    'Uart-Variablen
    Dim Rx_data As Byte , N As Byte , Rxd_ready As Bit
    Dim Buffer(40) As Byte , S_buffer As String * 40 At Buffer Overlay
    Goto Startup
    $include "inc_RF12-Treiber.bas"
    Startup:
    Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
    Call Rf12_setfreq(rf12freq)                                                     '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Call Rf12_setbandwith(4 , 1 , 4)                                                '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Call Rf12_setbaud(rf12baud)                                                     '  19200 baud
    Call Rf12_setpower(0 , 6)  
    
    .....
    Print "RFM daten senden "
     Byteanzahl = Rnd(10)                                                           'zum Test zufällige Nutzdatenlänge 0...32Byte
      Rf12_err = 0                                                                  'Error Flag löschen
      Gosub Sendsnapframe
      If Rf12_err = 1 Then
         Print "Timeout beim Senden aufgetreten"                                    'DebugInfo: Problem beim senden
         End If
    Der Code läuft soweit durch, ein Timeout beim Senden bekomme ich nicht. Den Sender auf Funktion kann ich nicht durch ext. Möglichkeiten prüfen.

    Als Empfänger nutze ich ebenfalls den RFM12S 868Mhz:
    Code:
    $regfile = "m644pdef.DAT"
    $crystal = 14745600
    $baud = 57600
    Baud = 57600
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    $lib "glcdKS108.lbx"                                                            'Include the library for the KS-108 controler
    
    '$sim
    
    '------------------------------------------------------------------------------- Grafik LCD
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 0 , Ce2 = 1 , Cd = 2 , Rd = 3 , Reset = 5 , Enable = 4
    Cls
    Setfont Font5x5
    '------------------------------------------------------------------------------- Autoflash über RS232
    Dim Rs232_flash As Byte
    Dim Rs232_str As Byte
    '-------------------------------------------------------------------------------SNAP
    Const Rf12freq = 868.35                                                         'Kanal-Einstellung
    Const Rf12baud = 19200                                                          'Baudrate
    Const Myadress = 20                                                             'Nodeadresse vom Teilnehmer
    Const Snap_sync = &H54                                                          'Synczeichen SNAP-Protokoll
    Const Maxchar = 32
    
    Dim Lv As Byte
    Dim Temp As Word
    Dim Rf12_data(40) As Byte , Rf12_s As String * Maxchar At Rf12_data Overlay
    Dim Rf_rxd As Bit , Rf_sync As Bit
    Dim Ndb As Byte , Framelength As Byte , Crc As Byte
    Dim Byteanzahl As Byte                                                          'Anzahl Sendebytes
    Dim S As String * 10
    Sync Alias Rf12_data(1)
    Hdb1 Alias Rf12_data(2)
    Hdb2 Alias Rf12_data(3)
    Dab1 Alias Rf12_data(4)
    Sab1 Alias Rf12_data(5)
    
    '----------[Hardwaresetup für Pollin Funkboard]---------------------------------------------
    'PortD.3-->INT1 an FFIT --Interrupt(High) wenn FiFO-Buffer voll (ef-Bit set)
    
    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
    ' Achtung je nach µC anpassen !!!
    ' für M8:  Spi_cs Alias Portb.2 :   Spi_sdo Alias Pinb.4          ' SS-Pin
    'M32:
    Config Portb.2 = Input
    Nirq Alias Pinb.2
    Config Portb.1 = Output
    Fsk Alias Portb.1
    Set Fsk
    Spi_cs Alias Portb.4 : Ddrb.4 = 1                                               'Config Spi_cs = Output  chipselect
    Spi_sdo Alias Pinb.6                                                            ' MISO-PIN
    Set Spi_cs
    Spiinit                                                                         'init the spi pins
    Goto Startup
    
    $include "inc_RF12-Treiber.bas"                                                 'RF12 Treiber einbinden
    
    '--------[Initialisierung]------------------------------------------------
    Startup:
    Config Int1 = Rising
    On Int1 Ffit_isr:
    On Urxc Rxd_isr:                                                                'Interrupt Empfange String von RXD
    Enable Urxc                                                                     'Einschalten
    Enable Interrupts                                                               'Zulassen
    
    
    Print "Init RF12 ..."
    Call Rf12_init                                                                  '  ein paar Register setzen (z.B. CLK auf 10MHz)
    Call Rf12_setfreq(rf12freq)                                                     '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
    Call Rf12_setbandwith(4 , 1 , 4)                                                '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
    Call Rf12_setbaud(rf12baud)                                                     '  19200 baud
    Call Rf12_setpower(0 , 6)                                                       '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    Print "Init RF12 Done"
    
    
    '----------[Mainloop]------------------------------------------------------
    Rf12_s = ""
    Gosub Rf12_rxd_on
    
    Do
    '******************************************************************************* 'Automatisches Flashen über RS232
    
    Rs232_flash = Ischarwaiting()
    If Rs232_flash = 1 Then                                                         'wurde was über RS232 empfangen?
       Rs232_str = Inkey()                                                          'Empfangspuffer auslesen
       If Rs232_str = 123 Then                                                      'vom MCS-Programmer geschickte "123" empfangen?
       Goto &HF800                                                                  'Sprungadresse zum Startbereich des Bootloaders
       End If
    End If
    
      If Rf_rxd = 1 Then
          Print "RX ready, Framelength: " ; Framelength
          Gosub Framehandler
          Gosub Rf12_rxd_on
          End If
     'do anything....
    
    
    
      Print "neuer Mainloop"
      Wait 1
    Loop
    End
    
    '----------[Frameverarbeitung SNAP-Protokoll]------------------------------------
    Framehandler:
    
     Print "Frame: ";                                                               'Debugausgabe
     For Lv = 1 To Framelength
          Print Hex(rf12_data(lv)) ; " ";
          Next Lv
     Print
     If Sync = Snap_sync Then                                                       'sync.Zeichen IO?
        If Hdb2 = &H50 Then                                                         '1Byte Adressierung?
           'if HDB2= NDB then                                             '0..32 Datenbyte
               If Dab1 = Myadress Then                                              'Adresse prüfen
                  Print "Das war für mich!...von Nr.:" ; Rf12_data(5)               'Datenverarbeitung
                  Swap Dab1 , Sab1                                                  'Adressen umdrehen für Rücksenden
                  Crc = Framelength - 2                                             'nur temporär Länge für crc-Check
                  Crc = Crc8(rf12_data(2) , Crc)
                  If Crc = Rf12_data(framelength) Then                              'CRC OK?
                     Print "CRC OK! => " ; Crc
                     ' Send ACK (i.e tell master that packet was OK)
                     ' Set ACKs bit in HDB2 (xxxxxx10)
                     Hdb2 = Hdb2 Or &B00000010
                     Hdb2 = Hdb2 And &B11111110
                     'do ...
                     Gosub Senden                                                   'Anwortframe senden--> nur als Slave
                     Gosub Cmd_handler
                     'RF12_data(2 <--- ackno machen
                     Else
                     Print "CRC Bad => " ; Crc
                     ' Send NAK (i.e tell master that packet was bad)
                     ' Set ACK bits in HDB2 (xxxxxx11)
                     Hdb2 = Hdb2 Or &B00000011
                     Gosub Senden                                                   'Anwortframe senden--> nur als Slave
                     End If
                  Else
                  Print "geht mich nix an!...von Nr.:" ; Rf12_data(5)
                  End If
            'else
              'print "Framelength NIO!!!"
              'end IF
           Else
           Print "no 1Byte Adress!!!"
           End If
        Else
        Print "no Syncbyte!!!"
        End If
      Waitms 10
    
    Return
    
    
    
    '------[CMD-Interpreter]-------------------------------------
    Cmd_handler:                                                                    'Auswertung der Nutzdaten.... nur als Denkhilfe :)
    '(
    Select Case Rf12_data(7)
           Case 0 :
           Case 1 : Gosub Rolloaufmachen
           Case 2 : Gosub Rollozumachen
           Case 10 : Gosub Holetemperatur
           End Select
    ')
    For Lv = 1 To 20
                                                                        'mache was...
        Waitms 100
        Next Lv
    Return
    
    
    
    
    '----------[RF12 Empfänger einschalten]---------------------------
    Rf12_rxd_on:
       Lv = 1
       Rf_sync = 0                                                                  'sync-Flag
       Rf_rxd = 0
       Rf12_s = ""
       Framelength = 6                                                              'erst mit 3.Byte kann die Framelänge berechnet werden
       Temp = Rf12_trans(&H82c8)                                                    'Power CMD: Empfänger an, Quarz-clk läuft weiter
       Temp = Rf12_trans(&Hca81)                                                    'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
       Temp = Rf12_trans(&Hca83)                                                    'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
       Enable Int1
    Return
    
    '----------[RF12 Daten Senden]-------------------------------------
    Senden:
    
      ' Waitms 1
      Print "Sende: "
      For Lv = 1 To Framelength
          Print Hex(rf12_data(lv)) ; " ";
          Next Lv
      Call Rf12_txdata(framelength)
      Waitms 10
    
    Return
    
    '----------[Uart ISR(Daten vom PC)]--------------------------------
    Rxd_isr:
      S = S + Chr(udr)
    Return
    
    '----------[INT1 ISR(Daten vom RF12)]--------------------------------
    Ffit_isr:
     Temp = Rf12_trans(&Hb000)
     Temp = Temp And &H00FF
     If Temp = &H54 And Rf_sync = 0 Then                                            'Synchronzeichen empfangen-->an 1 Stelle
        Rf_sync = 1
        Lv = 1
        End If
     Rf12_data(lv) = Temp                                                           'Empfangsbyte in Buffer legen
     If Lv = 3 Then                                                                 'ermitteln der Anzahl Datenbytes (SNAP)
        Ndb = Temp And &H0F                                                         'unteres Nipple von HDB1 enthält Datenlänge
        Select Case Ndb                                                             '6Byte<=sync+HDB2+HDB1+DAB+SAB+CRC
               Case 0 To 8 : Framelength = 6 + Ndb                                  '6-14 (0--8 Datebyte)
               Case 9 : Framelength = 6 + 16                                        '22   (16 Datenbyte)
               Case 10 : Framelength = 6 + 32                                       '38   (32 Datenbyte)
               End Select
        End If
     If Lv >= Framelength Then                                                      'alles eingetroffen
        Rf_rxd = 1                                                                  'Flag setzen und Empfänger abschalten
        Temp = Rf12_trans(&H8208)                                                   'Power_CMD: Empfänger aus, Quarz-clk läuft weiter
        Disable Int1
        End If
     Incr Lv                                                                        'Zeiger incr
    Return
    
    $include "font5x5.font"
    Leider bringt mir der Empfänger keine Informationen. So wie ich es sehe, trifft leider kein Interrupt auf und somit kommt es nicht zur Auswertung.

    @Eisbaeeer:

    Kannst Du mir ein paar Tips geben wie ich weiter machen kann? Im Übrigen sind es die fertigen Cods aus comwebnet.weimars.net/forum.

    DAnke & Gruß MAT

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    27.05.2007
    Beiträge
    67
    Zitat Zitat von Kai.s0r
    Ist der Interrupt denn zwingend nötig? Wenn wir doch mit einer loop den spi_sdo abfragen, ist das doch ähnlich, oder?
    Nein, Interrupt ist nicht nötig, vereinfacht aber die Anbindung ungemein.

    Das Initialisieren haben wir genauso wie Eisbaeeer gemacht. Ist das eigentlich normal, dass der Wert Temp dann immer den Wert 0 hat?
    Wenn Ihr den so initialisiert wie ich, dann habt ihr den Ausgang am RFM12 für Interrupt eingeschaltet.

    @mat-sche
    Hast du vorher auch schon mit dem SNAP-Protokoll gearbeitet (bei deiner Funkbrücke?) oder willst du das jetzt zusätzlich implementieren?

    Mit dem SNAP kannst du ein Master-Slave Netzwerk bauen und gezielt Slaves ansprechen. Dazu ist ToAdress und MyAdress gedacht. Ich kann ja mal über deinen Code drüberschauen. Hier posten oder per Mail.

    Einer meiner RFM12 Nodes kann hier angeschaut werden. Läuft mit dem SNAP-Protokoll. http://weimars.dyndns.org

    Hinter den Kulissen: http://www.weimars.net/index.php/hobby

    Grüße Eisbaeeer

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    03.06.2010
    Ort
    Deutschland
    Alter
    31
    Beiträge
    13
    Hallo,

    wie macht man das denn ohne Interrupts? Bzw was muss man im Programm (also beim Initialisieren) für Zahlen ändern, sodass es auch ohne Interrups funktioniert ? (Kann man das denn dann so einfach ändern und funktioniert das dann :-D, denn es soll langsam endlich mal klappen)

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    27.05.2007
    Beiträge
    67
    Zitat Zitat von Kai.s0r
    Hallo,

    wie macht man das denn ohne Interrupts?
    Das müsstet ihr in den Datenblättern nachseheh. Auf jeden Fall muss die Initialisierung andere Hex-Werte beinhalten. Ich kann euch nochmals nur empfehlen, die Interrupts zu nutzen. Ist um einiges einfacher.

    Gruß Eisbaeeer

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    03.06.2010
    Ort
    Deutschland
    Alter
    31
    Beiträge
    13
    Hallo,

    wir haben uns nun entschlossen es, wie du gesagt hast, mit interrupts zu machen. Was macht der Interrupt denn genau, bzw wann in welchem Fall wird der Interrupt ausgelöst?

    Weiterhin verstehen wir die genaue Funktion des Fifos nicht? Kann uns vielleicht jemand die genau Funktionsweise erklären (nach einiger Zeit im Datenblatt, wissen wir, dass es eine Art Speicher für die Empfangen, bzw die zu sendenden Daten sind, welche man dann irgendwie auslesen kann)

    Abschließend wäre es echt sehr nett von euch, uns zu verraten, welche Pins wir noch zusätzlich anschließen müssen (ich habe oben ja bereits gepostet, was wir bereits angeschlossen haben)

    Ich hoffe einfach, dass ihr uns helfen könnt und wir das Ding endlich ans Laufen bekommen! Gruß

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    fifo steht für first in first out also was zuerst abgespeichert ist/wurde,
    wird auch zuerst wieder ausgelesen. Anders würde z.B. "hallo"
    "ollah" ergeben. Bei C kann ich euch nicht helfen, unter Bascom
    reichen wenige Zeilen um den 05 auszulesen....siehe Beispielcode
    von Robotic Hardware.

    Gruß Richard

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress