RFM 12, Bascom und Interrupts

Gast #1954574
Lesenswert?

Hallo Leute,

ich sitze hier nun schon seit Wochen an diesem Problem. Das einzige was 
ich versuche ist den Empfang des RFM12-Moduls mit Bascom über einen 
Interrupt zu steuern. Vorweg mal meinen Code:
1
$regfile "m32def.dat"
2

3
$crystal = 8000000
4

5
$hwstack = 100                                              ' default use 32 for the hardware stack
6
$swstack = 100                                              'default use 10 for the SW stack
7
$framesize = 100
8

9
$baud = 19200
10
Baud = 19200
11

12
Print "Start..."
13

14
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Porta.1 , Rs = Porta.0
15
Config Lcd = 16 * 2                                         
16
Cursor Off
17

18
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
19

20
Spiinit
21

22

23
Config Int0 = Rising
24
Enable Int0
25
On Int0 Isr_von_int0
26

27
Config Timer2 = Timer , Prescale = 8                        'Zum erkennen von Fehlern während der Funkübertragung: Evtl. endlosschleife --> vermeiden
28
On Ovf2 On_ovf0
29
Enable Ovf2
30

31
Stop Timer2
32

33
'#################################################
34
'Ports
35
'#################################################
36
Rck Alias Porta.3                                           
37
Sck Alias Portc.0                                           
38
Si Alias Porta.2
39

40
Config Portb.0 = Input
41
Config Portb.2 = Input
42
Config Portb.3 = Input
43
Config Portd.3 = Input
44
Config Portd.2 = Input
45
Config Portb.1 = Input
46
Config Portd.7 = Output
47
Config Portd.5 = Output
48

49

50
Portb.0 = 1
51
Portb.2 = 1
52
Portb.3 = 1
53
Portd.3 = 1
54
Portd.2 = 0
55
Portb.1 = 1
56

57

58
Schalter2 Alias Pinb.0
59
Taster1 Alias Pinb.1
60
Taster2 Alias Pinb.3
61
Taster3 Alias Pinb.2
62
Beleuchtung Alias Portd.5
63

64
Led1 Alias Portd.7
65

66
'---Funkboard---
67
Spi_cs Alias Portb.4                                        ' SS-Pin
68
Spi_sdo Alias Pinb.6
69

70
Config Spi_cs = Output
71

72
Set Spi_cs
73

74
'#################################################
75
'Variablen
76
'#################################################
77

78
Const Rf12freq = 433.92
79
Const Rf12baud = 19200
80
Const Maxchar = 32
81

82
Dim Temps(9) As Byte
83
Dim Led(9) As Byte
84
Dim Wert As Byte
85

86
Dim Temp As Word
87

88
Dim Gedruckt(3) As Byte
89

90
'Funkmodul:
91
Dim I As Word
92
Dim Count As Byte
93
Dim Rfdata(32) As Byte
94
Dim Text As String * Maxchar At Rfdata Overlay
95

96
Dim S As String * 10
97

98
Dim Tmr_zahler As Word
99
Dim Abbrechen As Bit
100

101
Dim Empf_flag As Bit
102

103
'#################################################
104
'Declares
105
'#################################################
106

107

108
Declare Sub Rf12_init
109
Declare Function Rf12_trans(byval Wert As Word) As Word
110
Declare Sub Rf12_setfreq(byval Freq As Single)
111
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
112
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
113
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
114
Declare Sub Rf12_ready
115
Declare Sub Rf12_readys
116
Declare Sub Rf12_txdata(byval Maxchar As Byte)
117
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
118
Declare Sub Rf12_rxdata_s(byval Maxchar As Byte)
119

120

121
Declare Sub Empfang_starten
122
Declare Sub Empfang_abbrechen
123

124
'#################################################
125
'Main-Loop
126
'#################################################
127

128

129

130
Waitms 100
131

132
Beleuchtung = 1
133

134
Cls
135

136

137
Locate 1 , 1
138
Lcd "Herzlich"
139
Locate 2 , 1
140
Lcd "Willkommen!"
141

142
Waitms 100
143

144
Cls
145

146
Locate 1 , 1
147
Lcd "Booting.."
148
Locate 2 , 1
149

150
Waitms 200
151

152
Config Watchdog = 2048
153
Start Watchdog
154

155
Locate 2 , 1
156
Lcd "1/5"
157
Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
158
Waitms 50
159

160
Locate 2 , 1
161
Lcd "2/5"
162
Call Rf12_setfreq(rf12freq)
163

164
Locate 2 , 1                                                '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
165
Lcd "3/5"
166
Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
167

168
Locate 2 , 1
169
Lcd "4/5"
170

171
Locate 2 , 1
172
Call Rf12_setbaud(rf12baud)                                 '  19200 baud
173
Lcd "5/5"
174
Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift
175

176
Stop Watchdog
177

178
Cls
179

180

181
Print "Vor 1. Empfangen"
182

183
Call Rf12_rxdata_s(maxchar) 'ohne diese Zeile geht irgendwie gar nichts
184

185
Print "Empfangen!"
186

187
Enable Interrupts
188

189

190

191
Main:
192
Do
193

194
If Empf_flag = 1 Then
195

196
   Empf_flag = 0
197
   Call Rf12_rxdata(maxchar)
198
   For Count = 1 To Maxchar
199
      Print Chr(rfdata(count)) ; "-";
200
   Next Count
201
   Toggle Led1
202

203
End If
204

205
Loop
206
'-------------------------------------------------
207

208

209
'--------------------------------------
210
'---Funkmodul---
211
'--------------------------------------
212

213
Sub Rf12_init:
214
  Temp = Rf12_trans(&Hc0e0)
215
  Temp = Rf12_trans(&H80d7)
216
  Temp = Rf12_trans(&Hc2ab)
217
  Temp = Rf12_trans(&Hca81)
218
  Temp = Rf12_trans(&He000)
219
  Temp = Rf12_trans(&Hc800)
220
  Temp = Rf12_trans(&Hc4f7)
221
End Sub
222

223

224
Sub Rf12_setfreq(byval Freq As Single)
225

226
  Freq = Freq - 430.00
227
  Temp = Freq / 0.0025
228
  If Temp < 96 Then
229
    Temp = 96
230
  Elseif Temp > 3903 Then
231
    Temp = 3903
232
  End If
233
  Temp = Temp + &HA000
234
  Temp = Rf12_trans(temp)
235
End Sub
236

237

238
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
239
  Drssi = Drssi And 7
240
  Gain = Gain And 3
241
  Temp = Bandwith And 7
242
  Shift Temp , Left , 2
243
  Temp = Temp + Gain
244
  Shift Temp , Left , 3
245
  Temp = Temp + Drssi
246
  Temp = Temp + &H9400
247
  Temp = Rf12_trans(temp)
248
End Sub
249

250

251
Sub Rf12_setbaud(byval Rfbaud As Long )
252
  Local Ltemp As Long
253

254
  If Rfbaud < 663 Then Exit Sub
255

256
  If Rfbaud < 5400 Then
257
    Temp = 43104 / Rfbaud
258
    Temp = Temp + &HC680
259
  Else
260
    Ltemp = 344828 / Rfbaud
261
    Temp = Ltemp
262
    Temp = Temp + &HC600
263
  End If
264
  Decr Temp
265
  Temp = Rf12_trans(temp)
266
End Sub
267

268

269
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
270
  Outpower = Outpower And 7
271
  Temp = Fskmod And 15
272
  Shift Temp , Left , 4
273
  Temp = Temp + Outpower
274
  Temp = Temp + &H9800
275
  Temp = Rf12_trans(temp)
276
End Sub
277

278

279
Sub Rf12_txdata(byval Maxchar As Byte)
280
  Temp = Rf12_trans(&H8238)
281
  Rf12_ready
282
  Temp = Rf12_trans(&Hb8aa)
283
  Rf12_ready
284
  Temp = Rf12_trans(&Hb8aa)
285
  Rf12_ready
286
  Temp = Rf12_trans(&Hb8aa)
287
  Rf12_ready
288
  Temp = Rf12_trans(&Hb82d)
289
  Rf12_ready
290
  Temp = Rf12_trans(&Hb8d4)
291
  Rf12_ready
292
  For Count = 1 To Maxchar
293
    Rf12_ready
294
    Temp = &HB800 + Rfdata(count)
295
    Temp = Rf12_trans(temp)
296
  Next Count
297
  Rf12_ready
298
  Temp = Rf12_trans(&H8208)
299
End Sub
300

301

302
Sub Rf12_rxdata(byval Maxchar As Byte)
303

304
  Gosub Empfang_starten
305
  Temp = Rf12_trans(&H82c8)
306
  Temp = Rf12_trans(&Hca81)
307
  Temp = Rf12_trans(&Hca83)
308
  For Count = 1 To Maxchar
309

310
    Temp = Rf12_trans(&Hb000)
311
    Rfdata(count) = Temp
312
    Rf12_ready
313
  Next Count
314
  Temp = Rf12_trans(&H8208)
315
  Gosub Empfang_abbrechen
316

317
End Sub
318

319
Sub Rf12_rxdata_s(byval Maxchar As Byte)                    'Besonderes Empfangen: Nur am Anfang
320

321
  Temp = Rf12_trans(&H82c8)
322
  Temp = Rf12_trans(&Hca81)
323
  Temp = Rf12_trans(&Hca83)
324
  For Count = 1 To Maxchar
325
    Temp = Rf12_trans(&Hb000)
326
    Rfdata(count) = Temp
327
    Rf12_readys
328
  Next Count
329
  Temp = Rf12_trans(&H8208)
330

331
End Sub
332

333

334

335
Function Rf12_trans(byval Wert As Word) As Word
336
  Local Lowbyte As Byte
337
  Local Highbyte As Byte
338

339
  Lowbyte = Wert And 255
340
  Shift Wert , Right , 8
341
  Reset Spi_cs
342

343
  Highbyte = Spimove(wert)
344
  Lowbyte = Spimove(lowbyte)
345
  Set Spi_cs
346

347
  Temp = Highbyte * 256
348
  Temp = Temp + Lowbyte
349
  Rf12_trans = Temp
350
End Function
351

352
Sub Rf12_readys
353
   I = 0
354
  Reset Spi_cs
355
  While Spi_sdo = 0
356
  Incr I
357
  If I = 10000 Then
358
      I = 0
359
      Exit While
360
  End If
361
  Wend
362
End Sub
363

364

365
Sub Rf12_ready
366
  Reset Spi_cs
367
  While Spi_sdo = 0
368
  If Abbrechen = 1 Then
369
      Temp = Rf12_trans(&H8208)
370
      Abbrechen = 0
371
      Goto Main
372
      Enable Int0
373
  End If
374
  Wend
375
End Sub
376

377
Sub Empfang_starten
378
   Start Timer2
379
   Abbrechen = 0
380
   'Print "E"
381

382
End Sub
383

384
Sub Empfang_abbrechen
385

386
   Stop Timer2
387

388
End Sub
389

390

391

392
'-------------------------------------------------------------------------------
393
'---Empfangen-------------------------------------------------------------------
394
'-------------------------------------------------------------------------------
395

396

397
Isr_von_int0:
398
   'Disable Interrupts
399

400
   Empf_flag = 1
401
   Goto Main
402
   'Print "!"
403

404
   'Enable Interrupts
405
Return
406

407
On_ovf0:
408

409
   Incr Tmr_zahler
410

411
   If Tmr_zahler = 7000 Then
412

413
      Tmr_zahler = 0
414
      Abbrechen = 1
415
      Stop Timer2
416

417
      Print "AB"
418

419
   End If
420

421
Return
Gast #1954586
Lesenswert?

Ach jetzt hab ich schon abgesendet -.-

Naja das Problem besteht darin, dass es nur einmal zum Empfang kommt. Es 
liegt nahe das die Empfangsroutine nicht hinterherkommt, aber das 
Problem kann ich schlecht beheben, da der Sender nur im 2 Sekundentakt 
sendet..

Wenn man den Status des FFIT-Pins beobachtet, sieht man folgendes: Beim 
ersten Mal geht der Pin kurz hoch dann wieder runter dann bleibt er 
dauerhaft  auf High..

Ich hoffe ihr könnt den Code mal genauer untersuchen und vielleicht 
einen Fehler finden!

Wolfgang

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