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
Lesezeichen