1 | /************************************************************************/
|
2 | /* imports & includes */
|
3 | /************************************************************************/
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <stdlib.h>
|
7 | #include <util/delay.h>
|
8 | #include "lcd.h"
|
9 | #include "uart.h"
|
10 | #include "ZigBee.h"
|
11 | #include "Utility.h"
|
12 | #include "structs.h"
|
13 |
|
14 | /************************************************************************/
|
15 | /* parameters, constants & field variables */
|
16 | /************************************************************************/
|
17 | #define UART_BAUD_RATE 57600UL
|
18 | #define F_CPU 8000000UL
|
19 |
|
20 | #define STATE_READSENSORS 1
|
21 | #define STATE_READSENSORS_ADXL330 2
|
22 | #define STATE_READSENSORS_ADXL345 3
|
23 | #define STATE_SENDOVERUART 4
|
24 | unsigned char sensorMesh_state = STATE_READSENSORS;
|
25 |
|
26 | #define NUMBER_OF_ADCVALUES 10
|
27 | ADCVALUE adcValues[NUMBER_OF_ADCVALUES];
|
28 | char adcValuesPointer = 0;
|
29 |
|
30 | /************************************************************************/
|
31 | /* functions, procedures & methods */
|
32 | /************************************************************************/
|
33 | int main(void)
|
34 | {
|
35 | init();
|
36 | //[debugging]
|
37 | //testSoftware();
|
38 |
|
39 | while(1)
|
40 | {
|
41 | //TODO:: Please write your application code
|
42 |
|
43 | //[debugging]
|
44 | //char rfDataFrame[5];
|
45 | //rfDataFrame[0] = 0x41;
|
46 | //rfDataFrame[1] = 0x41;
|
47 | //rfDataFrame[2] = 0x41;
|
48 | //rfDataFrame[3] = 0x41;
|
49 | //rfDataFrame[4] = 0x41;
|
50 | //ARRAY rfDataFrameArray;
|
51 | //rfDataFrameArray.elements = rfDataFrame;
|
52 | //rfDataFrameArray.size = 5;
|
53 | //sendDataOverZigbee(rfDataFrameArray);
|
54 |
|
55 | sensorMesh_stateMachine();
|
56 | }
|
57 | }
|
58 |
|
59 | /**************************************************************/
|
60 | /* inits */
|
61 | /**************************************************************/
|
62 | void init()
|
63 | {
|
64 | //initDisplay();
|
65 | initLeds();
|
66 | initUart();
|
67 | initAdc();
|
68 | }
|
69 |
|
70 | void initDisplay()
|
71 | {
|
72 | lcd_init(LCD_DISP_ON);
|
73 | lcd_clrscr();
|
74 | }
|
75 |
|
76 | void initAdc()
|
77 | {
|
78 | //Configure the ADC
|
79 |
|
80 | //Enable a prescaler - determinded by the internal/external clock
|
81 | //800/5 = 160, 80/2 = 40 prescaler khz must be between 50khz and 200khz
|
82 | ADCSRA |= (1<<ADPS2) | (1<<ADPS1);
|
83 |
|
84 | //Set reference voltage
|
85 | //ADMUX |= 1<<REFS0 | 1<<REFS1;
|
86 | ADMUX |= (1<<REFS0);
|
87 |
|
88 | //8-bit or 10-bit results (0 for 10 bit and 1 for 8 bit)
|
89 | ADMUX |= (1<<ADLAR);
|
90 |
|
91 | //Set default input channel to AD0 (by default). Nothing to do then.
|
92 |
|
93 | //Enable ADCConverter
|
94 | ADCSRA |= 1<<ADEN;
|
95 |
|
96 | //Enable interrupts function in ADC
|
97 | ADCSRA |= (1<<ADIE);
|
98 |
|
99 | //Enable global interrupts
|
100 | sei();
|
101 |
|
102 | //Start the first conversion
|
103 | ADCSRA |= 1<<ADSC;
|
104 | }
|
105 |
|
106 | void initUart()
|
107 | {
|
108 | uart_init(UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU));
|
109 | sei();
|
110 | }
|
111 |
|
112 | void initLeds()
|
113 | {
|
114 | DDRD = 0xFF;
|
115 |
|
116 | // [debugging] check if LEDs work
|
117 | PORTD = 0x00;
|
118 | }
|
119 |
|
120 | /**************************************************************/
|
121 | /* interrupt handlers */
|
122 | /**************************************************************/
|
123 | ISR(ADC_vect){
|
124 | if(sensorMesh_state == STATE_READSENSORS_ADXL330)
|
125 | {
|
126 | //PORTD = 0xFF;
|
127 |
|
128 | //[debugging]
|
129 | ////LCD String variable declarration
|
130 | //char adcResultHigh[4];
|
131 | //itoa(ADCH, adcResultHigh, 10);
|
132 | //lcd_puts(adcResultHigh);
|
133 | //
|
134 | //char adcResultLow[4];
|
135 | //itoa(ADCL, adcResultLow, 10);
|
136 | //lcd_puts(adcResultLow);
|
137 | //
|
138 | //output to LEDs
|
139 | //char temp = ~ADCL;
|
140 | //PORTD = ADCH;
|
141 | //_delay_ms(100);
|
142 | //
|
143 | ////delay so that lcd is not flashing and clear lcd
|
144 | //_delay_ms(100);
|
145 | //lcd_clrscr();
|
146 | //[/debugging]
|
147 |
|
148 | //Write values to buffer until buffer limit is reached
|
149 | adcValues[adcValuesPointer].adcl = ADCL;
|
150 | adcValues[adcValuesPointer].adch = ADCH;
|
151 | adcValuesPointer++;
|
152 |
|
153 | //[debugging]
|
154 | PORTD = ~(adcValues[adcValuesPointer].adch);
|
155 |
|
156 | //Reset adcValuesPointer if end of buffer is reached and begin next state
|
157 | if(adcValuesPointer == NUMBER_OF_ADCVALUES)
|
158 | {
|
159 | adcValuesPointer = 0;
|
160 | sensorMesh_state = STATE_SENDOVERUART;
|
161 | }
|
162 | }
|
163 | //Start the next conversion
|
164 | ADCSRA |= 1<<ADSC;
|
165 | }
|
166 |
|
167 | /**************************************************************/
|
168 | /* routines */
|
169 | /**************************************************************/
|
170 | void sendDataOverZigbee(ARRAY rfDataArray)
|
171 | {
|
172 | //prepare result frame
|
173 | char resultFrame[18 + rfDataArray.size];
|
174 | ARRAY resultFrameArray;
|
175 | resultFrameArray.size = 23;
|
176 | resultFrameArray.elements = resultFrame;
|
177 |
|
178 | //set address
|
179 | char destinationAddress[8];
|
180 | destinationAddress[0] = 0x00;
|
181 | destinationAddress[1] = 0x13;
|
182 | destinationAddress[2] = 0xA2;
|
183 | destinationAddress[3] = 0x00;
|
184 | destinationAddress[4] = 0x40;
|
185 | destinationAddress[5] = 0xC2;
|
186 | destinationAddress[6] = 0x84;
|
187 | destinationAddress[7] = 0xEE;
|
188 | ARRAY destinationAddressArray;
|
189 | destinationAddressArray.size = 8;
|
190 | destinationAddressArray.elements = destinationAddress;
|
191 |
|
192 | //set 16 bit address
|
193 | char destination16BitAddress[2];
|
194 | destination16BitAddress[0] = 0xFF;
|
195 | destination16BitAddress[1] = 0xFF;
|
196 | ARRAY destination16BitAddressArray;
|
197 | destination16BitAddressArray.size = 2;
|
198 | destination16BitAddressArray.elements = destination16BitAddress;
|
199 |
|
200 | //set broadcast radius
|
201 | char broadcastRadius = 0x00;
|
202 |
|
203 | //set rf data from parameter
|
204 |
|
205 | //create zigbee transmit request message frame
|
206 | zigbee_createTransmitRequestMessageFrame(resultFrameArray, 0x01, destinationAddressArray, destination16BitAddressArray, broadcastRadius, 0x00, rfDataArray);
|
207 |
|
208 | //sending data over uart
|
209 | for(int i = 0; i < resultFrameArray.size; i++)
|
210 | {
|
211 | uart_putc(resultFrameArray.elements[i]);
|
212 | }
|
213 | }
|
214 |
|
215 | void sensorMesh_sendAllDataToZigbee()
|
216 | {
|
217 | //Send all read values from ADXL330
|
218 | for(int i = 0; i < NUMBER_OF_ADCVALUES; i++)
|
219 | {
|
220 | char rfDataFrame[2];
|
221 | rfDataFrame[0] = adcValues[i].adcl;
|
222 | rfDataFrame[1] = adcValues[i].adch;
|
223 | ARRAY rfDataFrameArray;
|
224 | rfDataFrameArray.elements = rfDataFrame;
|
225 | rfDataFrameArray.size = 2;
|
226 | sendDataOverZigbee(rfDataFrameArray);
|
227 | }
|
228 |
|
229 | //Send all read values from ADXL345
|
230 |
|
231 | }
|
232 |
|
233 | void sensorMesh_stateMachine()
|
234 | {
|
235 | switch(sensorMesh_state) {
|
236 | case STATE_READSENSORS:
|
237 | //Read values from sensors and write to buffer
|
238 | //---Read values from adxl 330 and write to buffer
|
239 | sensorMesh_state = STATE_READSENSORS_ADXL330;
|
240 | //---Read values from adxl 345 and write to buffer
|
241 | //sensorMesh_state = STATE_READSENSORS_ADXL345;
|
242 | //if all sensores are done, set machine state to send over uart
|
243 | break;
|
244 |
|
245 | case STATE_SENDOVERUART:
|
246 | //Send data from buffers over uart
|
247 | sensorMesh_sendAllDataToZigbee();
|
248 | //Set machine state to read sensor values
|
249 | sensorMesh_state = STATE_READSENSORS;
|
250 | break;
|
251 |
|
252 | default:
|
253 | //do nothing now
|
254 | break;
|
255 | }
|
256 | }
|
257 |
|
258 | void sensorMesh_nextState()
|
259 | {
|
260 | sensorMesh_state++;
|
261 | }
|
262 |
|
263 | void sensorMesh_previousState()
|
264 | {
|
265 | sensorMesh_state--;
|
266 | }
|
267 |
|
268 | /**************************************************************/
|
269 | /* testing routines */
|
270 | /**************************************************************/
|
271 | void testSoftware()
|
272 | {
|
273 | testUartConnection();
|
274 | }
|
275 |
|
276 | void testUartConnection()
|
277 | {
|
278 | while(1)
|
279 | {
|
280 | //prepare result frame
|
281 | char resultFrame[23];
|
282 | ARRAY resultFrameArray;
|
283 | resultFrameArray.size = 23;
|
284 | resultFrameArray.elements = resultFrame;
|
285 |
|
286 | //set address
|
287 | char destinationAddress[8];
|
288 | destinationAddress[0] = 0x00;
|
289 | destinationAddress[1] = 0x13;
|
290 | destinationAddress[2] = 0xA2;
|
291 | destinationAddress[3] = 0x00;
|
292 | destinationAddress[4] = 0x40;
|
293 | destinationAddress[5] = 0xC2;
|
294 | destinationAddress[6] = 0x84;
|
295 | destinationAddress[7] = 0xEE;
|
296 | ARRAY destinationAddressArray;
|
297 | destinationAddressArray.size = 8;
|
298 | destinationAddressArray.elements = destinationAddress;
|
299 |
|
300 | //set 16 bit address
|
301 | char destination16BitAddress[2];
|
302 | destination16BitAddress[0] = 0xFF;
|
303 | destination16BitAddress[1] = 0xFF;
|
304 | ARRAY destination16BitAddressArray;
|
305 | destination16BitAddressArray.size = 2;
|
306 | destination16BitAddressArray.elements = destination16BitAddress;
|
307 |
|
308 | //set broadcast radius
|
309 | char broadcastRadius = 0x00;
|
310 |
|
311 | //set data
|
312 | char rfData[5];
|
313 | rfData[0] = 0x41;
|
314 | rfData[1] = 0x42;
|
315 | rfData[2] = 0x43;
|
316 | rfData[3] = 0x44;
|
317 | rfData[4] = 0x45;
|
318 | ARRAY rfDataArray;
|
319 | rfDataArray.size = 5;
|
320 | rfDataArray.elements = rfData;
|
321 |
|
322 | //create zigbee transmit request message frame
|
323 | zigbee_createTransmitRequestMessageFrame(resultFrameArray, 0x01, destinationAddressArray, destination16BitAddressArray, broadcastRadius, 0x00, rfDataArray);
|
324 |
|
325 | //sending data over uart
|
326 | for(int i = 0; i < resultFrameArray.size; i++)
|
327 | {
|
328 | uart_putc(resultFrameArray.elements[i]);
|
329 | }
|
330 | }
|
331 | }
|