--- trunk/Embedded/main.c 2007/11/30 16:07:03 112 +++ trunk/Embedded/main.c 2007/12/04 19:07:00 150 @@ -1,23 +1,54 @@ #include #include +#include #include + #include "lcd.h" +#include "Delay.h" // Delay.h is included inside lcd.c #define LCD_LENGTH 16 #define LCD_ROWS 2 +#define BUFFER 128 +#define PWRFAIL RB1 +#define FIREDET RB2 +#define FEEDING RB3 +#define EMPTYTANK RB4 -unsigned char global_Pot_Hi; -unsigned char global_Pot_Lo; +unsigned char global_Pot_Hi, global_Pot_Lo; unsigned char global_LCD_Buffer[LCD_ROWS][LCD_LENGTH]; -/*void AD_init(void) +unsigned char global_serial_send[BUFFER], global_serial_recieve_buffer[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 short global_imei_tversum; + +unsigned char cell_nr[15] = ""; // = "21681784"; +bit global_modem_init = 0; + +__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); +void on_recieve(void); +void on_initial_recieve(void); + + +void reset_recieve_buffer(void) { - ADON = 1; -} -*/ -// Nicked from H7 -void ad_init(void) + global_recieve_done = 0; + global_serial_byte_counter=0; +} + + +void ad_init(void) // Nicked from H7 { // AD Conversion clock ADCS0 = 0; @@ -36,8 +67,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; @@ -46,13 +77,13 @@ void rs232_init(void) { SPEN = 0; // Serial Port Enable Bit... 0 = disabled - TRISC6 = 0; + TRISC6 = 0; TRISC7 = 1; - SYNC = 0; // SYNC switches between async(0) and sync(1) mode. - SPBRG = 25; - TXSTA = 0x24; - RCSTA = 0x90; - SPEN = 1; + + SPBRG = 207; // 1200 baud rate... 25 = 9600 + // x = (Fosc / (16*[baud rate]) )-1 + TXSTA = 0x24; // Enables BRGH and TXEN inthe TXSTA register + RCSTA = 0x90; // 0x90 enables SPEN and CREN in the RCSTA register } void interrupt_init(void) @@ -60,81 +91,296 @@ // Assumes that all interrupts default is 0 PEIE = 1; GIE = 1; - RCIE = 1; + 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; TRISB4 = 1; } -void interrupt_recieve_handler(void) +void sms_init(void) { - // Handle recieve inputs... + int i; + + reset_recieve_buffer(); + 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(); + + while(global_modem_init == 0) + { + on_initial_recieve(); + } } + void interrupt interrupt_handler(void) { // Finds out what interrupt have been trigged, and starts the respective function. - if(RCIF == 1) + if(RCIF == 1) // Serial recieve interrupt { - interrupt_recieve_handler(); + serial_recieved(); RCIF = 0; } + + if(TMR1IF == 1) // timer1 interrupt trigger. + { + timer1_interrupt(); + TMR1IF = 0; + } } + +void serial_send(void) +{ + int i; + char data_byte; + for(i = 0; i < BUFFER; i++) + { + data_byte = global_serial_send[i]; + if( data_byte == '\r') + i = (BUFFER - 1); + TXREG = data_byte; + while(TRMT==0) ; + DelayMs(10); + } + DelayMs(250); + DelayMs(250); +} + +void serial_recieved(void) +{ + char data_byte, saved_data[LCD_LENGTH]; + + data_byte = RCREG; + + if (data_byte == '\n') + return; + + global_serial_recieve_buffer[global_serial_byte_counter] = data_byte; + + if (data_byte == '\r') + { + global_recieve_done = 1; + //global_serial_byte_counter = 0; + global_serial_recieve_buffer[global_serial_byte_counter+1] = 0; //zero terminate + } + else + { + global_serial_byte_counter++; + } + +} + +void timer1_interrupt(void) +{ + TMR1H = 0xEF; + TMR1L = 0xFF; + global_time_counter++; + global_emergency_counter++; + RA1 = !RA1; +} + void update_lcd(void) -{ - char toLCD0[LCD_LENGTH], toLCD1[LCD_LENGTH]; - char B1[LCD_LENGTH]; - char sprintF[LCD_LENGTH]; +{ + lcd_clear(); lcd_goto(0x00); - sprintf(toLCD0, "%s", "Ejdesgaard"); - if(RB1) + 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(); + //if (global_recieve_done) + //{ + on_recieve(); + // global_recieve_done = 0; + // global_serial_byte_counter = 0; + //} } }