PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFM12 Funkmodul Baudrate einstellen



stfan1409
10.12.2011, 19:01
Hallo,
ich habe 2 RFM12 Funkmodule mit dem Code von Elektor getestet. Nun habe ich eine Verständnissfrage zur Baudrateneinstellung.
Wie stellt man die Baudrate für die Funkübertragung ein bzw was muss ich ändern um zb. auf 9600 Baud zu kommen?


'Init
Nsel = 1
Sck = 0
'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V

Freq = 868.300

bzw. hier der ganze Code:

$regfile = "m32def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40

$crystal = 14745600
$baud = 9600


Nsel Alias Portb.4
Sdi Alias Portb.5
Sdo Alias Pinb.6
Sck Alias Portb.7

Dim D As Word
Dim Data_in(10) As Byte
Dim Data_out(10) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Freq As Single

Declare Sub Send_rfm12
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Sub Wait_rfm12
Declare Function Spi16(byval Dout As Word) As Word

Config Nsel = Output
Config Sdi = Output
Config Sck = Output
Config Portc = Output
Porta = &HFF

'Init
Nsel = 1
Sck = 0
'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
D = Spi16(&Hc647) ' 4.8kbps
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V

Freq = 868.300
Freq_rfm12

'start transmitter, no data
'Goto Test1:

'transmit data
'Goto Test2:

'transmit key data
'Goto Test3:

'start receiver, all data
'Goto Test4:

'start receiver, matched data
'Goto Test5:


Do
For N = 1 To 10
Data_out(n) = N
Next N
Send_rfm12
Waitms 500
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
For N = 1 To 10
Print Data_in(n) ; " "
'Print " ";
Next N
Waitms 700
Loop


Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub


Sub Send_rfm12
D = Spi16(&H8238)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
For N = 1 To 10
Wait_rfm12
D = &HB800 + Data_out(n)
D = Spi16(d)
Next N
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&H8208)
End Sub

Sub Wait_rfm12
Nsel = 0
Do
Loop Until Sdo = 1
End Sub


Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 10
Nsel = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Sdo = 1
D = Spi16(&Hb000)
Data_in(n) = D
Next N
Nosignal:
D = Spi16(&H8208)
End Sub


Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function



'transceiver tests

'start transmitter, no data
Test1:
D = Spi16(&H8238)
Do
Loop


'transmit data
Test2:
D = Spi16(&H8238)
Do
Wait_rfm12
D = Spi16(&Hb8aa)
Loop


'transmit key data
Test3:
D = Spi16(&H8238)
Do
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
Loop


'start receiver, all data
Test4:
D = Spi16(&H82c8)
D = Spi16(&Hca87)
For N = 1 To 100
Wait_rfm12
D = Spi16(&Hb000)
Data_in(n) = D
Print Chr(d);
Next N
Do
Loop


'start receiver, matched data
Test5:
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 100
Wait_rfm12
D = Spi16(&Hb000)
Data_in(n) = D
Print Chr(d);
Next N
Do
Loop

markusj
10.12.2011, 21:51
Schon Mal ins Datenblatt des RF12 gesehen? Nein? Solltest du dringend nachholen. Die Codebeispiele sind zwar murks, aber die Registerbeschreibung relativ korrekt. Nimm dir Mal Seite 16, Abschnitt "4. Data Rate Command" vor.

mfG
Markus

stfan1409
11.12.2011, 14:06
ja, in das Datenblatt habe ich bereits gesehen - hat mir aber nicht wirklich weiter geholfen.
Nachdem ich mich mit einem Bekannten zusammengesetzt habe, ist folgendes herausgekommen: (Erklärung falls sich noch einer damit versuchen möchte)

Datenblatt S.14 Punkt 4: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si4420.pdf

Dieser Wert ( D = Spi16(&Hc647) aus Quellcode ) wird so umgerechnet:

&H - deutet auf einen Hexwert hin
C6 - wird nicht weiter erklärt und wird immer benötigt
47 ist der eigentliche Hexwert und ist 71 als Dezimalwert

71 wird nun als Wert für "R" in die Formel aus dem Datenblatt eingesetzt:
(CS wird als Vorteiler benutzt bei Zahlen > HEX 79 dh. Baudrate kleiner 4,3kbps bei Hex kleiner 80 ist CS = 0 ! )

BaudRate = 10000 / 29 / (R+1) / (1+cs*7) [kbps]
BaudRate = 10000 / 29 / (71+1) / (1+0*7) [kbps]

somit steht der Hexwert 47 für eine Übertragung von 4,7893...kbps

HEX 47 = 4,789 kbps
HEX 23 = 9,578 kbps
HEX 11 = 19,1571 kbps
HEX 8 = 38,3142 kbps
HEX 5 = 57,4713 kbps

markusj
11.12.2011, 19:19
Im Allgemeinen ist es eine gute Idee, das Original-Datenblatt zu verwenden. Der RF12 ist wohl eigentlich ein Si4420, das Datenblatt von HopeRF ist aber in der Regel ausreichend. Und speziell die von dir angegebenen Formeln stehen auch in diesem Datenblatt. Die ersten 8 Bits (C6) sind die Kommandosequenz die dem Modul verrät, wie die nachfolgenden Daten zu interpretieren sind. Das nächste Bit ist "cs", die restlichen 7 Bits der Wert "R". Du wirst dir angewöhnen müssen, wirklich an die einzelnen Bits ranzugehen, da in einigen Registern drei und mehr Parameter gespeichert sind.
Wer so nah an der Hardware arbeitet, kommt an der Bitpopelei kaum vorbei. Umrechnungen Binär<->Hexadezimal<->Dezimal sollte man da beherrschen.

mfG
Markus

PICture
11.12.2011, 19:38
Hallo!

Sonst muss man sich leider einen Taschenrechner kaufen, der das schnell umrechnen kann. ;)