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:
hierzu kommt noch die include Datei dazu: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
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...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
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







Zitieren

Lesezeichen