1 | /// Auszug aus int main
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/io.h>
|
4 | #include <avr/pgmspace.h>
|
5 | #include <stdint.h>
|
6 | #include <stdio.h>
|
7 | #include <stdlib.h>
|
8 | #include <string.h>
|
9 | #include <util/delay.h>
|
10 | // ...
|
11 | DDRB = 0b01001011; // Eingang Encoder / Funkmodul
|
12 |
|
13 |
|
14 | /// Auszug aus der Headerdatei
|
15 | #define RF12FREQ(freq) ((freq-430.0)/0.0025) // macro for calculating frequency value out of frequency in MHz
|
16 |
|
17 | #ifndef cbi
|
18 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
19 | #endif
|
20 | #ifndef sbi
|
21 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
22 | #endif
|
23 |
|
24 |
|
25 | // Die eigendlichen Funktionen (Übernommen aus dem oben genannten Beitrag)
|
26 |
|
27 |
|
28 |
|
29 | #define RF_PORT PORTB
|
30 | #define RF_DDR DDRB
|
31 | #define RF_PIN PINB
|
32 |
|
33 | #define SDI 2
|
34 | #define SCK 1
|
35 | #define CS 0 // nsel?
|
36 | #define SDO 3
|
37 |
|
38 | unsigned short rf12_trans(unsigned short wert)
|
39 | { unsigned short werti=0;
|
40 | unsigned char i;
|
41 |
|
42 | cbi(RF_PORT, CS);
|
43 | for (i=0; i<16; i++)
|
44 | { if (wert&32768)
|
45 | sbi(RF_PORT, SDI);
|
46 | else
|
47 | cbi(RF_PORT, SDI);
|
48 | werti<<=1;
|
49 | if (RF_PIN&(1<<SDO))
|
50 | werti|=1;
|
51 | sbi(RF_PORT, SCK);
|
52 | wert<<=1;
|
53 | _delay_us(0.3);
|
54 | cbi(RF_PORT, SCK);
|
55 | }
|
56 | sbi(RF_PORT, CS);
|
57 | return werti;
|
58 | }
|
59 |
|
60 | void rf12_init(void)
|
61 | { // Auskommentiert weil bereits in der int main geschehen
|
62 | //RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
|
63 | RF_PORT=(1<<CS);
|
64 |
|
65 | //for (unsigned char i=0; i<10; i++)
|
66 | _delay_ms(100); // wait until POR done
|
67 |
|
68 | rf12_trans(0xC0E0); // AVR CLK: 10MHz
|
69 | rf12_trans(0x80D7); // Enable FIFO
|
70 | rf12_trans(0xC2AB); // Data Filter: internal
|
71 | rf12_trans(0xCA81); // Set FIFO mode
|
72 | rf12_trans(0xE000); // disable wakeuptimer
|
73 | rf12_trans(0xC800); // disable low duty cycle
|
74 | rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz
|
75 | }
|
76 |
|
77 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
|
78 | {
|
79 | rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
|
80 | }
|
81 |
|
82 | void rf12_setfreq(unsigned short freq)
|
83 | { if (freq<96) // 430,2400MHz
|
84 | freq=96;
|
85 | else if (freq>3903) // 439,7575MHz
|
86 | freq=3903;
|
87 | rf12_trans(0xA000|freq);
|
88 | }
|
89 |
|
90 | void rf12_setbaud(unsigned short baud)
|
91 | {
|
92 | if (baud<663)
|
93 | return;
|
94 | if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7)
|
95 | rf12_trans(0xC680|((43104/baud)-1));
|
96 | else
|
97 | rf12_trans(0xC600|((344828UL/baud)-1));
|
98 | }
|
99 |
|
100 | void rf12_setpower(unsigned char power, unsigned char mod)
|
101 | {
|
102 | rf12_trans(0x9800|(power&7)|((mod&15)<<4));
|
103 | }
|
104 |
|
105 | void rf12_ready(void)
|
106 | { cbi(RF_PORT, CS);
|
107 | while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
|
108 | //_delay_ms(10);
|
109 | }
|
110 |
|
111 | void rf12_txdata(unsigned char *data, unsigned char number)
|
112 | { unsigned char i;
|
113 | rf12_trans(0x8238); // TX on
|
114 | rf12_ready();
|
115 | rf12_trans(0xB8AA);
|
116 | rf12_ready();
|
117 | rf12_trans(0xB8AA);
|
118 | rf12_ready();
|
119 | rf12_trans(0xB8AA);
|
120 | rf12_ready();
|
121 | rf12_trans(0xB82D);
|
122 | rf12_ready();
|
123 | rf12_trans(0xB8D4);
|
124 | for (i=0; i<number; i++)
|
125 | { rf12_ready();
|
126 | rf12_trans(0xB800|(*data++));
|
127 | }
|
128 | rf12_ready();
|
129 | rf12_trans(0x8208); // TX off
|
130 | }
|
131 |
|
132 | void rf12_rxdata(unsigned char *data, unsigned char number)
|
133 | { unsigned char i;
|
134 | rf12_trans(0x82C8); // RX on
|
135 | rf12_trans(0xCA81); // set FIFO mode
|
136 | rf12_trans(0xCA83); // enable FIFO
|
137 | for (i=0; i<number; i++)
|
138 | { rf12_ready();
|
139 | *data++=rf12_trans(0xB000);
|
140 | }
|
141 | rf12_trans(0x8208); // RX off
|
142 | }
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 | unsigned char * receive(void)
|
152 | {
|
153 | unsigned char test[32];
|
154 | rf12_rxdata(test,32);
|
155 | // daten verarbeiten
|
156 | return test;
|
157 | }
|
158 |
|
159 | void send(void)
|
160 | { unsigned char test[]="Dies ist ein 433MHz Test !!!\n ";
|
161 | rf12_txdata(test,32);
|
162 | }
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 | // Testfunktionen
|
172 |
|
173 | void funk_sendetest(void){
|
174 |
|
175 |
|
176 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
177 | rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
178 | rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
|
179 | rf12_setbaud(19200); // 19200 baud
|
180 | rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift
|
181 |
|
182 |
|
183 | //unsigned char i=0;
|
184 | unsigned char i=0;
|
185 |
|
186 |
|
187 | // Displayausgabe
|
188 | lcd_clear();
|
189 | set_cursor(0,1);
|
190 |
|
191 | uart_puts("\r\n\r\n Funktest Senden: \r\n"); // Ausgabe UART
|
192 | lcd_string("Funktest Senden: ESC=exit"); // Ausgabe LCD
|
193 |
|
194 | set_cursor(0,2);
|
195 |
|
196 | while(uart_ask() != 27){ // kein Escape gedrückt ??
|
197 |
|
198 | if(!ENCODERTAST) {
|
199 |
|
200 | beep_short(); // Kurz piepen
|
201 | _delay_ms(500);
|
202 | return; // Programmabbruch
|
203 | }
|
204 |
|
205 |
|
206 | if(i>10){
|
207 | set_cursor(0,2);
|
208 | lcd_string(" ");// Zeile löschen
|
209 | set_cursor(0,2);
|
210 | i=0;
|
211 | }
|
212 |
|
213 | i++;
|
214 |
|
215 |
|
216 | lcd_string("-");
|
217 | send();
|
218 | _delay_ms(1000);
|
219 |
|
220 |
|
221 |
|
222 |
|
223 | }
|
224 |
|
225 |
|
226 |
|
227 |
|
228 | }
|
229 |
|
230 |
|
231 |
|
232 |
|
233 |
|
234 |
|
235 |
|
236 | //
|
237 |
|
238 | void funk_empfangtest(void){
|
239 |
|
240 |
|
241 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
242 | rf12_setfreq(RF12FREQ(433.92)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
243 | rf12_setbandwidth(4, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
|
244 | rf12_setbaud(19200); // 19200 baud
|
245 | rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift
|
246 |
|
247 |
|
248 | //unsigned char i=0;
|
249 | unsigned char i=0;
|
250 | unsigned char * Text;
|
251 |
|
252 |
|
253 | // Displayausgabe
|
254 | lcd_clear();
|
255 | set_cursor(0,1);
|
256 |
|
257 | uart_puts("\r\n\r\n Funktest Empfang: \r\n"); // Ausgabe UART
|
258 | lcd_string("Funktest Empfang: ESC=exit"); // Ausgabe LCD
|
259 |
|
260 | set_cursor(0,2);
|
261 |
|
262 | while(uart_ask() != 27){ // kein Escape gedrückt ??
|
263 |
|
264 | if(!ENCODERTAST) {
|
265 |
|
266 | beep_short(); // Kurz piepen
|
267 | _delay_ms(500);
|
268 | return; // Programmabbruch
|
269 | }
|
270 |
|
271 |
|
272 | if(i>10){
|
273 | set_cursor(0,2);
|
274 | lcd_string(" ");// Zeile löschen
|
275 | set_cursor(0,2);
|
276 | i=0;
|
277 | }
|
278 |
|
279 | i++;
|
280 |
|
281 |
|
282 | Text = receive();
|
283 | set_cursor(0,3);
|
284 | lcd_string(Text);
|
285 |
|
286 |
|
287 |
|
288 |
|
289 |
|
290 | }
|
291 |
|
292 |
|
293 |
|
294 |
|
295 | }
|