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

Annotation of /trunk/Embedded/main.lst

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

  ViewVC Help
Powered by ViewVC 1.1.20