/* * PORTG0 and PORTG1 can N E V E R both be set high at the same time. This will cause * a short circuit between +12V and -12V, which will most likely fry a regulator, as well as the * Microcontroller, and may damage the CUSat space vehicle or any component inside it. */ #include //some macros #define BT_CHRG PORTC.4 = 0 #define BT_DISCHRG PORTC.4 = 1 #define USRAT0_REC_EN PORTC.5 = 0 //enable RS485 receive #define USART0_SEND_EN PORTC.6 = 1 //enable RS485 send #define USART0_SEND_DS PORTC.6 = 0 //disable RS485 send #define TXB8N_SET UCSR0B.0 = 1 //set 9th bit #define TXB8N_CLR UCSR0B.0 = 0 //clear the 9th bit //status and external command definitions #define DB_WAIT 0x00 //initial status #define DB_CMD_REPROG_MCU 0x01 //reprogram subsystems #define DB_CMD_GET_ALL_DATA 0x02 //PC request ADC data from DB #define DB_CMD_GET_CUCP 0x03 //PC request data from MCU #define DB_CMD_BAT_DISCHRG 0x04 //start charge circuit #define DB_CMD_BAT_CHARGE 0x05 //stop charge circuit #define DB_CMD_BAT_OFF 0x06 #define DB_CMD_INHIBIT_POS 0x07 #define DB_CMD_INHIBIT_NEG 0x08 #define DB_CMD_INHIBIT_OFF 0x09 #define REPROG_MCU_GET_ADDR 0x10 //get MCU reprogramming address #define REPROG_MCU_GET_CMD 0x11 //get MCU reprogramming command #define REPROG_MCU_END 0x14 // end of reprogramming //db_cmd definition #define NO_ACTION 0x00 //initial status #define SEND_ADC_DATA 0x01 //send adc data to pc #define SEND_MCU_DATA 0x02 //send MCU data to pc #define BAT_CHRG 0x03 //battery charge #define BAT_DISCHRG 0x04 //battery discharge #define BAT_OFF 0x05 #define INHIBIT_POS 0x06 #define INHIBIT_NEG 0x07 #define INHIBIT_OFF 0x08 //ADC register #define ADEN ADCSRA.7 //enable ADC #define ADSC ADCSRA.6 //start conversion #define ADIF ADCSRA.4 //conversion done //timeout values for each task #define t1 50 // data acquisition every 50 ms // ADC data struct ALL_MCU_DATA { char CHARGE_CURRENT_SENSE; char DISCHARGE_CURRENT_SENSE; char VBUS_CURRENT_SENSE; char inhibitState; char batteryState; } allMCUData; //variable definition unsigned char status; // diagnostic board status unsigned char rp_in_prog; // reprogramming in progress unsigned char db_cmd; // command for DB unsigned char time1; // timeout counters unsigned char cucp_buffer[256]; // data from MCU unsigned int cucp_buffer_index=0; //functions definition void get_adc_data(void); void send_adc_data(void); void send_mcu_data(void); void bat_charge(void); void bat_discharge(void); void bat_off(void); void inhibit_pos(void); void inhibit_neg(void); void inhibit_off(void); void initialize(void); // timer 0 interrupt interrupt [TIM0_COMP] void timer0_compare(void) { if (time1>0) --time1; } void get_adc_data() { // data acquisition every 50 ms time1=t1; ADSC = 1; //start conversion while(!ADIF); //wait until conversion done allMCUData.DISCHARGE_CURRENT_SENSE = ADCH; } void send_adc_data() { char ct=0; while(ct