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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.