Hallo zusammen
Ich habe diese Woche endlich (nach 2 Wochen) meine beiden Funkmodule von
Pollin erhalten, rfm12 für 868MHz. Da ich mit diesen Modulen noch
garnichts gemacht habe, allerdings die Datenblätter schon durch habe und
es eigentlich richtig sein müsste was ich gemacht habe... nunja, es
klappt nicht so wie gewünscht.
Als Programm nehme ich ein Beispielprogramm aus der Elektor welches für
beide Module (433 und 868) funktionieren soll. Hier ist es
1 | $regfile = "m32def.dat"
|
2 | $hwstack = 32
|
3 | $swstack = 10
|
4 | $framesize = 40
|
5 |
|
6 | '$crystal = 11059200
|
7 | $crystal = 8000000
|
8 | $baud = 19200
|
9 |
|
10 | Nsel Alias Portb.4
|
11 | Sdi Alias Portb.5
|
12 | Sdo Alias Pinb.6
|
13 | Sck Alias Portb.7
|
14 |
|
15 | Dim D As Word
|
16 | Dim Data_in(10) As Byte
|
17 | Dim Data_out(10) As Byte
|
18 | Dim N As Byte
|
19 | Dim Timeout As Word
|
20 | Dim T As Word
|
21 | Dim Tt As Word
|
22 | Dim Freq As Single
|
23 |
|
24 | Declare Sub Send_rfm12
|
25 | Declare Sub Receive_rfm12
|
26 | Declare Sub Freq_rfm12
|
27 | Declare Sub Wait_rfm12
|
28 | Declare Function Spi16(byval Dout As Word) As Word
|
29 |
|
30 | Config Nsel = Output
|
31 | Config Sdi = Output
|
32 | Config Sck = Output
|
33 | Config Portc = Output
|
34 | Porta = &HFF
|
35 |
|
36 | 'Init
|
37 | Nsel = 1
|
38 | Sck = 0
|
39 | 'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
|
40 | D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
|
41 | D = Spi16(&H82d9) '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
|
42 | D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
|
43 | D = Spi16(&Hc647) ' 4.8kbps
|
44 | D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
|
45 | D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
|
46 | D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
|
47 | D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
|
48 | D = Spi16(&H9850) ' 90 kHz , power - 0 dB
|
49 | D = Spi16(&He000) '
|
50 | D = Spi16(&Hc800) '
|
51 | D = Spi16(&Hc000) ' 1 MHz , 2.2V
|
52 |
|
53 | Freq = 868.300
|
54 | Freq_rfm12
|
55 |
|
56 | 'start transmitter, no data
|
57 | 'Goto Test1:
|
58 |
|
59 | 'transmit data
|
60 | 'Goto Test2:
|
61 |
|
62 | 'transmit key data
|
63 | 'Goto Test3:
|
64 |
|
65 | 'start receiver, all data
|
66 | 'Goto Test4:
|
67 |
|
68 | 'start receiver, matched data
|
69 | 'Goto Test5:
|
70 |
|
71 |
|
72 | Do
|
73 | For N = 1 To 10
|
74 | Data_out(n) = N
|
75 | Next N
|
76 | Send_rfm12
|
77 | Waitms 500
|
78 | For N = 1 To 10
|
79 | Data_in(n) = 0
|
80 | Next N
|
81 | Timeout = 400 + Rnd(1000)
|
82 | Receive_rfm12
|
83 | For N = 1 To 10
|
84 | Print Data_in(n);
|
85 | Print " ";
|
86 | Next N
|
87 | Waitms 700
|
88 | Loop
|
89 |
|
90 |
|
91 | Sub Freq_rfm12
|
92 | If Freq < 800 Then Freq = Freq * 2
|
93 | Freq = Freq - 860
|
94 | D = Freq / 0.0050
|
95 | If D < 96 Then D = 96
|
96 | If D > 3903 Then D = 3903
|
97 | D = D + &HA000
|
98 | D = Spi16(d)
|
99 | End Sub
|
100 |
|
101 |
|
102 | Sub Send_rfm12
|
103 | D = Spi16(&H8238)
|
104 | Wait_rfm12
|
105 | D = Spi16(&Hb8aa)
|
106 | Wait_rfm12
|
107 | D = Spi16(&Hb8aa)
|
108 | Wait_rfm12
|
109 | D = Spi16(&Hb8aa)
|
110 | Wait_rfm12
|
111 | D = Spi16(&Hb82d)
|
112 | Wait_rfm12
|
113 | D = Spi16(&Hb8d4)
|
114 | For N = 1 To 10
|
115 | Wait_rfm12
|
116 | D = &HB800 + Data_out(n)
|
117 | D = Spi16(d)
|
118 | Next N
|
119 | Wait_rfm12
|
120 | D = Spi16(&Hb8aa)
|
121 | Wait_rfm12
|
122 | D = Spi16(&Hb8aa)
|
123 | Wait_rfm12
|
124 | D = Spi16(&H8208)
|
125 | End Sub
|
126 |
|
127 | Sub Wait_rfm12
|
128 | Nsel = 0
|
129 | Do
|
130 | Loop Until Sdo = 1
|
131 | End Sub
|
132 |
|
133 |
|
134 | Sub Receive_rfm12
|
135 | Tt = Timeout * 10
|
136 | D = Spi16(&H82c8)
|
137 | D = Spi16(&Hca83)
|
138 | For N = 1 To 10
|
139 | Nsel = 0
|
140 | T = 0
|
141 | Do
|
142 | T = T + 1
|
143 | Waitus 100
|
144 | If T > Tt Then Goto Nosignal
|
145 | Loop Until Sdo = 1
|
146 | D = Spi16(&Hb000)
|
147 | Data_in(n) = D
|
148 | Next N
|
149 | Nosignal:
|
150 | D = Spi16(&H8208)
|
151 | End Sub
|
152 |
|
153 |
|
154 | Function Spi16(byval Dout As Word) As Word
|
155 | Local Nspi As Integer
|
156 | Local Dspi As Integer
|
157 | Local Dsdo As Word
|
158 | Nsel = 0
|
159 | Dsdo = 0
|
160 | For Nspi = 1 To 16
|
161 | Dspi = Dout And &H8000
|
162 | If Dspi = 0 Then
|
163 | Sdi = 0
|
164 | Else
|
165 | Sdi = 1
|
166 | End If
|
167 | Dout = Dout * 2
|
168 | Dsdo = Dsdo * 2
|
169 | Dsdo = Dsdo + Sdo
|
170 | Sck = 1
|
171 | Waitus 5
|
172 | Sck = 0
|
173 | Next Nspi
|
174 | Nsel = 1
|
175 | Spi16 = Dsdo
|
176 | End Function
|
177 |
|
178 |
|
179 |
|
180 | 'transceiver tests
|
181 |
|
182 | 'start transmitter, no data
|
183 | Test1:
|
184 | D = Spi16(&H8238)
|
185 | Do
|
186 | Loop
|
187 |
|
188 |
|
189 | 'transmit data
|
190 | Test2:
|
191 | D = Spi16(&H8238)
|
192 | Do
|
193 | Wait_rfm12
|
194 | D = Spi16(&Hb8aa)
|
195 | Loop
|
196 |
|
197 |
|
198 | 'transmit key data
|
199 | Test3:
|
200 | D = Spi16(&H8238)
|
201 | Do
|
202 | Wait_rfm12
|
203 | D = Spi16(&Hb82d)
|
204 | Wait_rfm12
|
205 | D = Spi16(&Hb8d4)
|
206 | Loop
|
207 |
|
208 |
|
209 | 'start receiver, all data
|
210 | Test4:
|
211 | D = Spi16(&H82c8)
|
212 | D = Spi16(&Hca87)
|
213 | For N = 1 To 100
|
214 | Wait_rfm12
|
215 | D = Spi16(&Hb000)
|
216 | Data_in(n) = D
|
217 | Print Chr(d);
|
218 | Next N
|
219 | Do
|
220 | Loop
|
221 |
|
222 |
|
223 | 'start receiver, matched data
|
224 | Test5:
|
225 | D = Spi16(&H82c8)
|
226 | D = Spi16(&Hca83)
|
227 | For N = 1 To 100
|
228 | Wait_rfm12
|
229 | D = Spi16(&Hb000)
|
230 | Data_in(n) = D
|
231 | Print Chr(d);
|
232 | Next N
|
233 | Do
|
234 | Loop
|
Nun habe ich es so genommen und auf meinen mega32 geschrieben,
allerdings crystal auf 16000000 geändert da ich einen 16mhz quarz
verwende. Dies ist mein Empfänger.
Als Sender benutze ich aktuell einen Mega8 mit demselben Programm.
Jedoch oben auf m8def und ebenfalls 16mhz geändert, die Portbelegung auf
1 | Nsel Alias Portb.4
|
2 | Sdi Alias Portb.5
|
3 | Sdo Alias Pinb.2
|
4 | Sck Alias Portb.3
|
Und die Zeile Porta = &HFF deaktiviert durch Kommentar.
Soweit sogut, der Sender sendet (was auch sonst :P) und mein Empfänger
zeigt mir was er empfängt über COM1 und Putty brav an. Funktioniert! :)
0 1 2 3 4 5 6 7 8 9 kommt an, sobald ich den Sender ausschalte werdens
10 Nullen.
Sooo... schön und gut. Da man aber nicht gerade Ärgern mit der
Bundesnetzagentur haben möchte informiert sich der Pflichtbewusste
Anwender natürlich über die Frequenzen die er benutzen darf, ich würde
gerne in dem Bereich j) arbeiten da dort der Duty cycle auf 100% steht.
Hier der Auszug aus dem vor mir liegenden Ausdruck:
Frequenzbereich in MHz: j) 869,700-870,000
maximale Kanalbandbreite: keine Einschränkung
Maximale Sendeleistung: 5mW
Relative Frequenzbelegungsdauer: 100%
Nach etwas hinundher rechnen und Bemühen von Maple um die schönen
Formeln aus dem Datenblatt umzustellen (ja Maschinenbaustudenten von
heute sind faul :D) kam ich darauf das ich die Zeilen
1 | D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
|
2 | Freq = 868.300
|
wie folgt ändern muss
1 | D = Spi16(&Ha7b2) ' 869,850 MHz
|
2 | Freq = 869.850
|
Auf A7B2 komme ich so:
Wunschfrequenz= 869.850MHz
Mit der Formel aus dem Datenblatt lande ich bei 1970.000
Die in Binär sieht so aus 011110110010
die 1010 davor ergibt 1010011110110011
was dann 10100111 = A7h
und 10110010 = B2h entspricht
somit also A7B2
Leider kommt dann nach der Umstellung der Frequenzen nichts mehr an, nur
die 10 Nullen :(
Weiss jemand Rat?
Gruß
ps: ich wollte eigentlich den Code in
packen aber da färbte er in der Vorschau nur die Zahlen ein :(