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
|