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

Diff of /trunk/Embedded/main.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.137  
changed lines
  Added in v.150

  ViewVC Help
Powered by ViewVC 1.1.20