Forum: Mikrocontroller und Digitale Elektronik RFM02 Konfiguration


von Philipp K. (Firma: keine) (nobody16)


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

von (prx) A. K. (prx)


Lesenswert?

Dein Spisend sendet ein Byte, kein Wort, akzeptiert aber ein Wort, 
dessen MSB folglich über Bord geht.

Ausserdem dürfte korrektes Senden per SPI auch in Bascom anders 
aussehen. Immerhin solltest du wohl abwarten bis es raus ist bevor das 
nächste Byte drin landet.

von Philipp K. (Firma: keine) (nobody16)


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.

von Philipp K. (Firma: keine) (nobody16)


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

von Ralph Fischer (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.