Forum: Mikrocontroller und Digitale Elektronik RFM 12, Bascom und Interrupts


von Wolfgang (Gast)


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

von Wolfgang (Gast)


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

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.