#include #include "EESD.h" #pragma DATA _CONFIG1H, _OSC_HS_1H //10 mhz #pragma DATA _CONFIG2H, _WDT_ON_2H #pragma DATA _CONFIG2H, _WDTPS_2048_2H #pragma DATA _CONFIG4L, _LVP_OFF_4L #pragma DATA _CONFIG3H, _MCLRE_ON_3H volatile bit alt@INTCON.1; //ALTERNATOR INTERRUPT FLAG volatile bit over@INTCON3.0; //OVERRIDE INTERRUPT FLAG volatile bit a2@PORTA.2; volatile bit a3@PORTA.3; #define toggle_a2 a2=1;nop();nop();a2=0; // define toggle #define toggle_a3 a3=1;nop();nop();a3=0; // define toggle bool altflag = false; //Corresponding semaphores bool overflag = false; void interrupt(void) { if (alt) { alt = 0; altflag = true; } if (over) { over = 0; overflag = true; } } void main(void) { int delay = 0; short minutes = 0x22; short hours = 0x02; short date = 0x06; short month = 0x00; trisa.2 = 0; // make port a bit 1 output a2=0; // start at zero trisa.3 = 0; // make port a bit 1 output a3=0; // start at zero interrupt_init(); LCD_init(); ad_init(); i2c_init(); io_init(); time_init_clk(minutes, hours, date, month); time_init_set(); short mode; short switch_status; short wait_time; short time_track = 0; unsigned short volts; unsigned short amps; unsigned short raw_voltage; unsigned short raw_current; unsigned short oldmem = 0x0000; short address = 0x00; while(1){ short bust = 0; time_track = 0; interrupt_init(); /*Check and display voltage and current, as read off of the AD converter*/ while (delay < 20){ raw_voltage = check_batt_voltage(); volts = volt_scaler(raw_voltage); print_volt(volts); raw_current = check_batt_current(); LCD_setpos(1,0); amps = current_scaler(raw_current); print_amps(amps); delay_ms(255); delay = delay + 1; LCD_clear(); } /*based on the measured voltage and current, pass the mode of the device and switch devices*/ mode = mode_select(volts, amps); switch_status = switch_devices(mode); delay = 0; /*Read the time from the time chip (I2C) and display on the LCD*/ while (delay < 20){ i2c_time(); delay_ms(255); delay = delay + 1; LCD_clear(); } delay = 0; //Write voltage to the memory chip; update adress to prevent overwriting mem_write_voltage(address, volts); address_update(address); //Enter a delay mode which spaces out measurements and writes. alt = 0; over = 0; interrupt_init_sleep(); if(portb.1 == 1){ //if car is on wait_time = 4; //we end up waiting 4 + 1 = 5 minutes } if(portb.1 == 0){ wait_time = 6; //we end up waiting 6 + 1 = 7 minutes (cycles) } while( bust == 0){ LCD_printf("time: "); LCD_int(time_track); sleep(); LCD_clear(); if(altflag == true){ altflag = false; bust = 1; LCD_printf("car turned on or off!"); toggle_a2; } if(overflag == true){ overflag = false; bust = 1; LCD_printf("override status changed!"); toggle_a3; } if(altflag == false && overflag == false){ time_track = time_track + 1; LCD_printf(" timer reset"); if(time_track >= wait_time){ bust = 1; } } while (delay < 5){ delay_ms(255); delay = delay + 1; } delay = 0; LCD_clear(); } } }