--- trunk/Embedded/main.lst 2007/12/04 17:22:57 147 +++ trunk/Embedded/main.lst 2007/12/04 17:23:27 148 @@ -1,189 +1,318 @@ 1: #include 2: #include - 3: #include - 4: #include "lcd.h" - 5: #include "Delay.h" - 6: // Delay.h is included inside lcd.c - 7: - 8: #define LCD_LENGTH 16 - 9: #define LCD_ROWS 2 - 10: #define SEND_BUFFER 128 - 11: - 12: - 13: unsigned char global_Pot_Hi, global_Pot_Lo; - 14: unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH]; - 15: unsigned char global_serial_send[SEND_BUFFER]; - 16: unsigned char global_serial_recieve_buffer[LCD_LENGTH]; - 17: bit global_recieve_done = 0; - 18: int global_serial_byte_counter = 0; - 19: - 20: void serial_recieved(void); - 21: void serial_send(void); - 22: void update_lcd(void); - 23: - 24: // Nicked from H7 - 25: void ad_init(void) - 26: { - 27: // AD Conversion clock - 28: ADCS0 = 0; - 29: ADCS1 = 0; - 30: ADCS2 = 0; - 31: - 32: //Select AN0/RA0 for AD source - 33: // In this (000) setup, it's only RA0/AN0 that does ad convertion. - 34: CHS0=0; - 35: CHS1=0; - 36: CHS2=0; - 37: - 38: //Only AN0 is selected for AD and with Vdd/Vss as limits - 39: PCFG0=0; - 40: PCFG1=1; - 41: PCFG2=1; - 42: PCFG3=1; - 43: - 44: //Result is left justified - 45: ADFM=0; - 46: - 47: //Fire up for A/D converter module - 48: ADON=1; - 49: } - 50: - 51: void rs232_init(void) - 52: { - 53: SPEN = 0; // Serial Port Enable Bit... 0 = disabled - 54: TRISC6 = 0; - 55: TRISC7 = 1; - 56: - 57: SPBRG = 207; // 1200 baud rate... 25 = 9600 - 58: // x = (Fosc / (16*[baud rate]) )-1 - 59: TXSTA = 0x24; // Enables BRGH and TXEN inthe TXSTA register - 60: RCSTA = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register - 61: } - 62: - 63: void interrupt_init(void) - 64: { - 65: // Assumes that all interrupts default is 0 - 66: PEIE = 1; - 67: GIE = 1; - 68: RCIE = 1; // Recieve interrupt enable. - 69: IPEN = 0; // Nfo interrupt priority - 70: TXIE = 0; // Serial interrupt enabled - 71: } - 72: - 73: void pic18_io_init(void) - 74: { - 75: TRISA0 = 1; // analog input - 76: TRISB1 = 1; // TRISB1-4 Digital input - 77: TRISB2 = 1; - 78: TRISB3 = 1; - 79: TRISB4 = 1; - 80: } - 81: - 82: void sms_init(void) - 83: { - 84: int i = 1; - 85: sprintf(global_serial_send,"%s", "at+cpin=8043\r"); - 86: serial_send(); - 87: DelaySek(60); - 88: - 89: update_lcd(); - 90: DelaySek(5); - 91: - 92: sprintf(global_serial_send,"%s%s", "at+cmgs=","\"22337617\"\r"); - 93: serial_send(); - 94: DelayMs(5000); + 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 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: sprintf(global_serial_send,"%s%d%c","Dette er test nr: ", i, 0x1A); - 97: serial_send(); - 98: DelayMs(5000); - 99: i++; - 100: - 101: } - 102: - 103: void interrupt interrupt_handler(void) - 104: { - 105: // Finds out what interrupt have been trigged, and starts the respective function. - 106: if(RCIF == 1) // Serial recieve interrupt - 107: { - 108: serial_recieved(); - 109: RCIF = 0; - 110: } - 111: } - 112: + 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: - 115: void serial_send(void) - 116: { - 117: int i; - 118: // char tosend[3]; - 119: char data; - 120: // sprintf(tosend,"%s", "at\r"); - 121: for(i = 0; i < SEND_BUFFER; i++) - 122: { - 123: data = global_serial_send[i]; - 124: if( data == '\r') - 125: i = (SEND_BUFFER - 1); - 126: TXREG = data; - 127: while(TRMT==0) ; - 128: DelayMs(1000); - 129: } - 130: } + 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: void serial_recieved(void) - 133: { - 134: char data, saved_data[LCD_LENGTH]; - 135: - 136: data = RCREG; - 137: - 138: global_serial_recieve_buffer[global_serial_byte_counter] = data; - 139: if(data == '\r') - 140: { - 141: global_recieve_done = 1; - 142: global_serial_byte_counter = 0; - 143: } - 144: else - 145: { - 146: global_serial_byte_counter++; - 147: } - 148: - 149: } - 150: void update_lcd(void) + 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: if( global_recieve_done == 1 ) - 153: { - 154: lcd_clear(); - 155: lcd_goto(0x00); - 156: lcd_puts(global_serial_recieve_buffer); - 157: global_recieve_done = 0; - 158: } - 159: } - 160: - 161: void main() - 162: { - 163: ///////////////////////////////////////////// - 164: // Running Init's - 165: - 166: // Running init for various components. - 167: //AD_init(); - 168: ad_init(); - 169: rs232_init(); - 170: pic18_io_init(); - 171: lcd_init(0); - 172: lcd_clear(); - 173: interrupt_init(); - 174: sms_init(); - 175: ///////////////////////////////////////////// - 176: // Main loop - 177: - 178: while(1) - 179: { - 180: // Checking if A/D convertion is done, and save the data in global_Pot_?? - 181: if(GODONE==0) - 182: { - 183: global_Pot_Hi = ADRESH; - 184: global_Pot_Lo = ADRESL; - 185: GODONE = 1; - 186: } - 187: update_lcd(); - 188: } - 189: } + 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: } + 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: }