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

Annotation of /trunk/Embedded/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 151 - (hide annotations) (download)
Wed Dec 5 07:30:04 2007 UTC (16 years, 6 months ago) by hedin
File MIME type: text/plain
File size: 7728 byte(s)
trobble recieving data.
1 hedin 82 #include <pic18.h>
2     #include <stdio.h>
3 hedin 148 #include <htc.h>
4 hedin 82 #include <string.h>
5 hedin 148
6 hedin 82 #include "lcd.h"
7 hedin 137 #include "Delay.h"
8 hedin 109 // Delay.h is included inside lcd.c
9 hedin 82
10 hedin 109 #define LCD_LENGTH 16
11     #define LCD_ROWS 2
12 hedin 150 #define BUFFER 128
13 hedin 148 #define PWRFAIL RB1
14     #define FIREDET RB2
15     #define FEEDING RB3
16     #define EMPTYTANK RB4
17 hedin 109
18    
19 hedin 137 unsigned char global_Pot_Hi, global_Pot_Lo;
20 hedin 109 unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH];
21 hedin 150 unsigned char global_serial_send[BUFFER], global_serial_recieve_buffer[BUFFER];
22 hedin 148 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 hedin 137
27 hedin 151 unsigned char global_lcd_buf[16];
28    
29 hedin 150 unsigned short global_imei_tversum;
30    
31 hedin 148 unsigned char cell_nr[15] = ""; // = "21681784";
32 hedin 150 bit global_modem_init = 0;
33 hedin 148
34     __EEPROM_DATA( 60, 0, 1, 8, '2', '1', '6', '8');
35     __EEPROM_DATA( '1', '7', '8', '4',0,0,0,0);
36    
37 hedin 137 void serial_recieved(void);
38 hedin 139 void serial_send(void);
39     void update_lcd(void);
40 hedin 148 void convertTemp(void);
41     void timer1_interrupt(void);
42 hedin 150 void on_recieve(void);
43     void on_initial_recieve(void);
44 hedin 137
45 hedin 150
46     void reset_recieve_buffer(void)
47 hedin 109 {
48 hedin 150 global_recieve_done = 0;
49     global_serial_byte_counter=0;
50     }
51    
52    
53     void ad_init(void) // Nicked from H7
54     {
55 hedin 109 // AD Conversion clock
56     ADCS0 = 0;
57     ADCS1 = 0;
58     ADCS2 = 0;
59 hedin 82
60 hedin 109 //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 hedin 148 //Result is right justified
73     ADFM=1;
74 hedin 109
75     //Fire up for A/D converter module
76     ADON=1;
77     }
78    
79 hedin 82 void rs232_init(void)
80     {
81     SPEN = 0; // Serial Port Enable Bit... 0 = disabled
82 hedin 137 TRISC6 = 0;
83 hedin 82 TRISC7 = 1;
84 hedin 137
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 hedin 82 }
90    
91     void interrupt_init(void)
92     {
93     // Assumes that all interrupts default is 0
94     PEIE = 1;
95     GIE = 1;
96 hedin 137 RCIE = 1; // Recieve interrupt enable.
97     IPEN = 0; // Nfo interrupt priority
98     TXIE = 0; // Serial interrupt enabled
99 hedin 148 TMR1IE = 1; // Enables timer 1
100 hedin 82 }
101    
102 hedin 148 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 hedin 82 void pic18_io_init(void)
118     {
119 hedin 109 TRISA0 = 1; // analog input
120 hedin 148 TRISA1 = 0; // Output
121 hedin 109 TRISB1 = 1; // TRISB1-4 Digital input
122 hedin 82 TRISB2 = 1;
123     TRISB3 = 1;
124     TRISB4 = 1;
125     }
126    
127 hedin 137 void sms_init(void)
128 hedin 82 {
129 hedin 148 int i;
130    
131 hedin 150 reset_recieve_buffer();
132 hedin 148 sprintf(global_serial_send,"at+cgsn\r");
133     serial_send();
134     DelaySek(1);
135     while(!global_recieve_done) ;
136    
137    
138 hedin 139 sprintf(global_serial_send,"%s", "at+cpin=8043\r");
139     serial_send();
140    
141 hedin 150 while(global_modem_init == 0)
142     {
143     on_initial_recieve();
144     }
145 hedin 82 }
146    
147 hedin 148
148 hedin 82 void interrupt interrupt_handler(void)
149     {
150 hedin 109 // Finds out what interrupt have been trigged, and starts the respective function.
151 hedin 137 if(RCIF == 1) // Serial recieve interrupt
152 hedin 82 {
153 hedin 137 serial_recieved();
154 hedin 82 RCIF = 0;
155     }
156 hedin 148
157     if(TMR1IF == 1) // timer1 interrupt trigger.
158     {
159     timer1_interrupt();
160     TMR1IF = 0;
161     }
162 hedin 82 }
163 hedin 109
164 hedin 137
165     void serial_send(void)
166     {
167     int i;
168 hedin 148 char data_byte;
169 hedin 150 for(i = 0; i < BUFFER; i++)
170 hedin 109 {
171 hedin 148 data_byte = global_serial_send[i];
172     if( data_byte == '\r')
173 hedin 150 i = (BUFFER - 1);
174 hedin 148 TXREG = data_byte;
175 hedin 139 while(TRMT==0) ;
176 hedin 148 DelayMs(10);
177 hedin 109 }
178 hedin 148 DelayMs(250);
179     DelayMs(250);
180 hedin 137 }
181    
182     void serial_recieved(void)
183     {
184 hedin 148 char data_byte, saved_data[LCD_LENGTH];
185 hedin 137
186 hedin 148 data_byte = RCREG;
187 hedin 137
188 hedin 150 if (data_byte == '\n')
189     return;
190 hedin 151
191     if (global_serial_byte_counter == 0 && data_byte == '\r')
192     return;
193 hedin 150
194 hedin 148 global_serial_recieve_buffer[global_serial_byte_counter] = data_byte;
195 hedin 150
196     if (data_byte == '\r')
197 hedin 137 {
198     global_recieve_done = 1;
199 hedin 150 //global_serial_byte_counter = 0;
200     global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate
201 hedin 137 }
202 hedin 109 else
203     {
204 hedin 137 global_serial_byte_counter++;
205 hedin 109 }
206    
207 hedin 137 }
208 hedin 148
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 hedin 139 void update_lcd(void)
219     {
220 hedin 148 lcd_clear();
221     lcd_goto(0x00);
222 hedin 151
223     sprintf(global_lcd_buf, "%d", global_temp);
224     lcd_puts(global_lcd_buf);
225 hedin 148
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 hedin 139 {
264 hedin 148 eeprom_write(i+4, cell_nr[i] );
265 hedin 139 }
266     }
267 hedin 148
268     void eeprom_reader(void)
269     {
270     char len,i;
271 hedin 109
272 hedin 148 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 hedin 150 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 hedin 148 void on_recieve(void)
313     {
314 hedin 150 char tmp[17];
315 hedin 151 char* ptr;
316     tmp[0]=0;
317    
318 hedin 150 if (global_recieve_done == 0)
319     return;
320 hedin 151
321 hedin 150 lcd_goto(0x00);
322 hedin 151 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 hedin 150 lcd_puts(tmp);
332 hedin 151
333 hedin 150 }
334 hedin 148
335 hedin 150 reset_recieve_buffer();
336 hedin 148 }
337    
338 hedin 82 void main()
339     {
340 hedin 148 ////////////////////
341     // Running Init's //
342 hedin 109
343     // Running init for various components.
344 hedin 148 pic18_io_init();
345     rs232_init();
346 hedin 109 ad_init();
347     lcd_init(0);
348 hedin 137 interrupt_init();
349 hedin 139 sms_init();
350 hedin 148 //eeprom_init();
351     timer_init();
352     eeprom_reader();
353     ///////////////
354     // Main loop //
355 hedin 150
356 hedin 151 DelayMs(50);
357     reset_recieve_buffer();
358 hedin 150
359 hedin 109 while(1)
360 hedin 100 {
361 hedin 148 // 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 hedin 109 // 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 hedin 148 convertTemp();
389 hedin 151 //update_lcd();
390 hedin 112 GODONE = 1;
391 hedin 109 }
392 hedin 151 // Handels the recieve sms'es.
393     on_recieve();
394 hedin 100 }
395 hedin 82 }

  ViewVC Help
Powered by ViewVC 1.1.20