1: #include 2: #include 3: #include 4: #include 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 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[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 char global_lcd_buf[16]; 28: 29: unsigned short global_imei_tversum; 30: 31: unsigned char cell_nr[15] = ""; // = "21681784"; 32: bit global_modem_init = 0; 33: 34: __EEPROM_DATA( 60, 0, 1, 8, '2', '1', '6', '8'); 35: __EEPROM_DATA( '1', '7', '8', '4',0,0,0,0); 36: 37: void serial_recieved(void); 38: void serial_send(void); 39: void update_lcd(void); 40: void convertTemp(void); 41: void timer1_interrupt(void); 42: void on_recieve(void); 43: void on_initial_recieve(void); 44: 45: 46: void reset_recieve_buffer(void) 47: { 48: global_recieve_done = 0; 49: global_serial_byte_counter=0; 50: } 51: 52: 53: void ad_init(void) // Nicked from H7 54: { 55: // AD Conversion clock 56: ADCS0 = 0; 57: ADCS1 = 0; 58: ADCS2 = 0; 59: 60: //Select AN0/RA0 for AD source 61: // In this (000) setup, it's only RA0/AN0 that does ad convertion. 62: CHS0=0; 63: CHS1=0; 64: CHS2=0; 65: 66: //Only AN0 is selected for AD and with Vdd/Vss as limits 67: PCFG0=0; 68: PCFG1=1; 69: PCFG2=1; 70: PCFG3=1; 71: 72: //Result is right justified 73: ADFM=1; 74: 75: //Fire up for A/D converter module 76: ADON=1; 77: } 78: 79: void rs232_init(void) 80: { 81: SPEN = 0; // Serial Port Enable Bit... 0 = disabled 82: TRISC6 = 0; 83: TRISC7 = 1; 84: 85: SPBRG = 207; // 1200 baud rate... 25 = 9600 86: // x = (Fosc / (16*[baud rate]) )-1 87: TXSTA = 0x24; // Enables BRGH and TXEN inthe TXSTA register 88: RCSTA = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register 89: } 90: 91: void interrupt_init(void) 92: { 93: // Assumes that all interrupts default is 0 94: PEIE = 1; 95: GIE = 1; 96: RCIE = 1; // Recieve interrupt enable. 97: IPEN = 0; // Nfo interrupt priority 98: TXIE = 0; // Serial interrupt enabled 99: TMR1IE = 1; // Enables timer 1 100: } 101: 102: void timer_init(void) 103: { 104: TMR1CS = 1; //use external clock 105: 106: T1CKPS1 = 1; //1:8 prescale 107: T1CKPS0 = 1; 108: 109: TMR1H = 0xEF; 110: TMR1L = 0xFF; 111: 112: T1OSCEN = 1; //enable oscillator circuit 113: RD16 = 0; //normal 8 bit writes 114: TMR1ON = 1; 115: } 116: 117: void pic18_io_init(void) 118: { 119: TRISA0 = 1; // analog input 120: TRISA1 = 0; // Output 121: TRISB1 = 1; // TRISB1-4 Digital input 122: TRISB2 = 1; 123: TRISB3 = 1; 124: TRISB4 = 1; 125: } 126: 127: void sms_init(void) 128: { 129: int i; 130: 131: reset_recieve_buffer(); 132: sprintf(global_serial_send,"at+cgsn\r"); 133: serial_send(); 134: DelaySek(1); 135: while(!global_recieve_done) ; 136: 137: 138: sprintf(global_serial_send,"%s", "at+cpin=8043\r"); 139: serial_send(); 140: 141: while(global_modem_init == 0) 142: { 143: on_initial_recieve(); 144: } 145: } 146: 147: 148: void interrupt interrupt_handler(void) 149: { 150: // Finds out what interrupt have been trigged, and starts the respective function. 151: if(RCIF == 1) // Serial recieve interrupt 152: { 153: serial_recieved(); 154: RCIF = 0; 155: } 156: 157: if(TMR1IF == 1) // timer1 interrupt trigger. 158: { 159: timer1_interrupt(); 160: TMR1IF = 0; 161: } 162: } 163: 164: 165: void serial_send(void) 166: { 167: int i; 168: char data_byte; 169: for(i = 0; i < BUFFER; i++) 170: { 171: data_byte = global_serial_send[i]; 172: if( data_byte == '\r') 173: i = (BUFFER - 1); 174: TXREG = data_byte; 175: while(TRMT==0) ; 176: DelayMs(10); 177: } 178: DelayMs(250); 179: DelayMs(250); 180: } 181: 182: void serial_recieved(void) 183: { 184: char data_byte, saved_data[LCD_LENGTH]; 185: 186: data_byte = RCREG; 187: 188: if (data_byte == '\n') 189: return; 190: 191: if (global_serial_byte_counter == 0 && data_byte == '\r') 192: return; 193: 194: global_serial_recieve_buffer[global_serial_byte_counter] = data_byte; 195: 196: if (data_byte == '\r') 197: { 198: global_recieve_done = 1; 199: //global_serial_byte_counter = 0; 200: global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate 201: } 202: else 203: { 204: global_serial_byte_counter++; 205: } 206: 207: } 208: 209: void timer1_interrupt(void) 210: { 211: TMR1H = 0xEF; 212: TMR1L = 0xFF; 213: global_time_counter++; 214: global_emergency_counter++; 215: RA1 = !RA1; 216: } 217: 218: void update_lcd(void) 219: { 220: lcd_clear(); 221: lcd_goto(0x00); 222: 223: sprintf(global_lcd_buf, "%d", global_temp); 224: lcd_puts(global_lcd_buf); 225: 226: } 227: 228: void send_update(void) 229: { 230: sprintf(global_serial_send, "at+cmgs=\"%s\"\r", cell_nr); 231: serial_send(); 232: sprintf(global_serial_send, "%d:%d:%d:%d:%d:%d%c", global_sms_counter, global_temp, FIREDET, EMPTYTANK, FEEDING, PWRFAIL, 0x1A); 233: lcd_goto(40); 234: lcd_puts(global_serial_send); 235: serial_send(); 236: DelayMs(250); 237: global_sms_counter++; 238: } 239: 240: void convertTemp() 241: { 242: short adVal; 243: adVal = (global_Pot_Hi << 8) | global_Pot_Lo; 244: if( adVal >=840 ) 245: global_temp = 100; 246: else 247: global_temp = (adVal / 8.3886); 248: } 249: 250: 251: 252: void eeprom_writer(void) 253: { 254: char len,i; 255: 256: len = strlen(cell_nr); 257: eeprom_write(0, (global_time_interval/60)); 258: eeprom_write(1, global_sms_counter>>8); 259: eeprom_write(2, global_sms_counter); 260: eeprom_write(3, len); 261: 262: for (i=0; i= 90 || PWRFAIL == 1 || FIREDET == 0 || FEEDING == 1 || EMPTYTANK == 1) && global_emergency_counter >= 600 ) 363: { 364: send_update(); 365: global_emergency_counter = 0; 366: } 367: // Every X sec. a status sms is send. 368: if(global_time_counter >= 3600) 369: { 370: send_update(); 371: global_time_counter = 0; 372: } 373: // To avoid buffer overrun. 374: if( global_emergency_counter > 7200 ) 375: global_emergency_counter = 600; 376: 377: // Checks if there has been recieved a config sms. 378: if(global_interval_changed ) 379: { 380: eeprom_writer(); 381: global_interval_changed = 0; 382: } 383: // Checking if A/D convertion is done, and save the data in global_Pot_?? 384: if(GODONE==0) 385: { 386: global_Pot_Hi = ADRESH; 387: global_Pot_Lo = ADRESL; 388: convertTemp(); 389: //update_lcd(); 390: GODONE = 1; 391: } 392: // Handels the recieve sms'es. 393: on_recieve(); 394: } 395: }