Forum: Mikrocontroller und Digitale Elektronik RFM12 merkwürdiges Phänomen


von Apohero (Gast)


Lesenswert?

Hallo,
ich besitze das RFM12 Modul und habe bereits eine Schaltung aufgebaut. 
Die Pins sind genauso wie bei comwebnet angeschlossen. In der Schaltung 
sind der Atmega8 auf 8mhz, ein Display und Abblockkondensatoren verbaut. 
Das Funkmodul ist über 13cm lange Kabel verbunden. Ich verwende 
folgenden Code:
1
' Atmega8
2
' VDD -> VCC
3
' GND -> GND
4
' SDI -> MOSI (PB3, Pin 17)
5
' SDO -> MISO (PB4, Pin 18)
6
' SCK -> SCK (PB5, Pin 19)
7
' nSel -> SS (PB2, Pin 16)
8
' Fsk - > R 10k
9
10
' Atmega16
11
' VDD -> VCC
12
' GND -> GND
13
' SDI -> MOSI (PB5, Pin 6)
14
' SDO -> MISO (PB6, Pin 7)
15
' SCK -> SCK (PB7, Pin 8)
16
' nSel -> SS (PB4, Pin 5)
17
' Fsk - > R 10k
18
19
$regfile = "m16def.dat"
20
$crystal = 1000000                                                              '
21
$hwstack = 32
22
$swstack = 32
23
$framesize = 40
24
25
Declare Sub Rf12_init
26
Declare Function Rf12_trans(byval Wert As Word) As Word
27
Declare Sub Rf12_setfreq(byval Freq As Single)
28
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
29
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
30
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
31
Declare Sub Rf12_ready
32
Declare Sub Rf12_readys
33
Declare Sub Rf12_txdata(byval Maxchar As Byte)
34
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
35
Declare Sub Senden
36
Declare Sub Empfangen
37
38
Const Rf12freq = 433.92
39
Const Rf12baud = 1200
40
Const Maxchar = 16
41
42
Config Lcdpin = Pin , Db4 = Porta.7 , Db5 = Porta.6 , Db6 = Porta.5 , Db7 = Porta.4 , E = Portc.1 , Rs = Portc.0
43
Config Lcd = 16 * 2 , Chipset = Dogm162v3
44
45
Cursor Off Noblink
46
Cls
47
48
' config the SPI in master mode.The clock must be a quarter of the slave cpu
49
' Hier ggf. den SoftSPI reinmachen
50
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
51
Config Portd.7 = Output                                                         ' LED zur Schleifenkontrolle
52
53
54
' werden benötigt für rf12_ready
55
Spi_cs Alias Portb.4                                                            ' SS-Pin
56
Config Spi_cs = Output
57
Spi_sdo Alias Pinb.6                                                            ' MISO-PIN
58
Set Spi_cs
59
60
' init the spi pins
61
Spiinit
62
63
Dim Count As Byte
64
Dim Temp As Word
65
Dim Rfdata(32) As Byte
66
Dim Text As String * Maxchar At Rfdata Overlay
67
'Dim J As Byte
68
69
Locate 1 , 1 : Lcd "Init RFM12      "
70
Waitms 100
71
Call Rf12_init                                                                  ' ein paar Register setzen (z.B. CLK auf 10MHz)
72
Locate 1 , 1 : Lcd "Set Frequenz    "
73
Waitms 100
74
Call Rf12_setfreq(rf12freq)                                                     ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
75
Locate 1 , 1 : Lcd "Set Bandwith    "
76
Waitms 100
77
Call Rf12_setbandwith(4 , 1 , 4)                                                ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
78
Locate 1 , 1 : Lcd "Set Baudrate    "
79
Waitms 100
80
Call Rf12_setbaud(rf12baud)                                                     ' 19200 baud
81
Locate 1 , 1 : Lcd "Set Tx-Power    "
82
Waitms 100
83
Call Rf12_setpower(0 , 6)                                                       ' 1mW Ausgangangsleistung, 120kHz Frequenzshift
84
85
86
'Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"
87
'Text = "433MHz Test #" + J
88
89
' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
90
91
Do                                                                              ' Ewigschleife
92
   Empfangen
93
   Pulseout Portd , 7 , 500                                                     ' Schleifenkontrolle
94
   Locate 1 , 1 : Lcd "Ready           "
95
   Wait 1
96
Loop
97
98
End
99
100
' ########################################################################
101
' ####### Tranceiverroutinen
102
' ########################################################################
103
104
Sub Empfangen
105
   Locate 1 , 1 : Lcd "Empfange        "
106
   Waitms 100
107
   Locate 2 , 1 : Lcd "                "
108
   Locate 2 , 1
109
   Call Rf12_rxdata(maxchar)
110
   For Count = 1 To Maxchar
111
      Lcd Chr(rfdata(count)) ;
112
      Waitms 100
113
   Next Count
114
End Sub
115
116
Sub Senden
117
   Locate 1 , 1 : Lcd "Sende           "
118
   Waitms 100
119
   Call Rf12_txdata(maxchar)
120
   Waitms 10
121
End Sub
122
123
' ########################################################################
124
' ###### Unterroutinen
125
' ########################################################################
126
127
Sub Rf12_init:
128
   Waitms 150
129
   Temp = Rf12_trans(&Hc0e0)
130
   Temp = Rf12_trans(&H80d7)
131
   Temp = Rf12_trans(&Hc2ab)
132
   Temp = Rf12_trans(&Hca81)
133
   Temp = Rf12_trans(&He000)
134
   Temp = Rf12_trans(&Hc800)
135
   Temp = Rf12_trans(&Hc4f7)
136
End Sub
137
138
Sub Rf12_setfreq(byval Freq As Single)
139
   Freq = Freq - 430.00
140
   Temp = Freq / 0.0025
141
   If Temp < 96 Then
142
      Temp = 96
143
   Elseif Temp > 3903 Then
144
      Temp = 3903
145
   End If
146
   Temp = Temp + &HA000
147
   Temp = Rf12_trans(temp)
148
End Sub
149
150
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
151
   Drssi = Drssi And 7
152
   Gain = Gain And 3
153
   Temp = Bandwith And 7
154
   Shift Temp , Left , 2
155
   Temp = Temp + Gain
156
   Shift Temp , Left , 3
157
   Temp = Temp + Drssi
158
   Temp = Temp + &H9400
159
   Temp = Rf12_trans(temp)
160
End Sub
161
162
Sub Rf12_setbaud(byval Rfbaud As Long )
163
   Local Ltemp As Long
164
   If Rfbaud < 663 Then Exit Sub
165
   If Rfbaud < 5400 Then
166
      Temp = 43104 / Rfbaud
167
      Temp = Temp + &HC680
168
   Else
169
      Ltemp = 344828 / Rfbaud
170
      Temp = Ltemp
171
      Temp = Temp + &HC600
172
   End If
173
   Decr Temp
174
   Temp = Rf12_trans(temp)
175
End Sub
176
177
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
178
   Outpower = Outpower And 7
179
   Temp = Fskmod And 15
180
   Shift Temp , Left , 4
181
   Temp = Temp + Outpower
182
   Temp = Temp + &H9800
183
   Temp = Rf12_trans(temp)
184
End Sub
185
186
Sub Rf12_txdata(byval Maxchar As Byte)
187
   Temp = Rf12_trans(&H8238)
188
   Rf12_ready
189
   Temp = Rf12_trans(&Hb8aa)
190
   Rf12_ready
191
   Temp = Rf12_trans(&Hb8aa)
192
   Rf12_ready
193
   Temp = Rf12_trans(&Hb8aa)
194
   Rf12_ready
195
   Temp = Rf12_trans(&Hb82d)
196
   Rf12_ready
197
   Temp = Rf12_trans(&Hb8d4)
198
   Rf12_ready
199
   For Count = 1 To Maxchar
200
      Rf12_ready
201
      Temp = &HB800 + Rfdata(count)
202
      Temp = Rf12_trans(temp)
203
   Next Count
204
   Rf12_ready
205
   Temp = Rf12_trans(&H8208)
206
End Sub
207
208
Sub Rf12_rxdata(byval Maxchar As Byte)
209
   Temp = Rf12_trans(&H82c8)
210
   Temp = Rf12_trans(&Hca81)
211
   Temp = Rf12_trans(&Hca83)
212
   For Count = 1 To Maxchar
213
      Rf12_ready
214
      Temp = Rf12_trans(&Hb000)
215
      Rfdata(count) = Temp
216
   Next Count
217
   Temp = Rf12_trans(&H8208)
218
End Sub
219
220
Function Rf12_trans(byval Wert As Word) As Word
221
   Local Lowbyte As Byte
222
   Local Highbyte As Byte
223
   Lowbyte = Wert And 255
224
   Shift Wert , Right , 8
225
   Reset Spi_cs
226
   Highbyte = Spimove(wert)
227
   Lowbyte = Spimove(lowbyte)
228
   Set Spi_cs
229
   Temp = Highbyte * 256
230
   Temp = Temp + Lowbyte
231
   Rf12_trans = Temp
232
End Function
233
234
Sub Rf12_ready
235
   Local I As Word
236
   Reset Spi_cs
237
   For I = 1 To 65000
238
      If Spi_sdo = 1 Then Exit For
239
   Next
240
End Sub

Die Schaltung soll als Empfänger fungieren.
NUN zu meinem Problem: Das Programm bleibt in der Init stehen, wenn ich 
nun allerding mit meiner Hand den Kabel des Moduls nähere läuft es 
weiter. Nehme ich sie wieder weg bleibt das Prog wieder stehen. Was kann 
das sein?
Habe die Kabel auch schon komplett ausgetauscht, aber das Phänomen 
bleibt gleich. Hat jemand eine Idee? Ich wäre wirklich sehr dankbar.

von Avr N. (avrnix) Benutzerseite


Lesenswert?

http:\\www.comwebnet.de -> forum da kannst mal Nachfragen deine Software 
sieht ziehmlich gleich welcher von Wigbert ist.

von Bluze (Gast)


Lesenswert?

fehlen irgendwo pullups pulldowns?

von Apohero (Gast)


Lesenswert?

Ich hab nur einen Pullup und zwar 10k zwischen vcc und FSK/Data.

Vcc ------|10K|-----FSK

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

Hi,
"müllt" Dein Displaytakt den RFM12 zu?
kannst Du mal mit "abschirmen" versuchen(Blech zwischenhalten an GND
anschliesssen)
Wo ist denn die Portdeclaration.

Wigbert

von Face2001 (Gast)


Lesenswert?

Habe dieses merkwürdige Phänomen jetzt behoben. Der SS und Miso Pin 
waren falsch deklariert. Das hatte ich nicht gesehen.

Der Sender sendet jetzt und der Empfänger Empfängt. Zumindest sagt er 
das. Aber es erscheinen immer dieselben merkwürdigen zeichen, ob der 
Sender nun an ist oder nicht. Irgendetwas stimmt also nicht an der 
Übertragung.

von Face2001 (Gast)


Lesenswert?

Was mich auch wundert ist, das die Kontrollled an Pd0 nur ganz wenig 
leuchtet. Wenn ich die Led aber mit Bascom Code ein und ausschalte 
leuchtet sie hell. Irgendetwas im Code dreht meiner Led den Saft runter.

von Face2001 (Gast)


Lesenswert?

Ich meine die Kontroll Led des Senders.

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.