RFM02 Konfiguration

OP (Firma: keine) #1402458
Lesenswert?

Hallo,

ich hab mich seit Tagen mit diesem Modul beschäftigt und hab es einfach 
nicht zum laufen gebracht,

vllt kann mir einer mal helfen.

Anschlussplan:

ATmega 8                   RFM02
SCK                        SCK
MOSI                       SDI
MISO                       n.a.
SS(PortB.2)                nSel
Power(PortB.1)             VCC

das Bascom-Programm:

$regfile = "m8def.dat"
$crystal = 3686411
$baud = 9600

Ddrb = &B11111111
Spcr = &B01010001

Declare Function Spisend(byval Spibyte As Word) As Byte

Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim Data1 As Byte
Dim Data2 As Byte
I = 0




Do


Portb = &B00000110

Waitms 10
Print "Starte Configuration"

K = Spisend(&H8f00)       10 Mhz , 8.5 Pf
K = Spisend(&Hc09         Ex = 1,es=1,ea =0, eb=0, et=0,dc=0, a1=1, a0=0
K = Spisend(&Ha640)       434 MHZ Frequenz
K = Spisend(&Hc809)       34,48 kbps
K = Spisend(&Hb2)         -6DB
K = Spisend(&Hc220)       dwc=1, ebs=1
K = Spisend(&Hc6)         Data Transmit Command


Print "Sende Preamble"

K = Spisend(&Haa)
K = Spisend(&Haa)
K = Spisend(&Haa)
K = Spisend(&H2d)
K = Spisend(&Hd4)

Print "Sende Daten"

K = Spisend(10)
Waitms 1
K = Spisend(11)

K = Spisend(&Hc001)

Print "Erfolgreich Gesendet"

Portb = &B00000000

Loop

Function Spisend(byval Spibyte As Word) As Byte
Spdr = Spibyte
End Function
OP (Firma: keine) #1414245
Lesenswert?

sry das ich mich jetzt erst wieder melde,

habe die byte's durch word's ersetzt, und bei der SPI Funktion habe ich 
noch

Do:Loop Until SPSR.SPIF=1 eingefügt.

zudem hab ich die SPI-Funktion mittels 2 AVR auf Funktion überprüft, 
dass es nun an der SPI-Funktion liegt kann ich aussließen,

glaube eher das es an den einzustellenden Hexzahlen liegt oder an der 
Reihenfolge.
OP (Firma: keine) #1689036
Lesenswert?

sry das ich mich erst jetzt wieder melde, habe aber den sender soweit 
ich das überprüfen kann zum laufen gebracht, bin jetzt am empfänger 
dran.

wie du unten sehen wirst habe ich die word's wieder durch bytes ersetzt 
und eben dann 2 bytes gesendet, da das spi interface (SPDR) nur 1 byte 
speicherkapazität hat.

da ich im forum nicht über dem rfm02 finde stell ich mal den code rein

Atmega8             RFM02
SCK                 SCK
MOSI                SDI
Portb.1             FSK
Portb.2             nsel
INT 0               nirq



$regfile = "m8def.dat"
$crystal = 3686411
$baud = 115200

Ddrd = &B10000000
Ddrb = &B11101111

Portd = &B00000100

Mcucr = &B00000010

Spcr = &B01010000
Sreg.7 = 1

Declare Function Spisend(byval Spibyte As Byte) As Byte
Declare Function Fsksend(byval Data1 As Byte) As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte



Do
Portb.2 = 1
waitms 100
Portb.2 = 0
'Initialisierung'

Print "Intitialisierung"

K = Spisend(&B11001100)
K = Spisend(&B00000000)

K = Spisend(&B10001011)
K = Spisend(&B01100010)

K = Spisend(&B10100110)
K = Spisend(&B01000000)

K = Spisend(&B11001000)
K = Spisend(&B01000111)

K = Spisend(&B11000010)
K = Spisend(&B00100000)

K = Spisend(&B11000000)
K = Spisend(&B00000001)

'Starte Übertragung'

K = Spisend(&B11000000)
K = Spisend(&B00111001)

'Über FSK daten Senden'

Print "Daten Übertragen"

K = Fsksend(&B10101010)
K = Fsksend(&B10101010)
K = Fsksend(&B10101010)

K = Fsksend(&B00101101)

K = Fsksend(&B11010100)

K = Fsksend(25)

K = Fsksend(&B10101010)

'Alles Schließen'

K = Spisend(&B11000000)
K = Spisend(&B00000001)

Portb.2 = 1

Print "Senden beendet"

Loop

Function Spisend(byval Spibyte As Byte) As Byte
Spdr = Spibyte
Do : Loop Until Spsr.spif = 1
Spisend = Spdr
End Function

Function Fsksend(byval Data1 As Byte) As Byte
J = 7
For I = 0 To 7
Do : Loop Until Gifr.6 = 1
If Data1.j = 1 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
J = J - 1
Gifr.6 = 1
Next I
Portb.1 = 0
End Function

Spisend = Spdr könnte man zugar weglassen da man vom slave nichts 
empfängt
Gast #1689216
Lesenswert?

Moin Philipp,

ich habe hier seit gut 3 Monaten einen RFM02 im Dauerbetrieb. Den Code 
hänge ich mal an.

Ist sicher nicht der Gipfel der Eleganz und noch weit weg von fertig, 
aber er funktioniert. Vielleicht nutzt es...
1
'****************************************************************************
2
'Sendeprogramm für RFM02
3
'Autor:      Ralph Fischer
4
'Grundlage:  Fundstücke im Netz, Brain 0.9b
5
'Hardware:   Testaufbau auf Lochraster
6
'Controller: Mega8/16
7
'Stand:      26.12.2009
8
'Version:    0.43 Power save added (Controller)
9
'                 Checksum added
10
'            0.42 Power save added (RFM02)
11
'                 External controller clock from RFM02
12
'            0.41 10 byte protocol added
13
'                 Humidity measurement added
14
'            0.40 FSK auf PinB.0
15

16
'****************************************************************************
17

18

19
'*************************
20
'System
21
$regfile = "m8def.dat"
22
$hwstack = 32
23
$swstack = 108
24
$framesize = 120
25

26
$crystal = 1000000
27
$baud = 19200
28
Baud = 19200
29
'*************************
30

31
'*************************
32
'Konfigurationen
33
Config Portb.2 = Output                                     'NSEL
34
Config Pind.2 = Input                                       'NIRQ von RFM02
35
Config Portb.0 = Output                                     'FSK
36
Config Portd.7 = Output                                     'LED
37
Config Portb.3 = Output                                     'MOSI -> SDI
38
Config Portc.0 = Output                                     'Trigger
39

40
Config Int0 = Rising
41
On Int0 Set_nirq
42

43
Enable Interrupts
44
Disable Int0
45

46
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0
47

48

49
'*************************
50

51

52
'*************************
53
'Deklarationen
54

55
'for RFM02
56
Trigger Alias Portd.7
57
Nsel Alias Portb.2
58
Fsk Alias Portb.0
59

60
Dim Wert As Word
61
Dim Data_tx As Word
62
Dim Temp As Word
63
Dim Zaehler As Word
64
Dim Count As Word
65
Dim Nirq_check As Bit
66
Dim Tx_telegram(5) As Word
67
Dim I As Byte
68

69
Declare Sub Rfm02_init
70
Declare Sub Send_frame
71
Declare Sub Tx_data(data_tx As Word)
72
Declare Sub Tx_temp
73
Declare Sub Prepare_to_sleep
74
Declare Sub Wakeup
75

76
'for SHT71 readout
77
Sck Alias Portc.5
78
Dataout Alias Portc.4
79
Datain Alias Pinc.4
80

81
Dim Ctr As Byte
82
Dim Dataword As Word
83
Dim Command As Byte
84

85
Declare Sub Getit()
86

87
Ddrc = &B11111111                                           'all port c are output
88
Config Pinc.5 = Output                                      'sck
89
Config Pinc.4 = Output                                      'datain
90
Config Portd.7 = Output                                     'Trigger'
91

92

93

94

95

96

97

98

99

100
'*************************
101

102
'*************************
103
'Initialisierungen
104
Spiinit
105
Set Nsel
106
Reset Nirq_check
107

108

109
'****
110
'RFM02 initialisieren
111
Waitus 10
112
Call Rfm02_init
113

114
'*************************
115

116

117
'*************************
118
'Hauptschleife
119
'*************************
120

121
Waitms 100
122
Do
123

124
'Read SHT71 temperature
125

126
'SHT71 reset I2C
127
Set Dataout
128
For Ctr = 1 To 12
129
   Set Sck
130
   Waitus 2
131
   Reset Sck
132
   Waitus 2
133
Next Ctr
134

135
Command = &B00000011
136
Call Getit                                                  'Get temperature. put result in dataword
137
Tx_telegram(5) = Dataword
138

139
'Read SHT71 humidity
140
Command = &B00000101
141
Call Getit                                                  'Get humidity put result in dataword
142
Tx_telegram(4) = Dataword
143

144
'Adress
145
Tx_telegram(2) = &B0001100000000001                         'adress #3, Type 1
146

147
'Checksum
148
Tx_telegram(1) = Crc16(tx_telegram(2) , 8)
149

150

151
Call Send_frame
152

153
Loop
154

155
End
156

157

158

159
'*************************
160
'Subroutinen
161
'*************************
162

163
'****
164
Sub Rfm02_init
165

166
Reset Nsel
167
Temp = &H9081                                               'Configuration Management
168
Call Tx_temp
169
Temp = &HC0C2                                               '&HC0F8  'Power Management
170
Call Tx_temp
171
Temp = &HA7D0                                               'Frequency Setting Command
172
Call Tx_temp
173
Temp = &HC88F                                               'Data Rate Command
174
Call Tx_temp
175
Temp = &HB0                                                 'Power Setting Command
176
Spiout Temp , 1
177

178
Temp = &HE77F                                               'Wake-Up Timer Command
179
Call Tx_temp
180

181
Spiout Temp , 1
182
Temp = &HC220                                               'Low Battery Detector and Bit Synchronization Command
183
Call Tx_temp
184
Temp = &H0001                                               'Close SPI communication
185

186
Call Tx_temp
187
Set Nsel
188
End Sub
189
'****
190

191

192

193
'****
194
Sub Send_frame(byval Tx_telegram As Word)
195

196

197
Temp = &HC6                                                 'Data Transmit Command
198
Spiout Temp , 1
199

200
Enable Int0
201
Data_tx = &H00AA
202
Call Tx_data(data_tx)
203
Data_tx = &HAAAA
204
Call Tx_data(data_tx)
205
Data_tx = &H2DD4
206
Call Tx_data(data_tx)
207
For I = 5 To 1 Step -1
208
   Data_tx = Tx_telegram(i)
209
   Call Tx_data(data_tx)
210
Next I
211
Data_tx = &HAA                                              'Frame-Ende
212
Call Tx_data(data_tx)
213
Disable Int0
214

215

216
Temp = &HC0C0                                               'clear et bit
217
Call Tx_temp
218

219
Temp = &HC0C2                                               'set et bit
220
Call Tx_temp
221

222
Call Prepare_to_sleep
223

224
Temp = &HC4FF                                               'RFM02: go home and sleep
225
Call Tx_temp
226

227
Powerdown
228

229
Call Wakeup
230

231
End Sub
232
'****
233

234
'****
235
Sub Tx_temp                                                 '2 Byte an SPI senden
236
   Rotate Temp , Left , 8
237
   Spiout Temp , 2
238
End Sub
239
'****
240

241
'****
242
Sub Tx_data(byval Data_tx As Word)                          '2 Byte ueber HF senden
243
For Count = 15 To 0 Step -1
244
   While Nirq_check = 0                                     'Interrupt abwarten
245
   Wend
246
    Fsk = Data_tx.count
247
    Nirq_check = 0
248
Next Count
249
End Sub
250
'****
251

252
'****
253
Set_nirq:
254
Nirq_check = 1
255
Return
256
'****
257

258
'****
259
Sub Getit()
260
Local Datavalue As Word
261
Local Databyte As Byte
262

263
'start transmission
264
Set Sck
265
Reset Dataout
266
Reset Sck
267
Waitus 5
268
Set Sck
269
Set Dataout
270
Reset Sck
271

272
'send command
273
Shiftout Dataout , Sck , Command , 1
274

275
Ddrc = &B11101111
276
Config Pinc.4 = Input
277
Set Sck                                                     'click one more off
278
Reset Sck
279
Waitus 10                                                   'doesn't work without it!
280
Bitwait Pinc.4 , Reset                                      'wait for SHT71 to get data ready
281
Set Trigger
282
Shiftin Datain , Sck , Databyte , 1                         'get the MSB
283
Datavalue = Databyte
284

285
Ddrc = &B11111111
286
Config Pinc.4 = Output
287

288
Reset Dataout                                               'Ack
289
Set Sck
290
Reset Sck
291
Set Dataout                                                 'absolutely neccessary!
292

293
Ddrc = &B11101111
294
Config Pinc.4 = Input
295

296
Shiftin Datain , Sck , Databyte , 1                         'get the LSB
297
Shift Datavalue , Left , 8
298
Datavalue = Datavalue Or Databyte                           'don#t tick the clock or ack since we don't need the crc value, leave it hanging!
299
Dataword = Datavalue
300

301
Ddrc = &B11111111
302
Config Pinc.4 = Output
303

304
Reset Dataout                                               'Ack
305
Set Sck
306
Reset Sck
307

308
Ddrc = &B11101111                                           'datain is now input
309
Config Pinc.4 = Input
310

311
Shiftin Datain , Sck , Databyte , 1                         'CRC, not used
312

313
Ddrc = &B11111111
314
Config Pinc.4 = Output
315

316
Set Dataout
317
Set Sck
318
Reset Sck
319
End Sub
320
'****
321

322
'****
323
Sub Prepare_to_sleep
324
Config Int0 = Low Level
325
Enable Int0
326
End Sub
327
'****
328

329
'****
330
Sub Wakeup
331
Disable Int0
332
Config Int0 = Rising
333
End Sub
334
'****

Viel Erfolg!

Ralph

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren