Ok, hab jetzt das Waitms und Enable/Disable rausgemacht!
Hat jedoch keine Besserung gebracht!
Habs jetzt so gemacht:
Das funktioniert jetzt!Code:' ########################################################################################################################################## ' ### generated. Take care that the chip supports all fuse bytes ### ' ### RF12-Test in Bascom ### ' ### Basiert auf Code von Benedikt K. ### ' ### Joachim Fossie Bär Reiter 04/2007 ### ' ### weiterentwickelt von: ### ' ### Wigbert Picht 18.06. ### ' ### Stringkennung 24.08 ### ' ### Hardware siehe Pollinboard ### ' ########################################################################################################################################## ' ### ### ' ### RFM12 Master ### ' ### --------------- ### ' ########################################################################################################################################## $regfile = "m32def.dat" $hwstack = 100 ' default use 32 for the hardware stack $swstack = 100 'default use 10 for the SW stack $framesize = 100 '$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes. $crystal = 16000000 'Hier Dein Quarz $baud = 19200 Baud = 19200 Declare Sub Rf12_init Declare Function Rf12_trans(byval Wert As Word) As Word 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 Maxchar As Byte) Declare Sub Rf12_rxdata(byval Maxchar As Byte) Declare Sub Sendetext Const Rf12freq = 433.92 Const Rf12baud = 19200 Const Maxchar = 32 'config the SPI in master mode.The clock must be a quarter of the slave cpu ' Hier ggf. den SoftSPI reinmachen 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 Spi_cs Alias Portb.4 Config Spi_cs = Output Spi_sdo Alias Pinb.6 Set Spi_cs 'init the spi pins Spiinit ' was so gebraucht wird ' Kennung Dim Count As Byte Dim Temp As Word Dim Rfdata(32) As Byte Dim Text As String * Maxchar At Rfdata Overlay 'Dim Text As String * Lean At Rfdata Overlay 'Text mit variabler Länge Dim Laenge As Byte Dim Lean As Byte Dim La As Byte Dim L As Byte Dim C As Byte Dim Empf_wait As Byte Dim Rufzeichen As String * 32 Dim Sendedata As String * 32 Dim Ruf As String * 32 Dim Flag_int0_input As Byte Flag_int0_input = 0 Config Portc.7 = Output Portc.7 = 1 Config Portc.0 = Output Portc.0 = 1 Print "Init" Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz) Print "Set Frequenz" Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen Print "Set Bandwith" Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm Print "Set Baudrate" Call Rf12_setbaud(rf12baud) ' 19200 baud Print "Set Power" ' 1mW Ausgangangsleistung, 120kHz Frequenzshift Call Rf12_setpower(0 , 6) Config Pind.2 = Input Portd.2 = 0 Config Int0 = Rising Enable Int0 On Int0 Isr_von_int0 'Disable Int0 Config Timer2 = Timer , Prescale = 256 Timer2 = 156 Enable Timer2 On Timer2 Isr_von_timer2 Enable Interrupts ' ######################################################################## ' ###### Hauptproggi #################################################### ' ######################################################################## ' Rufzeichen Rufzeichen = "Christoph" 'mein Rufzeichen oder sonst ein String 'mit Timer ' ######################################################################### Sendetext 'Sub Stringverarbeitung zum Datenpaket 'später in Schleife ' ######################################################################### 'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}" ' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren Do If Flag_int0_input = 1 Then Flag_int0_input = 0 Call Rf12_rxdata(maxchar) If Text = "Hallo" Then Text = "return" Call Rf12_txdata(maxchar) Text = "" Else Text = "wrong" Call Rf12_txdata(maxchar) Text = "" End If End If Loop End 'end program ' ######################################################################## ' ###### Unterroutinen ' ######################################################################## Sub Rf12_init: Waitms 150 Temp = Rf12_trans(&Hc0e0) Temp = Rf12_trans(&H80d7) Temp = Rf12_trans(&Hc2ab) Temp = Rf12_trans(&Hca81) Temp = Rf12_trans(&He000) Temp = Rf12_trans(&Hc800) Temp = Rf12_trans(&Hc4f7) End Sub Sub Rf12_setfreq(byval Freq As Single) Freq = Freq - 430.00 Temp = Freq / 0.0025 If Temp < 96 Then Temp = 96 Elseif Temp > 3903 Then Temp = 3903 End If Temp = Temp + &HA000 Temp = Rf12_trans(temp) 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) 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 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 '########################## Sub Sendetext 'Aufbereitung des Text="Teststring" Sendedata = Rufzeichen 'welcher String gebraucht wird Laenge = Len(sendedata) Lean = Laenge + 3 La = Laenge + 52 '50 Bei Empfänger subtrahieren-um bei Print Steuerzeichen zu umgehen Ruf = Chr(la) + Sendedata C = Checksum(ruf) Text = Ruf + Chr(c) Text = Text + " " 'Print Text 'Testprint 'Print L ; Sendedata ; C; 'Testprint End Sub '########################## Sub Rf12_txdata(byval Maxchar As Byte) 'Disable Int0 Temp = Rf12_trans(&H8238) Rf12_ready Temp = Rf12_trans(&Hb8aa) Rf12_ready Temp = Rf12_trans(&Hb8aa) Rf12_ready Temp = Rf12_trans(&Hb8aa) Rf12_ready Temp = Rf12_trans(&Hb82d) Rf12_ready Temp = Rf12_trans(&Hb8d4) Rf12_ready 'For Count = 1 To Lean 'Veriable Länge duch Stringberechnung For Count = 1 To Maxchar Rf12_ready 'hier kann das gesendete Datenpaket eingesehen werden 'Print Rfdata(count) ; "-"; Temp = &HB800 + Rfdata(count) Temp = Rf12_trans(temp) Next Count Rf12_ready Temp = Rf12_trans(&H8208) 'Enable Int0 End Sub Sub Rf12_rxdata(byval Maxchar As Byte) 'Disable Interrupts Temp = Rf12_trans(&H82c8) Temp = Rf12_trans(&Hca81) Temp = Rf12_trans(&Hca83) For Count = 1 To Maxchar Rf12_ready Temp = Rf12_trans(&Hb000) Rfdata(count) = Temp Next Count Temp = Rf12_trans(&H8208) 'Enable Interrupts End Sub Function Rf12_trans(byval Wert As Word) As Word Local Lowbyte As Byte Local Highbyte As Byte Lowbyte = Wert And 255 Shift Wert , Right , 8 Reset Spi_cs Highbyte = Spimove(wert) Lowbyte = Spimove(lowbyte) Set Spi_cs Temp = Highbyte * 256 Temp = Temp + Lowbyte Rf12_trans = Temp End Function Sub Rf12_ready Reset Spi_cs While Spi_sdo = 0 'In der Sim. auf 1 stellen Wend End Sub '############################################################################### Isr_von_int0: Toggle Portc.7 Flag_int0_input = 1 Return Isr_von_timer2: Timer2 = 156 Call Rf12_rxdata(maxchar) Return
Da ich in meinem anderen Code, der auf dem Roboter läuft, auch einen Timer-Interrupt mit ähnlicher Häufigkeit habe, brauche ich dafür auch keinen extra Timer! Das ganze ist zwar nicht sehr elegant, aber da ich mich jetzt schon seit 2 Wochen damit herumplage, lasse ich es jetzt so, bis mir jemand eine andere, elegantere Lösung sagen kann :-D
Gruß
Chris







Zitieren

Lesezeichen