/[H9]/trunk/Embedded/main.c
ViewVC logotype

Contents of /trunk/Embedded/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 151 - (show annotations) (download)
Wed Dec 5 07:30:04 2007 UTC (16 years, 5 months ago) by hedin
File MIME type: text/plain
File size: 7728 byte(s)
trobble recieving data.
1 #include <pic18.h>
2 #include <stdio.h>
3 #include <htc.h>
4 #include <string.h>
5
6 #include "lcd.h"
7 #include "Delay.h"
8 // Delay.h is included inside lcd.c
9
10 #define LCD_LENGTH 16
11 #define LCD_ROWS 2
12 #define BUFFER 128
13 #define PWRFAIL RB1
14 #define FIREDET RB2
15 #define FEEDING RB3
16 #define EMPTYTANK RB4
17
18
19 unsigned char global_Pot_Hi, global_Pot_Lo;
20 unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH];
21 unsigned char global_serial_send[BUFFER], global_serial_recieve_buffer[BUFFER];
22 bit global_recieve_done = 0, global_interval_changed = 0;
23 unsigned int global_serial_byte_counter = 0, global_sms_counter = 1, global_time_counter = 0;
24 unsigned int global_emergency_counter = 600, global_time_interval = 3600;
25 unsigned char global_temp = 0;
26
27 unsigned char global_lcd_buf[16];
28
29 unsigned short global_imei_tversum;
30
31 unsigned char cell_nr[15] = ""; // = "21681784";
32 bit global_modem_init = 0;
33
34 __EEPROM_DATA( 60, 0, 1, 8, '2', '1', '6', '8');
35 __EEPROM_DATA( '1', '7', '8', '4',0,0,0,0);
36
37 void serial_recieved(void);
38 void serial_send(void);
39 void update_lcd(void);
40 void convertTemp(void);
41 void timer1_interrupt(void);
42 void on_recieve(void);
43 void on_initial_recieve(void);
44
45
46 void reset_recieve_buffer(void)
47 {
48 global_recieve_done = 0;
49 global_serial_byte_counter=0;
50 }
51
52
53 void ad_init(void) // Nicked from H7
54 {
55 // AD Conversion clock
56 ADCS0 = 0;
57 ADCS1 = 0;
58 ADCS2 = 0;
59
60 //Select AN0/RA0 for AD source
61 // In this (000) setup, it's only RA0/AN0 that does ad convertion.
62 CHS0=0;
63 CHS1=0;
64 CHS2=0;
65
66 //Only AN0 is selected for AD and with Vdd/Vss as limits
67 PCFG0=0;
68 PCFG1=1;
69 PCFG2=1;
70 PCFG3=1;
71
72 //Result is right justified
73 ADFM=1;
74
75 //Fire up for A/D converter module
76 ADON=1;
77 }
78
79 void rs232_init(void)
80 {
81 SPEN = 0; // Serial Port Enable Bit... 0 = disabled
82 TRISC6 = 0;
83 TRISC7 = 1;
84
85 SPBRG = 207; // 1200 baud rate... 25 = 9600
86 // x = (Fosc / (16*[baud rate]) )-1
87 TXSTA = 0x24; // Enables BRGH and TXEN inthe TXSTA register
88 RCSTA = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register
89 }
90
91 void interrupt_init(void)
92 {
93 // Assumes that all interrupts default is 0
94 PEIE = 1;
95 GIE = 1;
96 RCIE = 1; // Recieve interrupt enable.
97 IPEN = 0; // Nfo interrupt priority
98 TXIE = 0; // Serial interrupt enabled
99 TMR1IE = 1; // Enables timer 1
100 }
101
102 void timer_init(void)
103 {
104 TMR1CS = 1; //use external clock
105
106 T1CKPS1 = 1; //1:8 prescale
107 T1CKPS0 = 1;
108
109 TMR1H = 0xEF;
110 TMR1L = 0xFF;
111
112 T1OSCEN = 1; //enable oscillator circuit
113 RD16 = 0; //normal 8 bit writes
114 TMR1ON = 1;
115 }
116
117 void pic18_io_init(void)
118 {
119 TRISA0 = 1; // analog input
120 TRISA1 = 0; // Output
121 TRISB1 = 1; // TRISB1-4 Digital input
122 TRISB2 = 1;
123 TRISB3 = 1;
124 TRISB4 = 1;
125 }
126
127 void sms_init(void)
128 {
129 int i;
130
131 reset_recieve_buffer();
132 sprintf(global_serial_send,"at+cgsn\r");
133 serial_send();
134 DelaySek(1);
135 while(!global_recieve_done) ;
136
137
138 sprintf(global_serial_send,"%s", "at+cpin=8043\r");
139 serial_send();
140
141 while(global_modem_init == 0)
142 {
143 on_initial_recieve();
144 }
145 }
146
147
148 void interrupt interrupt_handler(void)
149 {
150 // Finds out what interrupt have been trigged, and starts the respective function.
151 if(RCIF == 1) // Serial recieve interrupt
152 {
153 serial_recieved();
154 RCIF = 0;
155 }
156
157 if(TMR1IF == 1) // timer1 interrupt trigger.
158 {
159 timer1_interrupt();
160 TMR1IF = 0;
161 }
162 }
163
164
165 void serial_send(void)
166 {
167 int i;
168 char data_byte;
169 for(i = 0; i < BUFFER; i++)
170 {
171 data_byte = global_serial_send[i];
172 if( data_byte == '\r')
173 i = (BUFFER - 1);
174 TXREG = data_byte;
175 while(TRMT==0) ;
176 DelayMs(10);
177 }
178 DelayMs(250);
179 DelayMs(250);
180 }
181
182 void serial_recieved(void)
183 {
184 char data_byte, saved_data[LCD_LENGTH];
185
186 data_byte = RCREG;
187
188 if (data_byte == '\n')
189 return;
190
191 if (global_serial_byte_counter == 0 && data_byte == '\r')
192 return;
193
194 global_serial_recieve_buffer[global_serial_byte_counter] = data_byte;
195
196 if (data_byte == '\r')
197 {
198 global_recieve_done = 1;
199 //global_serial_byte_counter = 0;
200 global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate
201 }
202 else
203 {
204 global_serial_byte_counter++;
205 }
206
207 }
208
209 void timer1_interrupt(void)
210 {
211 TMR1H = 0xEF;
212 TMR1L = 0xFF;
213 global_time_counter++;
214 global_emergency_counter++;
215 RA1 = !RA1;
216 }
217
218 void update_lcd(void)
219 {
220 lcd_clear();
221 lcd_goto(0x00);
222
223 sprintf(global_lcd_buf, "%d", global_temp);
224 lcd_puts(global_lcd_buf);
225
226 }
227
228 void send_update(void)
229 {
230 sprintf(global_serial_send, "at+cmgs=\"%s\"\r", cell_nr);
231 serial_send();
232 sprintf(global_serial_send, "%d:%d:%d:%d:%d:%d%c", global_sms_counter, global_temp, FIREDET, EMPTYTANK, FEEDING, PWRFAIL, 0x1A);
233 lcd_goto(40);
234 lcd_puts(global_serial_send);
235 serial_send();
236 DelayMs(250);
237 global_sms_counter++;
238 }
239
240 void convertTemp()
241 {
242 short adVal;
243 adVal = (global_Pot_Hi << 8) | global_Pot_Lo;
244 if( adVal >=840 )
245 global_temp = 100;
246 else
247 global_temp = (adVal / 8.3886);
248 }
249
250
251
252 void eeprom_writer(void)
253 {
254 char len,i;
255
256 len = strlen(cell_nr);
257 eeprom_write(0, (global_time_interval/60));
258 eeprom_write(1, global_sms_counter>>8);
259 eeprom_write(2, global_sms_counter);
260 eeprom_write(3, len);
261
262 for (i=0; i<len; ++i)
263 {
264 eeprom_write(i+4, cell_nr[i] );
265 }
266 }
267
268 void eeprom_reader(void)
269 {
270 char len,i;
271
272 global_time_interval = eeprom_read(0);
273 global_time_interval *= 60;
274 global_sms_counter = (eeprom_read(1)<<8) | eeprom_read(2);
275 len = eeprom_read(3);
276
277 for (i=0; i<len; ++i)
278 {
279 cell_nr[i] = eeprom_read(i+4);
280 }
281
282 cell_nr[i] = 0; //zero terminated!
283 }
284
285 void on_initial_recieve(void)
286 {
287 char imei[16];
288 char* ptr;
289 char i;
290
291 if (strstr(global_serial_recieve_buffer,"+WIND: 11") != 0)
292 {
293 global_modem_init = 1;
294
295 ptr = strstr(global_serial_recieve_buffer,"cgsn");
296 ptr +=4;
297 strncpy(imei, ptr,15);
298 imei[15] = 0;
299
300 global_imei_tversum = 0;
301 for (i=0; i<15; ++i)
302 {
303 global_imei_tversum += (imei[i] - '0');
304 }
305
306
307 reset_recieve_buffer();
308 }
309 }
310
311
312 void on_recieve(void)
313 {
314 char tmp[17];
315 char* ptr;
316 tmp[0]=0;
317
318 if (global_recieve_done == 0)
319 return;
320
321 lcd_goto(0x00);
322 lcd_puts(global_serial_recieve_buffer);
323
324 if (strstr(global_serial_recieve_buffer,"CMTI") == 0)
325 {
326 ptr = strstr(global_serial_recieve_buffer,"'");
327 strcat(tmp,ptr);
328
329
330 lcd_goto(0x40);
331 lcd_puts(tmp);
332
333 }
334
335 reset_recieve_buffer();
336 }
337
338 void main()
339 {
340 ////////////////////
341 // Running Init's //
342
343 // Running init for various components.
344 pic18_io_init();
345 rs232_init();
346 ad_init();
347 lcd_init(0);
348 interrupt_init();
349 sms_init();
350 //eeprom_init();
351 timer_init();
352 eeprom_reader();
353 ///////////////
354 // Main loop //
355
356 DelayMs(50);
357 reset_recieve_buffer();
358
359 while(1)
360 {
361 // If there happends to be a critical state on the system, we send a sms.
362 if( (global_temp >= 90 || PWRFAIL == 1 || FIREDET == 0 || FEEDING == 1 || EMPTYTANK == 1) && global_emergency_counter >= 600 )
363 {
364 send_update();
365 global_emergency_counter = 0;
366 }
367 // Every X sec. a status sms is send.
368 if(global_time_counter >= 3600)
369 {
370 send_update();
371 global_time_counter = 0;
372 }
373 // To avoid buffer overrun.
374 if( global_emergency_counter > 7200 )
375 global_emergency_counter = 600;
376
377 // Checks if there has been recieved a config sms.
378 if(global_interval_changed )
379 {
380 eeprom_writer();
381 global_interval_changed = 0;
382 }
383 // Checking if A/D convertion is done, and save the data in global_Pot_??
384 if(GODONE==0)
385 {
386 global_Pot_Hi = ADRESH;
387 global_Pot_Lo = ADRESL;
388 convertTemp();
389 //update_lcd();
390 GODONE = 1;
391 }
392 // Handels the recieve sms'es.
393 on_recieve();
394 }
395 }

  ViewVC Help
Powered by ViewVC 1.1.20