Ok, hab jetzt das Waitms und Enable/Disable rausgemacht!
Hat jedoch keine Besserung gebracht!
Habs jetzt so gemacht:
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
Das funktioniert jetzt!
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
Lesezeichen