Probleme mit RFM12 868Mhz Code und Snap
Hallo liebe Gemeinde,
ich versuche nun schon seit Wochen den Code aus: www.comwebnet.de zum Laufen zu bekommen.
Grundausstattung: mega32 und RFM12 868Mhz
Code 1 als Hauptprogramm:
Code:
$regfile = "m32def.dat"
$hwstack = 100
$swstack = 100
$framesize = 100
$crystal = 14745600
$baud = 57600
'Baud = 57600
'$sim
'------------------------------------------------------------------------------- 2x16 LCD Display an Port c =>Conector
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
Dim Rs232_flash As Byte , Za1 As Byte
Dim Rs232_str As Byte '
Const Rf12freq = 868.35 'Kanal-Einstellung
Const Rf12baud = 9600 'Baudrate
Const Myadress = 20 'Nodeadresse vom Teilnehmer
Const Snap_sync = &H54 'Synczeichen SNAP-Protokoll
Const Maxchar = 22
Declare Sub Rf_cmd(byval Tmp As Word)
Dim Cmd(2) As Byte , Tmpo As Word
Dim Lv As Byte , Readycount As Byte , Count2 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)
Led1 Alias Portb.2
Config Portb.2 = Output
Led2 Alias Portb.3
Config Portb.3 = Output
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Config Portd.5 = Output
Fsk Alias Portd.5
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
Startup:
Config Int1 = Rising
On Int1 Ffit_isr:
'On Urxc Rxd_isr:
Empfange String von RXD
'Enable Urxc
Enable Interrupts
Set Led2
Locate 1 , 1 : Lcd "Init RF12 ..."
Call Rf_cmd(&H0000)
Call Rf_cmd(&Hc0e0)
Call Rf_cmd(&H80e7)
Call Rf_cmd(&H82d8)
Call Rf_cmd(&Hc2ac)
Call Rf_cmd(&Ha686)
Call Rf_cmd(&Hc611)
Call Rf_cmd(&H94a1)
Call Rf_cmd(&Hc2ac)
Call Rf_cmd(&Hc483)
Call Rf_cmd(&H9850)
Call Rf_cmd(&He000)
Call Rf_cmd(&Hc800)
Call Rf_cmd(&Hca81)
Call Rf_cmd(&Hca83)
Call Rf_cmd(&H0000)
Locate 1 , 1 : Lcd "Init RF12 Done"
Reset Led2
Rf12_s = ""
Gosub Rf12_rxd_on
Do
Toggle Led2
Rs232_flash = Ischarwaiting()
If Rs232_flash = 1 Then
Rs232_str = Inkey()
If Rs232_str = 123 Then
Goto &HF800
End If
End If
If Rf_rxd = 1 Then
Locate 2 , 1 : Lcd "RX rdy,Frame " ; Framelength
Gosub Framehandler
Gosub Rf12_rxd_on
End If
'do anything....
'Incr Za1
Print "Za1 " ; Za1
Locate 3 , 1 : Lcd "neuer Mainloop " ; Za1
Print "Lv " ; Lv
' Wait 1
Loop
End
Sub Rf_cmd(byval Tmpo As Word)
Cmd(2) = Tmpo And 255
Shift Tmp , Right , 8
Cmd(1) = Tmpo
Spiout Cmd(1) , 2
End Sub
Framehandler:
Set Led1
Locate 1 , 1 : Lcd "Frame: ";
For Lv = 1 To Framelength
Print Hex(rf12_data(lv)) ; " ";
Next Lv
Print
Print "Sync alias RF_Data(1) " ; Sync
If Sync = Snap_sync Then
If Hdb2 = &H50 Then
'if HDB2= NDB then
If Dab1 = Myadress Then
Swap Dab1 , Sab1
Crc = Framelength - 2
Crc = Crc8(rf12_data(2) , Crc)
If Crc = Rf12_data(framelength) Then
Locate 1 , 1 : Lcd "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
Locate 1 , 1 : Lcd "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
Locate 1 , 1 : Lcd "geht mich nix an!...von Nr.:" ; Rf12_data(5)
End If
'Else
'Print "Framelength NIO!!!"
'End If
Else
Locate 1 , 1 : Lcd "no 1Byte Adress!!!"
End If
Else
Locate 1 , 1 : Lcd "no Syncbyte!!!"
End If
Waitms 10
Reset Led1
Return
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
Toggle Led2 'mache was...
Waitms 100
Next Lv
Return
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)
Print "rf12_rxd_on "
Enable Int1
Return
Senden:
Set Led2
' Waitms 1
Locate 2 , 1 : Lcd "Sende: "
For Lv = 1 To Framelength
Print Hex(rf12_data(lv)) ; " ";
Next Lv
Call Rf12_txdata(framelength)
Waitms 10
Reset Led2
Return
Rxd_isr:
S = S + Chr(udr)
Return
')
Ffit_isr:
Incr Za1
Temp = Rf12_trans(&Hb000)
Temp = Temp And &H00FF
If Temp = &H54 And Rf_sync = 0 Then
Rf_sync = 1
'Lv = 1
End If
Rf12_data(lv) = Temp
'Locate 1 , 1 : Lcd "RF12Dat " ; Rf12_data(lv)
If Lv = 3 Then
Ndb = Temp And &H0F
Select Case Ndb
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)
Disable Int1
End If
Incr Lv 'Zeiger incr
Return
hierzu kommt noch die include Datei dazu:
Code:
Declare Sub Rf12_init()
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 Txlen As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Function Rf12_trans(byval Wert As Word) As Word
Dim Rf12_timeout As Word
Dim Rf12_err As Byte
Dim Rf12_status As Word
'------[Sende Daten]-------------------
Sub Rf12_txdata(byval Txlen As Byte)
Temp = Rf12_trans(&H8238) : Rf12_ready
Temp = Rf12_trans(&H8230) : Rf12_ready
Temp = Rf12_trans(&H0000) : Rf12_ready
Rf12_status = Temp
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble
Temp = Rf12_trans(&Hb8aa) : Rf12_ready 'Preamble in FIFO schieben
Temp = Rf12_trans(&Hb82d) : Rf12_ready 'Startzeichen: 2D für den Empfänger
Temp = Rf12_trans(&Hb8d4) : Rf12_ready 'Startzeichen: D4 für den Empfänger
Print "sende1"
For Lv = 1 To Txlen
Rf12_ready
Temp = &HB800 + Rf12_data(lv)
Temp = Rf12_trans(temp)
'Toggle Led2
'Print "temp" ; Temp
Next Lv
Temp = Rf12_trans(&Hb8aa) : Rf12_ready
Temp = Rf12_trans(&H8208) : Rf12_ready
Temp = Rf12_trans(&H8209) : Rf12_ready
Print "sende2"
End Sub
'------[Empfange Daten]---------------
Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&H0000)
Rf12_status = Temp
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Lv = 1 To Maxchar
Rf12_ready :
Temp = Rf12_trans(&Hb000)
Rf12_data(lv) = Temp
Next Lv
Temp = Rf12_trans(&H8208)
Temp = Rf12_trans(&H8209)
Rf12_data(40) = 0
End Sub
'------[SPI Busroutinen]----------------
Function Rf12_trans(byval Wert As Word) As Word
Local Lowbyte As Byte
Local Highbyte As Byte
Lowbyte = Low(wert) : Highbyte = High(wert)
Reset Spi_cs
Highbyte = Spimove(highbyte) : Lowbyte = Spimove(lowbyte)
Set Spi_cs
Temp = Makeint(lowbyte , Highbyte)
Rf12_trans = Temp
End Function
'------[Busy check]-----------------------
Sub Rf12_ready
Rf12_timeout = 50000
Reset Spi_cs RF12
While Spi_sdo = 0
If Rf12_timeout > 0 Then
Decr Rf12_timeout
Else
Rf12_err = 1
Exit While
End If
Waitus 20
Wend
End Sub
'------[INIT]-------------------------------------
Sub Rf12_init()
Waitms 150
Temp = Rf12_trans(&H0000) ': print Temp '0000 -Status
Temp = Rf12_trans(&Hc0e0) ': print Temp 'C0E0 -Clock Output 10MHz
Temp = Rf12_trans(&H80e7) ': print Temp '80D7 -Datareg used,FIFO enabled,433MHz,CL=15pF
Temp = Rf12_trans(&Hc2ab) ': print Temp 'C2AB -Datafilter:Autolock-slow mode-Digital Filter,f1=1;f0=1
Temp = Rf12_trans(&Hcaf3) ': print Temp 'CA81 -FIFO/ResetMode (Brownoutdektion ausgeschaltet)
Temp = Rf12_trans(&He000) ': print Temp 'E000 -WakeUP Timer
Temp = Rf12_trans(&Hc800) ': print Temp 'C800 -LowDuty Cycle
Temp = Rf12_trans(&Hc4f7) ': print Temp 'C4F7 -AFC-command -eingeschaltet
Temp = Rf12_trans(&Hc2ac) 'data filter:
Temp = Rf12_trans(&Hc483) 'AFC:
Temp = Rf12_trans(&H9850) 'TX control
Temp = Rf12_trans(&He000) 'wake-up
Temp = Rf12_trans(&Hc800) 'low duty-cycle
Temp = Rf12_trans(&Hca81) 'Reset FIFO
Temp = Rf12_trans(&Hca83) 'enable FIFO
Temp = Rf12_trans(&H0000)
Temp = Rf12_trans(&H0000)
Temp = Rf12_trans(&Hc0e0)
Temp = Rf12_trans(&H80e7)
Temp = Rf12_trans(&H8200)
Temp = Rf12_trans(&Hc2ac)
Temp = Rf12_trans(&Ha686)
Temp = Rf12_trans(&Hc611)
Temp = Rf12_trans(&H94a1)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hc483)
Temp = Rf12_trans(&H9852) '
Temp = Rf12_trans(&He000)
Temp = Rf12_trans(&Hc800)
End Sub
Sub Rf12_setfreq(byval Freq As Single)
Freq = Freq - 860.00
Temp = Freq / 0.0050
If Temp < 96 Then
Temp = 96
Elseif Temp > 3903 Then
Temp = 3903
End If
Temp = Temp + &HA000
Temp = Rf12_trans(temp) 'Axxx - Frequenzsetting (Kanal Einstellung)
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) 'Revicer Control Command (Pin20 VDI output)
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
'------[Sendeleistung einstelllen]-----------------
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
Mein Problem ist, dass ich die Ersten 2 Byte von dem Frame empfangen kann und dann ist Schluss. Irgend wie wird die Int-ISR nicht mehr angesprungen, aus welchem Grunde auch...
Nutze ich einen anderen Code kann ich ohne Probleme die Datenpakete empfangen.
Hat nun jemand von Euch ein RFM12 im 868Mhz Bereich mit Interruptabfrage als Empfänger/Sender am Laufen?
Hilfe... ich verzweifle nun langsam.
Gruß MAT
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Mat
Ich wollte gerade dein Programm mal testen, da ist mir aufgefallen, das du ein anderes Pollin Board haben mußt. Ich habe das Funk AVr Board.
Ich muß das erst anpaasen zum testen.
Ich habe den Code aus dem Nachbarforum genommen. www.Bascom-Forum.de unter Codebeispiele.
Das größte Problem was ich bis jetzt hatte, das man die Daten schnell genug abholen muß, sonst kommt der INT nicht mehr. Ist aber in den Griff zu bekommen.
Hier mal ein Bild beim empfanen des ersten bytes
MFG
Dieter
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Mat
Ich habe dein Programm mal soweit angepaßt und getestet.
Code:
'Empfang von Daten mit Pollin RFM AVR Funkboard
'angeschlossen wie auf dem Board
'Empfang über fallende Flanke an INT0
'basiert auf dem Code von "Holli" aus dem http://bascom-forum.de/
'geändert und angepaßt von Dino DIeter 26.10.2010
'Status: läuft
'Sender steht ca 8 m entfernt hinter dicken Mauern und sendet alle 2 Sekunden
' 32 Bytes
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 50
$framesize = 50
$crystal = 12000000
$baud = 57600
Baud = 57600
'Nsel Alias Portb.2
'Clk Alias Portb.5
'Mosi Alias Portb.3
'Miso Alias Pinb.4
Config Portd.2 = Input
Nirq Alias Pind.2
Config Portd.3 = Input
Ffit Alias Pind.3
Led2 Alias Portd.5
Config Portd.5 = Output 'LED zur Kontrolle
Led1 Alias Portd.6
Config Portd.6 = Output 'LED zur Kontrolle
Dim Taste As Byte
Dim Fifo(2) As Byte
Dim A As Byte
'Hardware einstellen
Config Com1 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 64 , Noss = 0 , Spiin = &HB0
'Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = Portb.2 , Clock = Portb.5 , Spiin = 0
'init the spi
Spiinit
'Interrupt 0 einstellen
Config Int0 = Falling
On Int0 Ffit_isr
Waitms 100
'$include "inc_RF12-Treiber.bas" brauchen wir nicht
Declare Sub Rf_init()
Declare Sub Rf_cmd(byval Wert As Word)
Declare Sub Rf12_rxd_off()
Declare Sub Rf12_rxd_on()
Declare Sub Framehandler()
'Definition von Konstanen
Const Rf12freq = 868.35 'Kanal-Einstellung
Const Rf12baud = 9600 'Baudrate
Const Myadress = 20 'Nodeadresse vom Teilnehmer
'Const Snap_sync = &H54 'Synczeichen SNAP-Protokoll
Const Snap_sync = &H31 'Synczeichen
Const Maxchar = 22
'const HDB2_ = &H50
Const Hdb2_ = &H32
Const Sync_byte = &H31
Const My_adress = &H34
Const Recive_buffer_size = 40
Dim Cmd(2) As Byte , Tmpo As Word
Dim Lv As Byte , Readycount As Byte , Count2 As Byte
Dim Temp As Word
Dim Tmp As Word
Dim Rs232_flash As Byte , Za1 As Byte
Dim Rs232_str As Byte '
Dim Ndb As Byte , Framelength As Byte , Crc As Byte
Dim Byteanzahl As Byte 'Anzahl Sendebytes
Dim S As String * 10
Dim Rf12_data(recive_buffer_size) As Byte , Rf12_s As String * Maxchar At Rf12_data Overlay
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)
Dim Rf_rxd As Bit , Rf_sync As Bit
Set Led1
'RFM 12 einstellen auf senden erstmal
Call Rf_init()
Reset Led1
Enable Interrupts
Enable Int0
'Array löschen
Rf12_s = ""
'Endlosschleife
Do
'nur zum debuggen
Taste = Inkey()
If Taste = "a" Then
Call Rf_cmd(&H0000) 'read status
Call Rf_cmd(&Hca81) 'Reset FIFO
Call Rf_cmd(&Hca83) 'enable FIFO
End If
If Taste = "x" Then
'Empfänger an
Call Rf12_rxd_on:
End If
If Taste = "c" Then
'Empfänger aus
Call Rf12_rxd_off:
End If
'empfangenes Frame auswerten
If Rf_rxd = 1 Then
Rf_rxd = 0
Call Framehandler()
End If
Loop
'Befehl zum RFM senden geändert Dino Dieter
Sub Rf_cmd(byval Wert As Word)
Cmd(2) = Wert And 255
Shift Wert , Right , 8
Cmd(1) = Wert
Spiout Cmd(1) , 2
End Sub
'Einstellen des RFM 12
Sub Rf_init()
Call Rf_cmd(&H0000) 'Read Status
Call Rf_cmd(&Hc0e0) 'low battery, clock 10 MHz
Call Rf_cmd(&H80e7) 'Configuration: 868MHzband, 12pf, enable FIFO
Call Rf_cmd(&H82d8) 'power management: enable receiver, enable clock output
Call Rf_cmd(&Hc2ac) 'data filter command
Call Rf_cmd(&Ha686) 'Frequency: 868,35MHz
Call Rf_cmd(&Hc611) 'Datarate: 19,2 kbit
Call Rf_cmd(&H94a1) 'receiver setting: 134kHz, -97dbm
Call Rf_cmd(&Hc2ac) 'data filter:
Call Rf_cmd(&Hc483) 'AFC:
Call Rf_cmd(&H9850) 'TX control
Call Rf_cmd(&He000) 'wake-up
Call Rf_cmd(&Hc800) 'low duty-cycle
Call Rf_cmd(&Hca81) 'Reset FIFO
Call Rf_cmd(&Hca83) 'enable FIFO
Call Rf_cmd(&H0000) 'read Status
End Sub
Sub Framehandler() 'habe ich mir nicht angeschaut
Set Led2
'Print "Frame: ";
'For Lv = 1 To Framelength
' Print Hex(rf12_data(lv)) ; " ";
' Next Lv
Print "Sync alias RF_Data(1) " ; Sync
If Sync = Snap_sync Then
If Hdb2 = Hdb2_ Then
'if HDB2= NDB then
If Dab1 = Myadress Then
Swap Dab1 , Sab1
Crc = Framelength - 2
Crc = Crc8(rf12_data(2) , Crc)
If Crc = Rf12_data(framelength) Then
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
Reset Led2
End Sub
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
Toggle Led2 'mache was...
Waitms 100
Next Lv
Return
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
Call Rf_cmd(&H0000) 'Status lesen
Call Rf_cmd(&Hca81) 'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
Call Rf_cmd(&Hca83) 'FIFO&Reset CMD: Synchroner Zeichenemfang (warte auf Startzeichen: 2DD4)
' Print "rf12_rxd_on "
Enable Int0
Return
Rf12_rxd_off:
Call Rf_cmd(&H0000) 'Status lesen
Call Rf_cmd(&Hca81) 'FIFO&Reset CMD: sensitiver Reset aus (Brownout)
' Print "rf12_rxd_off "
Disable Int0
Return
Senden: 'habe ich mir nicht angeschaut Dino Dieter
Set Led2
' Waitms 1
' Locate 2 , 1 : Lcd "Sende: "
For Lv = 1 To Framelength
Print Hex(rf12_data(lv)) ; " ";
Next Lv
' Call Rf12_txdata(framelength)
Waitms 10
Reset Led2
Return
Rxd_isr:
S = S + Chr(udr)
Return
'Interrupt Routine zum empfangen der bytes aus dem RFM 12
Ffit_isr:
Set Led1 ':zum debuggen für LA
Reset Led1
Spiin Fifo(1) , 2 '1 Byte lesen
Temp = Fifo(2)
If Temp = Snap_sync And Rf_sync = 0 Then
Rf_sync = 1
Lv = 1
Framelength = 6
End If
If Lv = 3 Then
Ndb = Temp And &H0F 'Anzahl Datenbytes berechnen
Ndb = 9 'zum debuggen
Select Case Ndb
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)
'Case 11 : Framelength = 6 + 64 '70 (64 Datenbyte)
End Select
End If
If Lv >= Framelength And Rf_sync = 1 Then 'alles eingetroffen
Rf_rxd = 1 'Flag setzen und Empfänger zurück setzen
Rf_sync = 0
Call Rf_cmd(&H0000) 'read status
Call Rf_cmd(&Hca81) 'Reset FIFO wir warten wieder auf SYNC vom RFM 12
Call Rf_cmd(&Hca83) 'enable FIFO
End If
Rf12_data(lv) = Temp
Incr Lv
' Überlauf abgefangen , passend zum Empfangsbuffer
If Lv >= Recive_buffer_size Then
'Überlauf
Rf_sync = 0
Lv = 1
Rf12_s = "" 'buffer löschen
End If
Return
End
Das erste Problem, welches mir schnell aufgefallen war, ist die Sub Rf_cmd(byval Wert As Word) . Die hat nur Nullen gesendet. Nach Änderung der Variable ( temp0 oder so ) ging die SUB. Wieso, keine Ahnung.
So mal, ob du das so ans laufen bekommst.
Im Anhang noch eine Datei. Lade dir bei http://www.saleae.com/downloads/ mal die Software runter. Dann solttest du das File öffnen könne. Der Rest erklärt sich dann.
MFG
Dieter
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Matthias
Schön das es jetzt geht.
Clockrate = 64 gibt den Takt der SPI an . Taktfrequenz des AVr / 64 = ??
Spiin = &HB0 wir müssen ja, wenn wir Daten lesen wollen in dem ersten Byte &hB0 übergeben, das wird damit angegeben. Ansonsten würde die SPI nur &H00 ausgeben.
Bei höheren Übertragungsgeschwindigkeiten, mußt du den SPI Takt mit einer kleineren Clockrate hochsetzen, sonst kommt es zu Aussetzern. Bis ca 20 MHz SPI Clock sollte es gehen.
MFG
Dieter