--- trunk/Embedded/main.lst 2007/12/04 17:23:27 148 +++ trunk/Embedded/main.lst 2007/12/05 07:30:04 151 @@ -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,378 @@ 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 char global_lcd_buf[16]; 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: if( global_recieve_done == 1 ) - 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: } + 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 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=840 ) + 245: global_temp = 100; + 246: else + 247: global_temp = (adVal / 8.3886); + 248: } + 249: + 250: 251: - 252: void eeprom_reader(void) + 252: void eeprom_writer(void) 253: { 254: char len,i; 255: - 256: global_time_interval = eeprom_read(0); - 257: global_time_interval *= 60; - 258: global_sms_counter = (eeprom_read(1)<<8) | eeprom_read(2); - 259: len = eeprom_read(3); - 260: - 261: 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: } + 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: }