/[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 112 by hedin, Fri Nov 30 16:07:03 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"
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;  unsigned char global_Pot_Hi, global_Pot_Lo;
 unsigned char global_Pot_Lo;  
20  unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH];  unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH];
21  /*void AD_init(void)  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 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);
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    
44    void reset_recieve_buffer(void)
45  {  {
46          ADON    = 1;          global_recieve_done = 0;
47  }          global_serial_byte_counter=0;
48  */  }      
49  // Nicked from H7  
50  void ad_init(void)  
51    void ad_init(void) // Nicked from H7
52  {  {
53          // AD Conversion clock          // AD Conversion clock
54          ADCS0 = 0;          ADCS0 = 0;
# Line 36  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 46  void ad_init(void) Line 77  void ad_init(void)
77  void rs232_init(void)  void rs232_init(void)
78  {  {
79          SPEN    = 0;    // Serial Port Enable Bit... 0 = disabled          SPEN    = 0;    // Serial Port Enable Bit... 0 = disabled
80          TRISC6  = 0;          TRISC6  = 0;    
81          TRISC7  = 1;          TRISC7  = 1;
82          SYNC    = 0;    // SYNC switches between async(0) and sync(1) mode.  
83          SPBRG   = 25;          SPBRG   = 207;  // 1200 baud rate... 25 = 9600
84          TXSTA   = 0x24;                                          // x = (Fosc / (16*[baud rate]) )-1
85          RCSTA   = 0x90;          TXSTA   = 0x24; // Enables BRGH and TXEN inthe TXSTA register
86          SPEN    = 1;          RCSTA   = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register
87  }  }
88    
89  void interrupt_init(void)  void interrupt_init(void)
# Line 60  void interrupt_init(void) Line 91  void interrupt_init(void)
91          // Assumes that all interrupts default is 0          // Assumes that all interrupts default is 0
92          PEIE    = 1;          PEIE    = 1;
93          GIE             = 1;          GIE             = 1;
94          RCIE    = 1;          RCIE    = 1;    // Recieve interrupt enable.
95            IPEN    = 0;    // Nfo interrupt priority
96            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;
122          TRISB4  = 1;          TRISB4  = 1;
123  }        }      
124    
125  void interrupt_recieve_handler(void)  void sms_init(void)
126  {  {
127          // Handle recieve inputs...          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.
149          if(RCIF == 1)          if(RCIF == 1)                   // Serial recieve interrupt
150          {          {
151                  interrupt_recieve_handler();                  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)
164    {
165            int i;
166            char data_byte;
167            for(i = 0; i < BUFFER; i++)
168            {
169                    data_byte = global_serial_send[i];
170                    if( data_byte == '\r')
171                            i = (BUFFER - 1);
172                    TXREG = data_byte;
173                    while(TRMT==0) ;
174                    DelayMs(10);
175            }
176            DelayMs(250);
177            DelayMs(250);
178    }      
179    
180    void serial_recieved(void)
181    {
182            char data_byte, saved_data[LCD_LENGTH];
183            
184            data_byte = RCREG;
185            
186            if (data_byte == '\n')
187                    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;
194                    //global_serial_byte_counter = 0;
195                    global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate
196            }      
197            else
198            {
199                    global_serial_byte_counter++;
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)  void update_lcd(void)
214  {        {
215          char toLCD0[LCD_LENGTH], toLCD1[LCD_LENGTH];          lcd_clear();
         char B1[LCD_LENGTH];  
         char sprintF[LCD_LENGTH];  
216          lcd_goto(0x00);          lcd_goto(0x00);
217          sprintf(toLCD0, "%s", "Ejdesgaard");          lcd_puts(global_temp);
218          if(RB1)  
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                  sprintf(B1, "Pwr%s", "True");                  eeprom_write(i+4, cell_nr[i] );
258          }          }
259          else  }
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                  sprintf(B1, "%s", "False");                  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          }          }
         lcd_puts(B1);  
302                    
303          lcd_goto(0x40);  
304          sprintf(sprintF,"%08d%08d", global_Pot_Hi, global_Pot_Lo);  }
305          lcd_puts(sprintF);  
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();
337            sms_init();
338            //eeprom_init();
339            timer_init();
340            eeprom_reader();
341    ///////////////
342    // Main loop //
343    
 /////////////////////////////////////////////  
 // Main loop  
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          update_lcd();                  //if (global_recieve_done)
380                    //{
381                            on_recieve();
382                    //      global_recieve_done = 0;
383                    //      global_serial_byte_counter = 0;
384                    //}
385          }          }
386  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.20