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):
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.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
Als Empfänger nutze ich ebenfalls den RFM12S 868Mhz:
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.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"
@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






Zitieren

Lesezeichen