--- trunk/Embedded/main.c 2007/12/03 17:19:35 139 +++ trunk/Embedded/main.c 2007/12/04 17:23:27 148 @@ -1,6 +1,8 @@ #include #include +#include #include + #include "lcd.h" #include "Delay.h" // Delay.h is included inside lcd.c @@ -8,18 +10,31 @@ #define LCD_LENGTH 16 #define LCD_ROWS 2 #define SEND_BUFFER 128 +#define PWRFAIL RB1 +#define FIREDET RB2 +#define FEEDING RB3 +#define EMPTYTANK RB4 unsigned char global_Pot_Hi, global_Pot_Lo; unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH]; -unsigned char global_serial_send[SEND_BUFFER]; -unsigned char global_serial_recieve_buffer[LCD_LENGTH]; -bit global_recieve_done = 0; -int global_serial_byte_counter = 0; +unsigned char global_serial_send[SEND_BUFFER], global_serial_recieve_buffer[SEND_BUFFER]; +bit global_recieve_done = 0, global_interval_changed = 0; +unsigned int global_serial_byte_counter = 0, global_sms_counter = 1, global_time_counter = 0; +unsigned int global_emergency_counter = 600, global_time_interval = 3600; +unsigned char global_temp = 0; + +unsigned char cell_nr[15] = ""; // = "21681784"; + + +__EEPROM_DATA( 60, 0, 1, 8, '2', '1', '6', '8'); +__EEPROM_DATA( '1', '7', '8', '4',0,0,0,0); void serial_recieved(void); void serial_send(void); void update_lcd(void); +void convertTemp(void); +void timer1_interrupt(void); // Nicked from H7 void ad_init(void) @@ -41,8 +56,8 @@ PCFG2=1; PCFG3=1; - //Result is left justified - ADFM=0; + //Result is right justified + ADFM=1; //Fire up for A/D converter module ADON=1; @@ -68,11 +83,28 @@ RCIE = 1; // Recieve interrupt enable. IPEN = 0; // Nfo interrupt priority TXIE = 0; // Serial interrupt enabled + TMR1IE = 1; // Enables timer 1 } +void timer_init(void) +{ + TMR1CS = 1; //use external clock + + T1CKPS1 = 1; //1:8 prescale + T1CKPS0 = 1; + + TMR1H = 0xEF; + TMR1L = 0xFF; + + T1OSCEN = 1; //enable oscillator circuit + RD16 = 0; //normal 8 bit writes + TMR1ON = 1; +} + void pic18_io_init(void) { TRISA0 = 1; // analog input + TRISA1 = 0; // Output TRISB1 = 1; // TRISB1-4 Digital input TRISB2 = 1; TRISB3 = 1; @@ -81,25 +113,23 @@ void sms_init(void) { - int i = 1; + int i; + + sprintf(global_serial_send,"at+cgsn\r"); + serial_send(); + DelaySek(1); + while(!global_recieve_done) ; + + sprintf(global_serial_send,"%s", "at+cpin=8043\r"); serial_send(); - DelaySek(60); + DelaySek(30); update_lcd(); DelaySek(5); - - sprintf(global_serial_send,"%s%s", "at+cmgs=","\"22337617\"\r"); - serial_send(); - DelayMs(5000); - - sprintf(global_serial_send,"%s%d%c","Dette er test nr: ", i, 0x1A); - serial_send(); - DelayMs(5000); - i++; - } + void interrupt interrupt_handler(void) { // Finds out what interrupt have been trigged, and starts the respective function. @@ -108,35 +138,40 @@ serial_recieved(); RCIF = 0; } + + if(TMR1IF == 1) // timer1 interrupt trigger. + { + timer1_interrupt(); + TMR1IF = 0; + } } - void serial_send(void) { int i; -// char tosend[3]; - char data; -// sprintf(tosend,"%s", "at\r"); + char data_byte; for(i = 0; i < SEND_BUFFER; i++) { - data = global_serial_send[i]; - if( data == '\r') + data_byte = global_serial_send[i]; + if( data_byte == '\r') i = (SEND_BUFFER - 1); - TXREG = data; + TXREG = data_byte; while(TRMT==0) ; - DelayMs(1000); + DelayMs(10); } + DelayMs(250); + DelayMs(250); } void serial_recieved(void) { - char data, saved_data[LCD_LENGTH]; + char data_byte, saved_data[LCD_LENGTH]; - data = RCREG; + data_byte = RCREG; - global_serial_recieve_buffer[global_serial_byte_counter] = data; - if(data == '\r') + global_serial_recieve_buffer[global_serial_byte_counter] = data_byte; + if(data_byte == '\r') { global_recieve_done = 1; global_serial_byte_counter = 0; @@ -147,43 +182,136 @@ } } + +void timer1_interrupt(void) +{ + TMR1H = 0xEF; + TMR1L = 0xFF; + global_time_counter++; + global_emergency_counter++; + RA1 = !RA1; +} + void update_lcd(void) { - if( global_recieve_done == 1 ) + lcd_clear(); + lcd_goto(0x00); + lcd_puts(global_temp); + +} + +void send_update(void) +{ + sprintf(global_serial_send, "at+cmgs=\"%s\"\r", cell_nr); + serial_send(); + sprintf(global_serial_send, "%d:%d:%d:%d:%d:%d%c", global_sms_counter, global_temp, FIREDET, EMPTYTANK, FEEDING, PWRFAIL, 0x1A); + lcd_goto(40); + lcd_puts(global_serial_send); + serial_send(); + DelayMs(250); + global_sms_counter++; +} + +void convertTemp() +{ + short adVal; + adVal = (global_Pot_Hi << 8) | global_Pot_Lo; + if( adVal >=840 ) + global_temp = 100; + else + global_temp = (adVal / 8.3886); +} + + + +void eeprom_writer(void) +{ + char len,i; + + len = strlen(cell_nr); + eeprom_write(0, (global_time_interval/60)); + eeprom_write(1, global_sms_counter>>8); + eeprom_write(2, global_sms_counter); + eeprom_write(3, len); + + for (i=0; i= 90 || PWRFAIL == 1 || FIREDET == 0 || FEEDING == 1 || EMPTYTANK == 1) && global_emergency_counter >= 600 ) + { + send_update(); + global_emergency_counter = 0; + } + // Every X sec. a status sms is send. + if(global_time_counter >= 3600) + { + send_update(); + global_time_counter = 0; + } + // To avoid buffer overrun. + if( global_emergency_counter > 7200 ) + global_emergency_counter = 600; + + // Checks if there has been recieved a config sms. + if(global_interval_changed ) + { + eeprom_writer(); + global_interval_changed = 0; + } // Checking if A/D convertion is done, and save the data in global_Pot_?? if(GODONE==0) { global_Pot_Hi = ADRESH; global_Pot_Lo = ADRESL; + convertTemp(); + update_lcd(); GODONE = 1; } - update_lcd(); } }