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

Annotation of /trunk/Embedded/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 150 - (hide annotations) (download)
Tue Dec 4 19:07:00 2007 UTC (16 years, 6 months ago) by hedin
File MIME type: text/plain
File size: 7552 byte(s)
So far so good
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 150 unsigned short global_imei_tversum;
28    
29 hedin 148 unsigned char cell_nr[15] = ""; // = "21681784";
30 hedin 150 bit global_modem_init = 0;
31 hedin 148
32     __EEPROM_DATA( 60, 0, 1, 8, '2', '1', '6', '8');
33     __EEPROM_DATA( '1', '7', '8', '4',0,0,0,0);
34    
35 hedin 137 void serial_recieved(void);
36 hedin 139 void serial_send(void);
37     void update_lcd(void);
38 hedin 148 void convertTemp(void);
39     void timer1_interrupt(void);
40 hedin 150 void on_recieve(void);
41     void on_initial_recieve(void);
42 hedin 137
43 hedin 150
44     void reset_recieve_buffer(void)
45 hedin 109 {
46 hedin 150 global_recieve_done = 0;
47     global_serial_byte_counter=0;
48     }
49    
50    
51     void ad_init(void) // Nicked from H7
52     {
53 hedin 109 // AD Conversion clock
54     ADCS0 = 0;
55     ADCS1 = 0;
56     ADCS2 = 0;
57 hedin 82
58 hedin 109 //Select AN0/RA0 for AD source
59     // In this (000) setup, it's only RA0/AN0 that does ad convertion.
60     CHS0=0;
61     CHS1=0;
62     CHS2=0;
63    
64     //Only AN0 is selected for AD and with Vdd/Vss as limits
65     PCFG0=0;
66     PCFG1=1;
67     PCFG2=1;
68     PCFG3=1;
69    
70 hedin 148 //Result is right justified
71     ADFM=1;
72 hedin 109
73     //Fire up for A/D converter module
74     ADON=1;
75     }
76    
77 hedin 82 void rs232_init(void)
78     {
79     SPEN = 0; // Serial Port Enable Bit... 0 = disabled
80 hedin 137 TRISC6 = 0;
81 hedin 82 TRISC7 = 1;
82 hedin 137
83     SPBRG = 207; // 1200 baud rate... 25 = 9600
84     // x = (Fosc / (16*[baud rate]) )-1
85     TXSTA = 0x24; // Enables BRGH and TXEN inthe TXSTA register
86     RCSTA = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register
87 hedin 82 }
88    
89     void interrupt_init(void)
90     {
91     // Assumes that all interrupts default is 0
92     PEIE = 1;
93     GIE = 1;
94 hedin 137 RCIE = 1; // Recieve interrupt enable.
95     IPEN = 0; // Nfo interrupt priority
96     TXIE = 0; // Serial interrupt enabled
97 hedin 148 TMR1IE = 1; // Enables timer 1
98 hedin 82 }
99    
100 hedin 148 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 hedin 82 void pic18_io_init(void)
116     {
117 hedin 109 TRISA0 = 1; // analog input
118 hedin 148 TRISA1 = 0; // Output
119 hedin 109 TRISB1 = 1; // TRISB1-4 Digital input
120 hedin 82 TRISB2 = 1;
121     TRISB3 = 1;
122     TRISB4 = 1;
123     }
124    
125 hedin 137 void sms_init(void)
126 hedin 82 {
127 hedin 148 int i;
128    
129 hedin 150 reset_recieve_buffer();
130 hedin 148 sprintf(global_serial_send,"at+cgsn\r");
131     serial_send();
132     DelaySek(1);
133     while(!global_recieve_done) ;
134    
135    
136 hedin 139 sprintf(global_serial_send,"%s", "at+cpin=8043\r");
137     serial_send();
138    
139 hedin 150 while(global_modem_init == 0)
140     {
141     on_initial_recieve();
142     }
143 hedin 82 }
144    
145 hedin 148
146 hedin 82 void interrupt interrupt_handler(void)
147     {
148 hedin 109 // Finds out what interrupt have been trigged, and starts the respective function.
149 hedin 137 if(RCIF == 1) // Serial recieve interrupt
150 hedin 82 {
151 hedin 137 serial_recieved();
152 hedin 82 RCIF = 0;
153     }
154 hedin 148
155     if(TMR1IF == 1) // timer1 interrupt trigger.
156     {
157     timer1_interrupt();
158     TMR1IF = 0;
159     }
160 hedin 82 }
161 hedin 109
162 hedin 137
163     void serial_send(void)
164     {
165     int i;
166 hedin 148 char data_byte;
167 hedin 150 for(i = 0; i < BUFFER; i++)
168 hedin 109 {
169 hedin 148 data_byte = global_serial_send[i];
170     if( data_byte == '\r')
171 hedin 150 i = (BUFFER - 1);
172 hedin 148 TXREG = data_byte;
173 hedin 139 while(TRMT==0) ;
174 hedin 148 DelayMs(10);
175 hedin 109 }
176 hedin 148 DelayMs(250);
177     DelayMs(250);
178 hedin 137 }
179    
180     void serial_recieved(void)
181     {
182 hedin 148 char data_byte, saved_data[LCD_LENGTH];
183 hedin 137
184 hedin 148 data_byte = RCREG;
185 hedin 137
186 hedin 150 if (data_byte == '\n')
187     return;
188    
189 hedin 148 global_serial_recieve_buffer[global_serial_byte_counter] = data_byte;
190 hedin 150
191     if (data_byte == '\r')
192 hedin 137 {
193     global_recieve_done = 1;
194 hedin 150 //global_serial_byte_counter = 0;
195     global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate
196 hedin 137 }
197 hedin 109 else
198     {
199 hedin 137 global_serial_byte_counter++;
200 hedin 109 }
201    
202 hedin 137 }
203 hedin 148
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 hedin 139 void update_lcd(void)
214     {
215 hedin 148 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 hedin 139 {
257 hedin 148 eeprom_write(i+4, cell_nr[i] );
258 hedin 139 }
259     }
260 hedin 148
261     void eeprom_reader(void)
262     {
263     char len,i;
264 hedin 109
265 hedin 148 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 hedin 150 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 hedin 148 void on_recieve(void)
308     {
309 hedin 150 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 hedin 148
323 hedin 150 reset_recieve_buffer();
324 hedin 148 }
325    
326 hedin 82 void main()
327     {
328 hedin 148 ////////////////////
329     // Running Init's //
330 hedin 109
331     // Running init for various components.
332 hedin 148 pic18_io_init();
333     rs232_init();
334 hedin 109 ad_init();
335     lcd_init(0);
336 hedin 137 interrupt_init();
337 hedin 139 sms_init();
338 hedin 148 //eeprom_init();
339     timer_init();
340     eeprom_reader();
341     ///////////////
342     // Main loop //
343 hedin 150
344    
345 hedin 109 while(1)
346 hedin 100 {
347 hedin 148 // 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 hedin 109 // Checking if A/D convertion is done, and save the data in global_Pot_??
370     if(GODONE==0)
371     {
372     global_Pot_Hi = ADRESH;
373     global_Pot_Lo = ADRESL;
374 hedin 148 convertTemp();
375     update_lcd();
376 hedin 112 GODONE = 1;
377 hedin 109 }
378 hedin 150
379     //if (global_recieve_done)
380     //{
381     on_recieve();
382     // global_recieve_done = 0;
383     // global_serial_byte_counter = 0;
384     //}
385 hedin 100 }
386 hedin 82 }

  ViewVC Help
Powered by ViewVC 1.1.20