1 | #define BAUD_UART 4800UL
|
2 | #ifndef F_CPU
|
3 | #define F_CPU 1000000UL
|
4 | #endif
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include <avr/interrupt.h>
|
8 | #include <avr/pgmspace.h>
|
9 | #include <avr/eeprom.h>
|
10 | #include <stdlib.h>
|
11 | #include <util/delay.h>
|
12 | #include <stdint.h>
|
13 |
|
14 | #define RF_PORT PORTB
|
15 | #define RF_DDR DDRB
|
16 | #define RF_PIN PINB
|
17 |
|
18 | /*
|
19 | rf12 ATmega32
|
20 |
|
21 | SDI <-------- MOSI (PB5)
|
22 | SDO --------> MIS0 (PB6)
|
23 | SCK <-------- SCK (PB7)
|
24 | nSEL <-------- SS <=> CS (PB4)
|
25 | nIERQ --------> INT0 (PD2)
|
26 | VDI --------- INT1 (PD3)
|
27 | */
|
28 |
|
29 | #define SDI PB5
|
30 | #define SDO PB6
|
31 | #define SCK PB7
|
32 | #define CS PB4
|
33 |
|
34 |
|
35 | void USART_Transmit_String( unsigned char *data, uint8_t length );
|
36 | void USART_Transmit( unsigned char data );
|
37 | //***************************************************************************************************
|
38 | #ifndef cbi //cbi(RF_PORT, CS) --> PORTB &= ~(1<<CS)
|
39 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
40 | #endif
|
41 |
|
42 | #ifndef sbi
|
43 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
44 | #endif
|
45 | //***************************************************************************************************
|
46 | uint16_t rf12_trans(uint16_t wert);
|
47 | // transfer 1 word to/from module
|
48 | void rf12_init(void);
|
49 | // initialize module
|
50 | void rf12_setfreq(unsigned short freq);
|
51 | // set center frequency
|
52 | void rf12_setbaud(unsigned short baud);
|
53 | // set baudrate
|
54 | void rf12_setpower(unsigned char power, unsigned char mod);
|
55 | // set transmission settings
|
56 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi);
|
57 | // set receiver settings
|
58 | void rf12_txdata(unsigned char *data, unsigned char number);
|
59 | // transmit number of bytes from array
|
60 | void rf12_rxdata(unsigned char *data, unsigned char number);
|
61 | // receive number of bytes into array
|
62 | void rf12_ready(void);
|
63 | // wait until FIFO ready (to transmit/read data)
|
64 |
|
65 | //*geaendert fuer 868Mhz
|
66 | #define RF12FREQ(freq) ((freq-860.0)/0.005)
|
67 | // macro for calculating frequency value out of frequency in MHz
|
68 | //***************************************************************************************************
|
69 | void USART_Init( void )
|
70 | {
|
71 | uint16_t baud_t = (uint16_t)((uint32_t) F_CPU/(16*BAUD_UART)-1);
|
72 | /* Set baud rate */
|
73 | UBRRH = (unsigned char)(baud_t>>8);
|
74 | UBRRL = (unsigned char)(baud_t);
|
75 | /* Enable receiver and transmitter */
|
76 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
77 | /* Set frame format: 8data, 2stop bit */
|
78 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
|
79 | }
|
80 |
|
81 | void USART_Transmit( unsigned char data )
|
82 | {
|
83 | /* Wait for empty transmit buffer */
|
84 | while ( !( UCSRA & (1<<UDRE)) )
|
85 | ;
|
86 | /* Put data into buffer, sends the data */
|
87 | UDR = data;
|
88 | }
|
89 |
|
90 | void USART_Transmit_String( unsigned char *data, uint8_t length )
|
91 | {
|
92 | for( uint8_t i = 0; i < length; i++ )
|
93 | USART_Transmit( data[i] );
|
94 | }
|
95 | //***************************************************************************************************
|
96 | uint16_t rf12_trans(uint16_t wert)
|
97 | { unsigned short werti=0;
|
98 | unsigned char i;
|
99 |
|
100 | cbi(RF_PORT, CS);
|
101 | for (i=0; i<16; i++)
|
102 | {
|
103 | if (wert&32768) //0b1000 0000 0000 0000
|
104 | sbi(RF_PORT, SDI);
|
105 | else
|
106 | cbi(RF_PORT, SDI);
|
107 |
|
108 | werti<<=1;
|
109 | if (RF_PIN&(1<<SDO))
|
110 | werti|=1;
|
111 |
|
112 | sbi(RF_PORT, SCK);
|
113 | wert<<=1;
|
114 | _delay_us(0.3);
|
115 | cbi(RF_PORT, SCK);
|
116 | }
|
117 | sbi(RF_PORT, CS);
|
118 | return werti;
|
119 | }
|
120 |
|
121 | void rf12_init(void)
|
122 | {
|
123 | RF_DDR = (1<<SDI)|(1<<SCK)|(1<<CS);
|
124 | RF_PORT=(1<<CS);
|
125 | // wait until POR done
|
126 | for (unsigned char i=0; i<10; i++)
|
127 | _delay_ms(10);
|
128 |
|
129 | rf12_trans(0x80E8); //1. Configuration Command --> el und ef = 1; 868MHz band; 12,5pF
|
130 | //rf12_trans(0x ); //2. Power Conmmand
|
131 | rf12_trans(0xA67C); //3. Frequenzy setting Command --> 868,3MHz
|
132 | rf12_trans(0xC646); //4. Data Rate Command ---> cs=0; Bit Rate RAW Physical: 4800
|
133 | rf12_trans(0x9528); //5. Receiver Command ---> VDI output; Medium; 400KHz BW; -6dB -103dbRSSI
|
134 | //rf12_trans(0xc2AC); //6. Datafilter Command ---> al = 1; ml = 0; DQD = 3; digital = 0; analog = 1
|
135 | //rf12_trans(0xCA81); //7. FIFO / Reset Mode Command --> al: sync pattern = 0; FIFO fill = 0; Disable high sens; reset =1
|
136 | //8. Receiver FIFO Mode
|
137 | rf12_trans(0x6253); //9. AFC Command --> ;AFC automatic mode = Offset always; st : Strobe edge = 0;fi : Fine mode = 1
|
138 | // --> ;oe : Offset rgister enable = 1
|
139 | // --> ;en : Calculate offset = 1
|
140 | // --> ;Range limit = +7fres to -8fres
|
141 | //10. TX Config
|
142 | //11. Transmitter Register Write
|
143 | rf12_trans(0xE000); //12. Wake-Up Timer Command --> 0ms
|
144 | rf12_trans(0xC800); //13. Low Duty-Cycle Command --> en : Enable low duty-cycle = 0;Duty-cycle = .66666%
|
145 | rf12_trans(0xc0E0); //14. LB Det./Clock Div. Command--> 10MHz; VIb=2,2V
|
146 | }
|
147 | /*
|
148 | void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
|
149 | {
|
150 | rf12_trans(0x9500|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
|
151 | }
|
152 |
|
153 | void rf12_setfreq(unsigned short freq)
|
154 | { if (freq<96) // 430,2400MHz //868MHz
|
155 | return;
|
156 | else if (freq>3903) // 439,7575MHz
|
157 | freq=3903;
|
158 | rf12_trans(0xA000|freq);
|
159 | }
|
160 |
|
161 | void rf12_setbaud(unsigned short baud)
|
162 | {
|
163 | if (baud<664)
|
164 | baud=664;
|
165 | if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7)
|
166 | rf12_trans(0xC680|((43104/baud)-1));
|
167 | else
|
168 | rf12_trans(0xC600|((344828UL/baud)-1)); // R=344828/Baud-1
|
169 | }
|
170 |
|
171 | void rf12_setpower(unsigned char power, unsigned char mod)
|
172 | {
|
173 | rf12_trans(0x9800|(power&7)|((mod&15)<<4));
|
174 | }
|
175 | */
|
176 | void rf12_ready(void)
|
177 | { cbi(RF_PORT, CS);
|
178 | while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
|
179 | }
|
180 |
|
181 | void rf12_txdata(unsigned char *data, unsigned char number)
|
182 | { unsigned char i;
|
183 | PORTD = (1<<PIND5); //TX_LED_2 on
|
184 | rf12_trans(0x8239); // TX on Power Command
|
185 | rf12_ready();
|
186 | rf12_trans(0xB8AA);
|
187 | rf12_ready();
|
188 | rf12_trans(0xB8AA);
|
189 | rf12_ready();
|
190 | rf12_trans(0xB8AA);
|
191 | rf12_ready();
|
192 | rf12_trans(0xB82D);
|
193 | rf12_ready();
|
194 | rf12_trans(0xB8D4);
|
195 | for (i=0; i<number; i++)
|
196 | { rf12_ready();
|
197 | rf12_trans(0xB800|(*data++));
|
198 | }
|
199 | rf12_ready();
|
200 | PORTD = (!(1<<PIND5));
|
201 | rf12_trans(0x8208); // TX off
|
202 | _delay_ms(1);
|
203 | }
|
204 |
|
205 | void rf12_rxdata(unsigned char *data, unsigned char number)
|
206 | { unsigned char i;
|
207 | PORTD = (1<<PIND6); //RX_LED_1 on
|
208 | rf12_ready();
|
209 | rf12_trans(0x82C8); // RX on Power Command
|
210 | rf12_ready();
|
211 | rf12_trans(0xCA81); // set FIFO mode
|
212 | rf12_ready();
|
213 | rf12_trans(0xCA83); // enable FIFO
|
214 |
|
215 | for (i=0; i<number; i++)
|
216 | { rf12_ready();
|
217 | *data++=rf12_trans(0xB000);
|
218 | }
|
219 |
|
220 | rf12_ready();
|
221 | PORTD = (!(1<<PIND6));//RX_LED off
|
222 | rf12_trans(0x8208); // RX off
|
223 | _delay_ms(1);
|
224 | }
|
225 |
|
226 | //**********************************************************************
|
227 | void send(void);
|
228 | void receive(void);
|
229 |
|
230 | void receive(void){
|
231 | unsigned char test[32];
|
232 | rf12_rxdata(test,32);
|
233 | // daten verarbeiten
|
234 | USART_Transmit_String( test, 32 );
|
235 | }
|
236 |
|
237 | void send(void){
|
238 | unsigned char test[]= "Dies ist ein 868MHz Test !!!\n";
|
239 | rf12_txdata(test,32);
|
240 | USART_Transmit_String( test, 32 );
|
241 | }
|
242 |
|
243 | int main(void){
|
244 |
|
245 | USART_Init();
|
246 | DDRD = 0xff;
|
247 |
|
248 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
|
249 | //rf12_setfreq(RF12FREQ(868.3)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
|
250 | //rf12_setbandwidth(5, 1, 4); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
|
251 | //rf12_setbaud(19200); // 19200 baud
|
252 | //rf12_setpower(0, 6); // 1mW Ausgangangsleistung, 120kHz Frequenzshift
|
253 |
|
254 | for (;;)
|
255 | {
|
256 | //send();
|
257 | //USART_Transmit_String("Test \n", 6);
|
258 | for (unsigned char i=0; i<100; i++)
|
259 | {_delay_ms(10);
|
260 | PORTD = (1<<PIND6);
|
261 | }
|
262 | receive();
|
263 | }
|
264 | }
|