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

Contents of /trunk/Embedded/main.c

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20