1 | include "pic.h"
|
2 |
|
3 | typedef unsigned char uchar;
|
4 | typedef unsigned int uint;
|
5 |
|
6 | #define _XTAL_FREQ 8000000
|
7 |
|
8 |
|
9 | #define RF_PORT GPIO
|
10 | #define RF_DDR TRISIO
|
11 | #define RF_PIN GPIO
|
12 |
|
13 | #define SDI 0
|
14 | #define SDO 1
|
15 | #define SCK 2
|
16 | #define TASTER 3 //GP3 INPUT ONLY!!!
|
17 | #define CS 4
|
18 | #define LED 5
|
19 |
|
20 |
|
21 | #define cbi(PORT, BIT) (PORT &= ~(1<<BIT))
|
22 | #define sbi(PORT, BIT) (PORT |= (1<<BIT))
|
23 | #define RF12FREQ(freq) ((freq-430.0)/0.0025) // macro for calculating frequency value out of frequency in MHz
|
24 |
|
25 |
|
26 |
|
27 | void InitApplication(void);
|
28 | void rf12_init(void);
|
29 | unsigned short rf12_trans(unsigned short wert);
|
30 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi);
|
31 | void rf12_setfreq(unsigned short freq);
|
32 | void rf12_setbaud(unsigned short baud);
|
33 | void rf12_setpower(unsigned char power, unsigned char mod);
|
34 | void rf12_ready(void);
|
35 | void rf12_txdata(unsigned char *data, unsigned char number);
|
36 | void rf12_rxdata(unsigned char *data, unsigned char number);
|
37 | void send(void);
|
38 |
|
39 | __CONFIG(0x3FF4);
|
40 |
|
41 | unsigned short state = 1;
|
42 |
|
43 | void main()
|
44 | {
|
45 | for (unsigned char i=0; i<200; i++)
|
46 | __delay_ms(10); //2s
|
47 |
|
48 | InitApplication();
|
49 |
|
50 | while(1)
|
51 | {
|
52 | switch(state)
|
53 | {
|
54 | case 1:
|
55 | sbi(RF_PORT, LED);
|
56 | for (unsigned char i=0; i<50; i++)
|
57 | __delay_ms(10); //500ms
|
58 | state = 2;
|
59 | break;
|
60 | case 2: //init
|
61 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
62 | rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
63 | rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
|
64 | rf12_setbaud(19200); // 19200 baud
|
65 | rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift
|
66 | state = 3;
|
67 | break;
|
68 | case 3:
|
69 | cbi(RF_PORT, LED);
|
70 | for (unsigned char i=0; i<50; i++)
|
71 | __delay_ms(10); //500ms
|
72 | send();
|
73 | state = 4;
|
74 | break;
|
75 | case 4:
|
76 | sbi(RF_PORT, LED);
|
77 | for (unsigned char i=0; i<50; i++)
|
78 | __delay_ms(10); //500ms
|
79 | state = 3;
|
80 | break;
|
81 |
|
82 | }
|
83 |
|
84 | }
|
85 | }
|
86 |
|
87 |
|
88 | void interrupt interrupt_Handler(void)
|
89 | {
|
90 | }
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | void InitApplication(void)
|
96 | {
|
97 | OSCCON = 0x75; // 8 MHz internal Clock
|
98 | CM0 = 1; //111 = CIN pins are configured as I/O, COUT pin
|
99 | CM1 = 1; //is configured as I/O, Comparator output disabled, Comparator off.
|
100 | CM2 = 1;
|
101 | ANS0 = 0; // all I/Os are digital
|
102 | ANS1 = 0;
|
103 | ANS2 = 0;
|
104 | ANS3 = 0;
|
105 | TRISIO &= ~(1<<SDI);
|
106 | TRISIO &= ~(1<<SCK);
|
107 | TRISIO &= ~(1<<CS);
|
108 | TRISIO &= ~(1<<LED);
|
109 | }
|
110 |
|
111 |
|
112 |
|
113 | unsigned short rf12_trans(unsigned short wert)
|
114 | { unsigned short werti=0;
|
115 | unsigned char i;
|
116 |
|
117 | cbi(RF_PORT, CS);
|
118 |
|
119 | for (i=0; i<16; i++)
|
120 | { if (wert&32768)
|
121 | {
|
122 | sbi(RF_PORT, SDI);
|
123 | }
|
124 | else
|
125 | {
|
126 | cbi(RF_PORT, SDI);
|
127 | }
|
128 | werti<<=1;
|
129 | if (RF_PIN&(1<<SDO))
|
130 | werti|=1;
|
131 | __delay_us(100); //CHANGED
|
132 | sbi(RF_PORT, SCK);
|
133 | wert<<=1;
|
134 | //__delay_us(5);
|
135 | __delay_us(100); //CHANGED
|
136 | cbi(RF_PORT, SCK);
|
137 | }
|
138 | __delay_us(5);
|
139 | sbi(RF_PORT, CS);
|
140 | return werti;
|
141 | }
|
142 |
|
143 |
|
144 | void rf12_init(void)
|
145 | {
|
146 | //RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
|
147 | RF_PORT=(1<<CS)|(1<<LED);
|
148 |
|
149 | for (unsigned char i=0; i<10; i++)
|
150 | __delay_ms(10); // wait until POR done
|
151 |
|
152 | rf12_trans(0xC0E0); // AVR CLK: 10MHz
|
153 | rf12_trans(0x80D7); // Enable FIFO
|
154 | rf12_trans(0xC2AB); // Data Filter: internal
|
155 | rf12_trans(0xCA81); // Set FIFO mode
|
156 | rf12_trans(0xE000); // disable wakeuptimer
|
157 | rf12_trans(0xC800); // disable low duty cycle
|
158 | rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz
|
159 | }
|
160 |
|
161 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
|
162 | {
|
163 | rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
|
164 | }
|
165 | void rf12_setfreq(unsigned short freq)
|
166 | { if (freq<96) // 430,2400MHz
|
167 | freq=96;
|
168 | else if (freq>3903) // 439,7575MHz
|
169 | freq=3903;
|
170 | rf12_trans(0xA000|freq);
|
171 | }
|
172 |
|
173 | void rf12_setbaud(unsigned short baud)
|
174 | {
|
175 | if (baud<663)
|
176 | return;
|
177 | if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7)
|
178 | rf12_trans(0xC680|((43104/baud)-1));
|
179 | else
|
180 | rf12_trans(0xC600|((344828UL/baud)-1));
|
181 | }
|
182 |
|
183 | void rf12_setpower(unsigned char power, unsigned char mod)
|
184 | {
|
185 | rf12_trans(0x9800|(power&7)|((mod&15)<<4));
|
186 | }
|
187 |
|
188 | void rf12_ready(void)
|
189 | { cbi(RF_PORT, CS);
|
190 | while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
|
191 | }
|
192 |
|
193 | void rf12_txdata(unsigned char *data, unsigned char number)
|
194 | { unsigned char i;
|
195 | rf12_trans(0x8238); // TX on
|
196 | rf12_ready();
|
197 | rf12_trans(0xB8AA);
|
198 | rf12_ready();
|
199 | rf12_trans(0xB8AA);
|
200 | rf12_ready();
|
201 | rf12_trans(0xB8AA);
|
202 | rf12_ready();
|
203 | rf12_trans(0xB82D);
|
204 | rf12_ready();
|
205 | rf12_trans(0xB8D4);
|
206 | for (i=0; i<number; i++)
|
207 | { rf12_ready();
|
208 | rf12_trans(0xB800|(*data++));
|
209 | }
|
210 | rf12_ready();
|
211 | rf12_trans(0x8208); // TX off
|
212 | }
|
213 |
|
214 |
|
215 | void rf12_rxdata(unsigned char *data, unsigned char number)
|
216 | { unsigned char i;
|
217 | rf12_trans(0x82C8); // RX on
|
218 | rf12_trans(0xCA81); // set FIFO mode
|
219 | rf12_trans(0xCA83); // enable FIFO
|
220 | for (i=0; i<number; i++)
|
221 | { rf12_ready();
|
222 | *data++=rf12_trans(0xB000);
|
223 | }
|
224 | rf12_trans(0x8208); // RX off
|
225 | }
|
226 |
|
227 |
|
228 | void send(void)
|
229 | { unsigned char test[]="TEST";
|
230 | rf12_txdata(test,4);
|
231 | }
|