--- trunk/Embedded/main.lst 2007/12/04 17:32:44 149 +++ trunk/Embedded/main.lst 2007/12/04 19:07:00 150 @@ -9,7 +9,7 @@ 9: 10: #define LCD_LENGTH 16 11: #define LCD_ROWS 2 - 12: #define SEND_BUFFER 128 + 12: #define BUFFER 128 13: #define PWRFAIL RB1 14: #define FIREDET RB2 15: #define FEEDING RB3 @@ -18,301 +18,369 @@ 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]; + 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 cell_nr[15] = ""; // = "21681784"; + 27: unsigned short global_imei_tversum; 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: } + 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: global_recieve_done = 0; + 47: global_serial_byte_counter=0; + 48: } + 49: + 50: + 51: void ad_init(void) // Nicked from H7 + 52: { + 53: // AD Conversion clock + 54: ADCS0 = 0; + 55: ADCS1 = 0; + 56: ADCS2 = 0; + 57: + 58: //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: //Result is right justified + 71: ADFM=1; + 72: + 73: //Fire up for A/D converter module + 74: ADON=1; + 75: } + 76: + 77: void rs232_init(void) + 78: { + 79: SPEN = 0; // Serial Port Enable Bit... 0 = disabled + 80: TRISC6 = 0; + 81: TRISC7 = 1; + 82: + 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: } 88: - 89: void timer_init(void) + 89: void interrupt_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: } + 91: // Assumes that all interrupts default is 0 + 92: PEIE = 1; + 93: GIE = 1; + 94: 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) + 116: { + 117: TRISA0 = 1; // analog input + 118: TRISA1 = 0; // Output + 119: TRISB1 = 1; // TRISB1-4 Digital input + 120: TRISB2 = 1; + 121: TRISB3 = 1; + 122: TRISB4 = 1; + 123: } + 124: + 125: void sms_init(void) + 126: { + 127: 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) + 147: { + 148: // Finds out what interrupt have been trigged, and starts the respective function. + 149: if(RCIF == 1) // Serial recieve interrupt + 150: { + 151: serial_recieved(); + 152: 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: } - 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: if( global_recieve_done == 1 ) + 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: lcd_clear(); - 200: lcd_goto(0x00); - 201: lcd_puts(global_serial_recieve_buffer); - 202: global_recieve_done = 0; - 203: } - 204: } - 205: - 206: void send_update(void) - 207: { - 208: sprintf(global_serial_send, "at+cmgs=\"%s\"\r", cell_nr); - 209: serial_send(); - 210: sprintf(global_serial_send, "%d:%d:%d:%d:%d:%d%c", global_sms_counter, global_temp, FIREDET, EMPTYTANK, FEEDING, PWRFAIL, 0x1A); - 211: lcd_goto(40); - 212: lcd_puts(global_serial_send); - 213: serial_send(); - 214: DelayMs(250); - 215: global_sms_counter++; - 216: } - 217: - 218: void convertTemp() - 219: - 220: { - 221: short adVal; - 222: adVal = (global_Pot_Hi << 8) | global_Pot_Lo; - 223: if( adVal >=840 ) - 224: global_temp = 100; - 225: else - 226: global_temp = (adVal / 8.3886); - 227: } - 228: - 229: - 230: - 231: void eeprom_writer(void) - 232: { - 233: char len,i; - 234: - 235: if( global_interval_changed ) - 236: { - 237: len = strlen(cell_nr); - 238: eeprom_write(0, (global_time_interval/60)); - 239: eeprom_write(1, global_sms_counter>>8); - 240: eeprom_write(2, global_sms_counter); - 241: eeprom_write(3, len); - 242: - 243: for (i=0; i= 90 || PWRFAIL == 1 || FIREDET == 0 || FEEDING == 1 || EMPTYTANK == 1) && global_emergency_counter >= 600 ) - 291: { - 292: send_update(); - 293: global_emergency_counter = 0; - 294: } - 295: - 296: if(global_time_counter >= 3600) - 297: { - 298: send_update(); - 299: global_time_counter = 0; - 300: } - 301: // to avoid buffer overrun. - 302: if( global_emergency_counter > 7200 ) - 303: global_emergency_counter = 600; - 304: - 305: // Checking if A/D convertion is done, and save the data in global_Pot_?? - 306: if(GODONE==0) - 307: { - 308: global_Pot_Hi = ADRESH; - 309: global_Pot_Lo = ADRESL; - 310: convertTemp(); - 311: - 312: GODONE = 1; - 313: } - 314: - 315: update_lcd(); - 316: } - 317: - 318: } + 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) + 214: { + 215: 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= 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_?? + 370: if(GODONE==0) + 371: { + 372: global_Pot_Hi = ADRESH; + 373: global_Pot_Lo = ADRESL; + 374: convertTemp(); + 375: update_lcd(); + 376: GODONE = 1; + 377: } + 378: + 379: //if (global_recieve_done) + 380: //{ + 381: on_recieve(); + 382: // global_recieve_done = 0; + 383: // global_serial_byte_counter = 0; + 384: //} + 385: } + 386: }