Roger Weng
/
BMS
BMS
main.cpp@8:404c4d795fde, 2018-01-22 (annotated)
- Committer:
- open4416
- Date:
- Mon Jan 22 03:43:00 2018 +0000
- Revision:
- 8:404c4d795fde
- Parent:
- 7:5f7232441106
V1.00
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
roger5641 | 2:e0ec3ed506ea | 1 | /* |
open4416 | 8:404c4d795fde | 2 | LTC6811-1: Battery stack monitor |
open4416 | 8:404c4d795fde | 3 | */ |
roger5641 | 0:3547f7580dbd | 4 | #include "mbed.h" |
open4416 | 8:404c4d795fde | 5 | #include "stdint.h" |
open4416 | 8:404c4d795fde | 6 | #include "Linduino.h" |
open4416 | 8:404c4d795fde | 7 | #include "LT_SPI.h" |
open4416 | 8:404c4d795fde | 8 | #include "UserInterface.h" |
open4416 | 8:404c4d795fde | 9 | #include "LTC681x.h" |
open4416 | 8:404c4d795fde | 10 | #include "LTC6811.h" |
open4416 | 8:404c4d795fde | 11 | SPI spi(A6,A5,A4); |
open4416 | 8:404c4d795fde | 12 | DigitalOut spi_CS(A3, 1); |
roger5641 | 0:3547f7580dbd | 13 | |
roger5641 | 0:3547f7580dbd | 14 | #define ENABLED 1 |
roger5641 | 0:3547f7580dbd | 15 | #define DISABLED 0 |
roger5641 | 0:3547f7580dbd | 16 | |
roger5641 | 0:3547f7580dbd | 17 | #define DATALOG_ENABLED 1 |
roger5641 | 0:3547f7580dbd | 18 | #define DATALOG_DISABLED 0 |
roger5641 | 0:3547f7580dbd | 19 | |
open4416 | 8:404c4d795fde | 20 | void run_command(uint32_t cmd); |
open4416 | 8:404c4d795fde | 21 | void measurement_loop(uint8_t datalog_en); |
roger5641 | 0:3547f7580dbd | 22 | void print_menu(); |
roger5641 | 0:3547f7580dbd | 23 | void print_cells(uint8_t datalog_en); |
roger5641 | 0:3547f7580dbd | 24 | void print_open(); |
open4416 | 8:404c4d795fde | 25 | void print_aux(uint8_t datalog_en); |
open4416 | 8:404c4d795fde | 26 | void print_stat(); |
roger5641 | 0:3547f7580dbd | 27 | void print_config(); |
roger5641 | 0:3547f7580dbd | 28 | void print_rxconfig(); |
open4416 | 8:404c4d795fde | 29 | void print_pec(void); |
open4416 | 8:404c4d795fde | 30 | void serial_print_hex(uint8_t data); |
roger5641 | 0:3547f7580dbd | 31 | void check_error(int error); |
open4416 | 8:404c4d795fde | 32 | //char get_char(); |
open4416 | 8:404c4d795fde | 33 | //void read_config_data(uint8_t cfg_data[][6], uint8_t nIC); |
open4416 | 8:404c4d795fde | 34 | |
roger5641 | 0:3547f7580dbd | 35 | /********************************************************** |
roger5641 | 0:3547f7580dbd | 36 | Setup Variables |
roger5641 | 0:3547f7580dbd | 37 | The following variables can be modified to |
roger5641 | 0:3547f7580dbd | 38 | configure the software. |
roger5641 | 0:3547f7580dbd | 39 | |
roger5641 | 0:3547f7580dbd | 40 | ***********************************************************/ |
open4416 | 8:404c4d795fde | 41 | const uint8_t TOTAL_IC = 1;//!<number of ICs in the daisy chain |
roger5641 | 0:3547f7580dbd | 42 | |
roger5641 | 0:3547f7580dbd | 43 | //ADC Command Configurations |
roger5641 | 0:3547f7580dbd | 44 | const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 45 | const uint8_t ADC_CONVERSION_MODE = MD_7KHZ_3KHZ;//MD_7KHZ_3KHZ; //MD_26HZ_2KHZ;//MD_7KHZ_3KHZ; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 46 | const uint8_t ADC_DCP = DCP_DISABLED; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 47 | const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 48 | const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 49 | const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL; // See LTC6811_daisy.h for Options |
roger5641 | 0:3547f7580dbd | 50 | |
roger5641 | 0:3547f7580dbd | 51 | const uint16_t MEASUREMENT_LOOP_TIME = 500;//milliseconds(mS) |
roger5641 | 0:3547f7580dbd | 52 | |
roger5641 | 0:3547f7580dbd | 53 | //Under Voltage and Over Voltage Thresholds |
roger5641 | 0:3547f7580dbd | 54 | const uint16_t OV_THRESHOLD = 41000; // Over voltage threshold ADC Code. LSB = 0.0001 |
roger5641 | 0:3547f7580dbd | 55 | const uint16_t UV_THRESHOLD = 30000; // Under voltage threshold ADC Code. LSB = 0.0001 |
roger5641 | 0:3547f7580dbd | 56 | |
roger5641 | 0:3547f7580dbd | 57 | //Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS |
roger5641 | 0:3547f7580dbd | 58 | const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 59 | const uint8_t READ_CONFIG = DISABLED; // This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 60 | const uint8_t MEASURE_CELL = ENABLED; // This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 61 | const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 62 | const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 63 | const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED |
roger5641 | 0:3547f7580dbd | 64 | /************************************ |
roger5641 | 0:3547f7580dbd | 65 | END SETUP |
roger5641 | 0:3547f7580dbd | 66 | *************************************/ |
roger5641 | 0:3547f7580dbd | 67 | |
roger5641 | 0:3547f7580dbd | 68 | /****************************************************** |
roger5641 | 0:3547f7580dbd | 69 | *** Global Battery Variables received from 681x commands |
roger5641 | 0:3547f7580dbd | 70 | These variables store the results from the LTC6811 |
roger5641 | 0:3547f7580dbd | 71 | register reads and the array lengths must be based |
roger5641 | 0:3547f7580dbd | 72 | on the number of ICs on the stack |
roger5641 | 0:3547f7580dbd | 73 | ******************************************************/ |
roger5641 | 0:3547f7580dbd | 74 | |
roger5641 | 0:3547f7580dbd | 75 | cell_asic bms_ic[TOTAL_IC]; |
roger5641 | 0:3547f7580dbd | 76 | |
roger5641 | 0:3547f7580dbd | 77 | /*!********************************************************************* |
roger5641 | 0:3547f7580dbd | 78 | \brief main loop |
roger5641 | 0:3547f7580dbd | 79 | ***********************************************************************/ |
roger5641 | 0:3547f7580dbd | 80 | int main(void) |
roger5641 | 0:3547f7580dbd | 81 | { |
roger5641 | 2:e0ec3ed506ea | 82 | pc.baud(115200); |
open4416 | 8:404c4d795fde | 83 | spi_enable(); |
roger5641 | 2:e0ec3ed506ea | 84 | LTC681x_init_cfg(TOTAL_IC, bms_ic); |
open4416 | 8:404c4d795fde | 85 | LTC6811_reset_crc_count(TOTAL_IC,bms_ic); |
roger5641 | 2:e0ec3ed506ea | 86 | LTC6811_init_reg_limits(TOTAL_IC,bms_ic); |
roger5641 | 2:e0ec3ed506ea | 87 | print_menu(); |
open4416 | 8:404c4d795fde | 88 | |
open4416 | 8:404c4d795fde | 89 | while(1) { |
open4416 | 8:404c4d795fde | 90 | if (pc.readable()) { // Check for user input |
roger5641 | 2:e0ec3ed506ea | 91 | uint32_t user_command; |
roger5641 | 2:e0ec3ed506ea | 92 | user_command = read_int(); // Read the user command |
roger5641 | 4:47d6a0b63e38 | 93 | pc.printf("%d\n",user_command); |
roger5641 | 2:e0ec3ed506ea | 94 | run_command(user_command); |
roger5641 | 2:e0ec3ed506ea | 95 | } |
roger5641 | 2:e0ec3ed506ea | 96 | } |
roger5641 | 0:3547f7580dbd | 97 | } |
roger5641 | 0:3547f7580dbd | 98 | |
roger5641 | 0:3547f7580dbd | 99 | /*!***************************************** |
roger5641 | 0:3547f7580dbd | 100 | \brief executes the user command |
roger5641 | 0:3547f7580dbd | 101 | *******************************************/ |
roger5641 | 0:3547f7580dbd | 102 | |
roger5641 | 0:3547f7580dbd | 103 | void run_command(uint32_t cmd) |
roger5641 | 0:3547f7580dbd | 104 | { |
open4416 | 8:404c4d795fde | 105 | int8_t error = 0; |
open4416 | 8:404c4d795fde | 106 | uint32_t conv_time = 0; |
open4416 | 8:404c4d795fde | 107 | // uint32_t user_command; |
open4416 | 8:404c4d795fde | 108 | int8_t readIC=0; |
open4416 | 8:404c4d795fde | 109 | char input = 0; |
open4416 | 8:404c4d795fde | 110 | switch (cmd) { |
roger5641 | 0:3547f7580dbd | 111 | |
open4416 | 8:404c4d795fde | 112 | case 1: // Write Configuration Register |
open4416 | 8:404c4d795fde | 113 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 114 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 115 | print_config(); |
open4416 | 8:404c4d795fde | 116 | break; |
roger5641 | 0:3547f7580dbd | 117 | |
open4416 | 8:404c4d795fde | 118 | case 2: // Read Configuration Register |
open4416 | 8:404c4d795fde | 119 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 120 | error = LTC6811_rdcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 121 | check_error(error); |
open4416 | 8:404c4d795fde | 122 | print_rxconfig(); |
open4416 | 8:404c4d795fde | 123 | break; |
roger5641 | 0:3547f7580dbd | 124 | |
open4416 | 8:404c4d795fde | 125 | case 3: // Start Cell ADC Measurement |
open4416 | 8:404c4d795fde | 126 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 127 | LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT); |
open4416 | 8:404c4d795fde | 128 | conv_time = LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 129 | pc.printf("cell conversion completed in:"); |
open4416 | 8:404c4d795fde | 130 | pc.printf("%.1f",((float)conv_time/1000)); |
open4416 | 8:404c4d795fde | 131 | pc.printf("mS\n"); |
open4416 | 8:404c4d795fde | 132 | break; |
roger5641 | 0:3547f7580dbd | 133 | |
open4416 | 8:404c4d795fde | 134 | case 4: // Read Cell Voltage Registers |
open4416 | 8:404c4d795fde | 135 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 136 | error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers |
open4416 | 8:404c4d795fde | 137 | check_error(error); |
open4416 | 8:404c4d795fde | 138 | print_cells(DATALOG_DISABLED); |
open4416 | 8:404c4d795fde | 139 | break; |
roger5641 | 0:3547f7580dbd | 140 | |
open4416 | 8:404c4d795fde | 141 | case 5: // Start GPIO ADC Measurement |
open4416 | 8:404c4d795fde | 142 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 143 | LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT); |
open4416 | 8:404c4d795fde | 144 | LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 145 | pc.printf("aux conversion completed\n"); |
open4416 | 8:404c4d795fde | 146 | pc.printf("\n"); |
open4416 | 8:404c4d795fde | 147 | break; |
roger5641 | 0:3547f7580dbd | 148 | |
open4416 | 8:404c4d795fde | 149 | case 6: // Read AUX Voltage Registers |
open4416 | 8:404c4d795fde | 150 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 151 | error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers |
open4416 | 8:404c4d795fde | 152 | check_error(error); |
open4416 | 8:404c4d795fde | 153 | print_aux(DATALOG_DISABLED); |
open4416 | 8:404c4d795fde | 154 | break; |
roger5641 | 0:3547f7580dbd | 155 | |
open4416 | 8:404c4d795fde | 156 | case 7: // Start Status ADC Measurement |
open4416 | 8:404c4d795fde | 157 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 158 | LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT); |
open4416 | 8:404c4d795fde | 159 | LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 160 | pc.printf("stat conversion completed\n"); |
open4416 | 8:404c4d795fde | 161 | pc.printf("\n"); |
open4416 | 8:404c4d795fde | 162 | break; |
roger5641 | 0:3547f7580dbd | 163 | |
open4416 | 8:404c4d795fde | 164 | case 8: // Read Status registers |
open4416 | 8:404c4d795fde | 165 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 166 | error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers |
open4416 | 8:404c4d795fde | 167 | check_error(error); |
open4416 | 8:404c4d795fde | 168 | print_stat(); |
open4416 | 8:404c4d795fde | 169 | break; |
roger5641 | 0:3547f7580dbd | 170 | |
open4416 | 8:404c4d795fde | 171 | case 9: // Loop Measurements |
open4416 | 8:404c4d795fde | 172 | pc.printf("transmit 'm' to quit\n"); |
open4416 | 8:404c4d795fde | 173 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 174 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 175 | while (input != 'm') { |
open4416 | 8:404c4d795fde | 176 | if (pc.readable()) { |
open4416 | 8:404c4d795fde | 177 | input = read_char(); |
open4416 | 8:404c4d795fde | 178 | } |
roger5641 | 0:3547f7580dbd | 179 | |
open4416 | 8:404c4d795fde | 180 | measurement_loop(DATALOG_DISABLED); |
roger5641 | 0:3547f7580dbd | 181 | |
open4416 | 8:404c4d795fde | 182 | wait_ms(MEASUREMENT_LOOP_TIME); |
open4416 | 8:404c4d795fde | 183 | } |
open4416 | 8:404c4d795fde | 184 | //print_menu(); |
open4416 | 8:404c4d795fde | 185 | break; |
roger5641 | 0:3547f7580dbd | 186 | |
open4416 | 8:404c4d795fde | 187 | case 10: // Run open wire self test |
open4416 | 8:404c4d795fde | 188 | print_pec(); |
roger5641 | 0:3547f7580dbd | 189 | |
open4416 | 8:404c4d795fde | 190 | break; |
roger5641 | 0:3547f7580dbd | 191 | |
open4416 | 8:404c4d795fde | 192 | case 11: // Read in raw configuration data |
open4416 | 8:404c4d795fde | 193 | LTC6811_reset_crc_count(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 194 | break; |
roger5641 | 0:3547f7580dbd | 195 | |
open4416 | 8:404c4d795fde | 196 | case 12: // Run the ADC/Memory Self Test |
open4416 | 8:404c4d795fde | 197 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 198 | error = LTC6811_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic); |
open4416 | 8:404c4d795fde | 199 | pc.printf("%d", error); |
open4416 | 8:404c4d795fde | 200 | pc.printf(" : errors detected in Digital Filter and CELL Memory\n"); |
roger5641 | 0:3547f7580dbd | 201 | |
open4416 | 8:404c4d795fde | 202 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 203 | error = LTC6811_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic); |
open4416 | 8:404c4d795fde | 204 | pc.printf("%d",error); |
open4416 | 8:404c4d795fde | 205 | pc.printf(" : errors detected in Digital Filter and AUX Memory\n"); |
roger5641 | 0:3547f7580dbd | 206 | |
open4416 | 8:404c4d795fde | 207 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 208 | error = LTC6811_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic); |
open4416 | 8:404c4d795fde | 209 | pc.printf("%d",error); |
open4416 | 8:404c4d795fde | 210 | pc.printf(" : errors detected in Digital Filter and STAT Memory\n"); |
open4416 | 8:404c4d795fde | 211 | print_menu(); |
open4416 | 8:404c4d795fde | 212 | break; |
roger5641 | 0:3547f7580dbd | 213 | |
open4416 | 8:404c4d795fde | 214 | case 13: // Enable a discharge transistor |
open4416 | 8:404c4d795fde | 215 | pc.printf("Please enter the Spin number\n"); |
open4416 | 8:404c4d795fde | 216 | readIC = (int8_t)read_int(); |
open4416 | 8:404c4d795fde | 217 | LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 218 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 219 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 220 | print_config(); |
open4416 | 8:404c4d795fde | 221 | break; |
roger5641 | 0:3547f7580dbd | 222 | |
open4416 | 8:404c4d795fde | 223 | case 14: // Clear all discharge transistors |
open4416 | 8:404c4d795fde | 224 | clear_discharge(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 225 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 226 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 227 | print_config(); |
open4416 | 8:404c4d795fde | 228 | break; |
open4416 | 8:404c4d795fde | 229 | |
open4416 | 8:404c4d795fde | 230 | case 15: // Clear all ADC measurement registers |
open4416 | 8:404c4d795fde | 231 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 232 | LTC6811_clrcell(); |
open4416 | 8:404c4d795fde | 233 | LTC6811_clraux(); |
open4416 | 8:404c4d795fde | 234 | LTC6811_clrstat(); |
open4416 | 8:404c4d795fde | 235 | pc.printf("All Registers Cleared\n"); |
open4416 | 8:404c4d795fde | 236 | break; |
roger5641 | 0:3547f7580dbd | 237 | |
open4416 | 8:404c4d795fde | 238 | case 16: // Run the Mux Decoder Self Test |
open4416 | 8:404c4d795fde | 239 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 240 | LTC6811_diagn(); |
open4416 | 8:404c4d795fde | 241 | wait_ms(5); |
open4416 | 8:404c4d795fde | 242 | error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers |
open4416 | 8:404c4d795fde | 243 | check_error(error); |
open4416 | 8:404c4d795fde | 244 | error = 0; |
open4416 | 8:404c4d795fde | 245 | for (int ic = 0; |
open4416 | 8:404c4d795fde | 246 | ic<TOTAL_IC; |
open4416 | 8:404c4d795fde | 247 | ic++) { |
open4416 | 8:404c4d795fde | 248 | if (bms_ic[ic].stat.mux_fail[0] != 0) error++; |
open4416 | 8:404c4d795fde | 249 | } |
open4416 | 8:404c4d795fde | 250 | if (error==0) pc.printf("Mux Test: PASS\n"); |
open4416 | 8:404c4d795fde | 251 | else pc.printf("Mux Test: FAIL\n"); |
roger5641 | 0:3547f7580dbd | 252 | |
open4416 | 8:404c4d795fde | 253 | break; |
roger5641 | 0:3547f7580dbd | 254 | |
open4416 | 8:404c4d795fde | 255 | case 17: // Run ADC Overlap self test |
open4416 | 8:404c4d795fde | 256 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 257 | error = (int8_t)LTC6811_run_adc_overlap(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 258 | if (error==0) pc.printf("Overlap Test: PASS\n"); |
open4416 | 8:404c4d795fde | 259 | else pc.printf("Overlap Test: FAIL\n"); |
open4416 | 8:404c4d795fde | 260 | break; |
roger5641 | 0:3547f7580dbd | 261 | |
open4416 | 8:404c4d795fde | 262 | case 18: // Run ADC Redundancy self test |
open4416 | 8:404c4d795fde | 263 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 264 | error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic); |
open4416 | 8:404c4d795fde | 265 | pc.printf("%d",error); |
open4416 | 8:404c4d795fde | 266 | pc.printf(" : errors detected in AUX Measurement\n"); |
roger5641 | 0:3547f7580dbd | 267 | |
open4416 | 8:404c4d795fde | 268 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 269 | error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic); |
open4416 | 8:404c4d795fde | 270 | pc.printf("%d",error); |
open4416 | 8:404c4d795fde | 271 | pc.printf(" : errors detected in STAT Measurement\n"); |
open4416 | 8:404c4d795fde | 272 | break; |
roger5641 | 0:3547f7580dbd | 273 | |
open4416 | 8:404c4d795fde | 274 | case 19: |
open4416 | 8:404c4d795fde | 275 | LTC6811_run_openwire(TOTAL_IC, bms_ic); |
open4416 | 8:404c4d795fde | 276 | print_open(); |
open4416 | 8:404c4d795fde | 277 | break; |
roger5641 | 0:3547f7580dbd | 278 | |
open4416 | 8:404c4d795fde | 279 | case 20: //Datalog print option Loop Measurements |
open4416 | 8:404c4d795fde | 280 | pc.printf("transmit 'm' to quit\n"); |
open4416 | 8:404c4d795fde | 281 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 282 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 283 | while (input != 'm') { |
open4416 | 8:404c4d795fde | 284 | if (pc.readable()) { |
open4416 | 8:404c4d795fde | 285 | input = read_char(); |
open4416 | 8:404c4d795fde | 286 | } |
roger5641 | 0:3547f7580dbd | 287 | |
open4416 | 8:404c4d795fde | 288 | measurement_loop(DATALOG_ENABLED); |
open4416 | 8:404c4d795fde | 289 | |
open4416 | 8:404c4d795fde | 290 | wait_ms(MEASUREMENT_LOOP_TIME); |
open4416 | 8:404c4d795fde | 291 | } |
open4416 | 8:404c4d795fde | 292 | print_menu(); |
open4416 | 8:404c4d795fde | 293 | break; |
roger5641 | 0:3547f7580dbd | 294 | |
open4416 | 8:404c4d795fde | 295 | case 'm': //prints menu |
open4416 | 8:404c4d795fde | 296 | print_menu(); |
open4416 | 8:404c4d795fde | 297 | break; |
roger5641 | 0:3547f7580dbd | 298 | |
open4416 | 8:404c4d795fde | 299 | default: |
open4416 | 8:404c4d795fde | 300 | pc.printf("Incorrect Option\n"); |
open4416 | 8:404c4d795fde | 301 | break; |
open4416 | 8:404c4d795fde | 302 | } |
roger5641 | 0:3547f7580dbd | 303 | } |
roger5641 | 0:3547f7580dbd | 304 | |
roger5641 | 0:3547f7580dbd | 305 | void measurement_loop(uint8_t datalog_en) |
roger5641 | 0:3547f7580dbd | 306 | { |
open4416 | 8:404c4d795fde | 307 | int8_t error = 0; |
open4416 | 8:404c4d795fde | 308 | if (WRITE_CONFIG == ENABLED) { |
open4416 | 8:404c4d795fde | 309 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 310 | LTC6811_wrcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 311 | print_config(); |
open4416 | 8:404c4d795fde | 312 | } |
roger5641 | 0:3547f7580dbd | 313 | |
open4416 | 8:404c4d795fde | 314 | if (READ_CONFIG == ENABLED) { |
open4416 | 8:404c4d795fde | 315 | wakeup_sleep(TOTAL_IC); |
open4416 | 8:404c4d795fde | 316 | error = LTC6811_rdcfg(TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 317 | check_error(error); |
open4416 | 8:404c4d795fde | 318 | print_rxconfig(); |
open4416 | 8:404c4d795fde | 319 | } |
roger5641 | 0:3547f7580dbd | 320 | |
open4416 | 8:404c4d795fde | 321 | if (MEASURE_CELL == ENABLED) { |
open4416 | 8:404c4d795fde | 322 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 323 | LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT); |
open4416 | 8:404c4d795fde | 324 | LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 325 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 326 | error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); |
open4416 | 8:404c4d795fde | 327 | check_error(error); |
open4416 | 8:404c4d795fde | 328 | print_cells(datalog_en); |
roger5641 | 0:3547f7580dbd | 329 | |
open4416 | 8:404c4d795fde | 330 | } |
roger5641 | 0:3547f7580dbd | 331 | |
open4416 | 8:404c4d795fde | 332 | if (MEASURE_AUX == ENABLED) { |
open4416 | 8:404c4d795fde | 333 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 334 | LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL); |
open4416 | 8:404c4d795fde | 335 | LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 336 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 337 | error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers |
open4416 | 8:404c4d795fde | 338 | check_error(error); |
open4416 | 8:404c4d795fde | 339 | print_aux(datalog_en); |
open4416 | 8:404c4d795fde | 340 | } |
roger5641 | 0:3547f7580dbd | 341 | |
open4416 | 8:404c4d795fde | 342 | if (MEASURE_STAT == ENABLED) { |
open4416 | 8:404c4d795fde | 343 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 344 | LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL); |
open4416 | 8:404c4d795fde | 345 | LTC6811_pollAdc(); |
open4416 | 8:404c4d795fde | 346 | wakeup_idle(TOTAL_IC); |
open4416 | 8:404c4d795fde | 347 | error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers |
open4416 | 8:404c4d795fde | 348 | check_error(error); |
open4416 | 8:404c4d795fde | 349 | print_stat(); |
open4416 | 8:404c4d795fde | 350 | } |
roger5641 | 0:3547f7580dbd | 351 | |
open4416 | 8:404c4d795fde | 352 | if (PRINT_PEC == ENABLED) { |
open4416 | 8:404c4d795fde | 353 | print_pec(); |
open4416 | 8:404c4d795fde | 354 | } |
roger5641 | 0:3547f7580dbd | 355 | |
roger5641 | 0:3547f7580dbd | 356 | } |
roger5641 | 0:3547f7580dbd | 357 | |
roger5641 | 0:3547f7580dbd | 358 | |
roger5641 | 0:3547f7580dbd | 359 | /*!********************************* |
roger5641 | 0:3547f7580dbd | 360 | \brief Prints the main menu |
roger5641 | 0:3547f7580dbd | 361 | ***********************************/ |
roger5641 | 0:3547f7580dbd | 362 | void print_menu() |
roger5641 | 0:3547f7580dbd | 363 | { |
open4416 | 8:404c4d795fde | 364 | pc.printf("Please enter LTC6811 Command\n"); |
open4416 | 8:404c4d795fde | 365 | pc.printf("Write Configuration: 1 | Reset PEC Counter: 11\n"); |
open4416 | 8:404c4d795fde | 366 | pc.printf("Read Configuration: 2 | Run ADC Self Test: 12\n"); |
open4416 | 8:404c4d795fde | 367 | pc.printf("Start Cell Voltage Conversion: 3 | Set Discharge: 13\n"); |
open4416 | 8:404c4d795fde | 368 | pc.printf("Read Cell Voltages: 4 | Clear Discharge: 14\n"); |
open4416 | 8:404c4d795fde | 369 | pc.printf("Start Aux Voltage Conversion: 5 | Clear Registers: 15\n"); |
open4416 | 8:404c4d795fde | 370 | pc.printf("Read Aux Voltages: 6 | Run Mux Self Test: 16\n"); |
open4416 | 8:404c4d795fde | 371 | pc.printf("Start Stat Voltage Conversion: 7 | Run ADC overlap Test: 17\n"); |
open4416 | 8:404c4d795fde | 372 | pc.printf("Read Stat Voltages: 8 | Run Digital Redundancy Test: 18\n"); |
open4416 | 8:404c4d795fde | 373 | pc.printf("loop Measurements: 9 | Run Open Wire Test: 19\n"); |
open4416 | 8:404c4d795fde | 374 | pc.printf("Read PEC Errors: 10 | Loop measurements with datalog output: 20\n"); |
open4416 | 8:404c4d795fde | 375 | pc.printf("\n"); |
open4416 | 8:404c4d795fde | 376 | pc.printf("Please enter command:\n"); |
open4416 | 8:404c4d795fde | 377 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 378 | } |
roger5641 | 0:3547f7580dbd | 379 | |
roger5641 | 0:3547f7580dbd | 380 | /*!************************************************************ |
open4416 | 8:404c4d795fde | 381 | \brief Prints cell voltage codes to the serial port |
roger5641 | 0:3547f7580dbd | 382 | *************************************************************/ |
roger5641 | 0:3547f7580dbd | 383 | void print_cells(uint8_t datalog_en) |
roger5641 | 0:3547f7580dbd | 384 | { |
open4416 | 8:404c4d795fde | 385 | for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) { |
roger5641 | 0:3547f7580dbd | 386 | |
open4416 | 8:404c4d795fde | 387 | if (datalog_en == 0) { |
open4416 | 8:404c4d795fde | 388 | pc.printf("IC%d, ", current_ic+1); |
open4416 | 8:404c4d795fde | 389 | for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) { |
open4416 | 8:404c4d795fde | 390 | pc.printf("C%d:", i+1); |
open4416 | 8:404c4d795fde | 391 | pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001); |
open4416 | 8:404c4d795fde | 392 | } |
open4416 | 8:404c4d795fde | 393 | pc.printf("\n"); |
open4416 | 8:404c4d795fde | 394 | } else { |
open4416 | 8:404c4d795fde | 395 | pc.printf("Cells, "); |
open4416 | 8:404c4d795fde | 396 | for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) { |
open4416 | 8:404c4d795fde | 397 | pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001); |
open4416 | 8:404c4d795fde | 398 | } |
open4416 | 8:404c4d795fde | 399 | } |
roger5641 | 0:3547f7580dbd | 400 | |
roger5641 | 0:3547f7580dbd | 401 | } |
open4416 | 8:404c4d795fde | 402 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 403 | } |
roger5641 | 0:3547f7580dbd | 404 | |
roger5641 | 0:3547f7580dbd | 405 | /*!**************************************************************************** |
open4416 | 8:404c4d795fde | 406 | \brief Prints Open wire test results to the serial port |
roger5641 | 0:3547f7580dbd | 407 | *****************************************************************************/ |
roger5641 | 0:3547f7580dbd | 408 | void print_open() |
roger5641 | 0:3547f7580dbd | 409 | { |
open4416 | 8:404c4d795fde | 410 | for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) { |
open4416 | 8:404c4d795fde | 411 | if (bms_ic[current_ic].system_open_wire == 0) { |
open4416 | 8:404c4d795fde | 412 | pc.printf("No Opens Detected on IC%d\n", current_ic+1); |
open4416 | 8:404c4d795fde | 413 | } else { |
open4416 | 8:404c4d795fde | 414 | for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) { |
open4416 | 8:404c4d795fde | 415 | if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) { |
open4416 | 8:404c4d795fde | 416 | pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell); |
open4416 | 8:404c4d795fde | 417 | } |
open4416 | 8:404c4d795fde | 418 | } |
open4416 | 8:404c4d795fde | 419 | } |
roger5641 | 0:3547f7580dbd | 420 | } |
roger5641 | 0:3547f7580dbd | 421 | } |
roger5641 | 0:3547f7580dbd | 422 | |
roger5641 | 0:3547f7580dbd | 423 | /*!**************************************************************************** |
open4416 | 8:404c4d795fde | 424 | \brief Prints GPIO voltage codes and Vref2 voltage code onto the serial port |
roger5641 | 0:3547f7580dbd | 425 | *****************************************************************************/ |
roger5641 | 0:3547f7580dbd | 426 | void print_aux(uint8_t datalog_en) |
roger5641 | 0:3547f7580dbd | 427 | { |
open4416 | 8:404c4d795fde | 428 | |
open4416 | 8:404c4d795fde | 429 | for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) { |
open4416 | 8:404c4d795fde | 430 | if (datalog_en == 0) { |
open4416 | 8:404c4d795fde | 431 | pc.printf(" IC%d", current_ic+1); |
open4416 | 8:404c4d795fde | 432 | for (int i=0; i < 5; i++) { |
open4416 | 8:404c4d795fde | 433 | pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001); |
open4416 | 8:404c4d795fde | 434 | } |
open4416 | 8:404c4d795fde | 435 | pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001); |
open4416 | 8:404c4d795fde | 436 | } else { |
open4416 | 8:404c4d795fde | 437 | pc.printf("AUX, "); |
open4416 | 8:404c4d795fde | 438 | for (int i=0; i < 6; i++) { |
open4416 | 8:404c4d795fde | 439 | pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001); |
open4416 | 8:404c4d795fde | 440 | } |
open4416 | 8:404c4d795fde | 441 | } |
roger5641 | 0:3547f7580dbd | 442 | } |
open4416 | 8:404c4d795fde | 443 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 444 | } |
roger5641 | 0:3547f7580dbd | 445 | |
roger5641 | 0:3547f7580dbd | 446 | /*!**************************************************************************** |
open4416 | 8:404c4d795fde | 447 | \brief Prints Status voltage codes and Vref2 voltage code onto the serial port |
roger5641 | 0:3547f7580dbd | 448 | *****************************************************************************/ |
roger5641 | 0:3547f7580dbd | 449 | void print_stat() |
roger5641 | 0:3547f7580dbd | 450 | { |
open4416 | 8:404c4d795fde | 451 | |
open4416 | 8:404c4d795fde | 452 | for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) { |
open4416 | 8:404c4d795fde | 453 | pc.printf("IC%d", current_ic+1); |
open4416 | 8:404c4d795fde | 454 | pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20); |
open4416 | 8:404c4d795fde | 455 | pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001); |
open4416 | 8:404c4d795fde | 456 | pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001); |
open4416 | 8:404c4d795fde | 457 | pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001); |
open4416 | 8:404c4d795fde | 458 | } |
open4416 | 8:404c4d795fde | 459 | |
open4416 | 8:404c4d795fde | 460 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 461 | } |
roger5641 | 0:3547f7580dbd | 462 | |
roger5641 | 0:3547f7580dbd | 463 | /*!****************************************************************************** |
roger5641 | 0:3547f7580dbd | 464 | \brief Prints the configuration data that is going to be written to the LTC6811 |
open4416 | 8:404c4d795fde | 465 | to the serial port. |
roger5641 | 0:3547f7580dbd | 466 | ********************************************************************************/ |
roger5641 | 0:3547f7580dbd | 467 | void print_config() |
roger5641 | 0:3547f7580dbd | 468 | { |
open4416 | 8:404c4d795fde | 469 | int cfg_pec; |
roger5641 | 0:3547f7580dbd | 470 | |
open4416 | 8:404c4d795fde | 471 | pc.printf("Written Configuration: \n"); |
open4416 | 8:404c4d795fde | 472 | for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) { |
open4416 | 8:404c4d795fde | 473 | pc.printf(" IC "); |
open4416 | 8:404c4d795fde | 474 | pc.printf("%d", current_ic+1); |
open4416 | 8:404c4d795fde | 475 | pc.printf(": "); |
open4416 | 8:404c4d795fde | 476 | pc.printf("0x"); |
open4416 | 8:404c4d795fde | 477 | serial_print_hex(bms_ic[current_ic].config.tx_data[0]); |
open4416 | 8:404c4d795fde | 478 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 479 | serial_print_hex(bms_ic[current_ic].config.tx_data[1]); |
open4416 | 8:404c4d795fde | 480 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 481 | serial_print_hex(bms_ic[current_ic].config.tx_data[2]); |
open4416 | 8:404c4d795fde | 482 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 483 | serial_print_hex(bms_ic[current_ic].config.tx_data[3]); |
open4416 | 8:404c4d795fde | 484 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 485 | serial_print_hex(bms_ic[current_ic].config.tx_data[4]); |
open4416 | 8:404c4d795fde | 486 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 487 | serial_print_hex(bms_ic[current_ic].config.tx_data[5]); |
open4416 | 8:404c4d795fde | 488 | pc.printf(", Calculated PEC: 0x"); |
open4416 | 8:404c4d795fde | 489 | cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]); |
open4416 | 8:404c4d795fde | 490 | serial_print_hex((uint8_t)(cfg_pec>>8)); |
open4416 | 8:404c4d795fde | 491 | pc.printf(", 0x"); |
open4416 | 8:404c4d795fde | 492 | serial_print_hex((uint8_t)(cfg_pec)); |
open4416 | 8:404c4d795fde | 493 | pc.printf("\n"); |
open4416 | 8:404c4d795fde | 494 | } |
open4416 | 8:404c4d795fde | 495 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 496 | } |
roger5641 | 0:3547f7580dbd | 497 | |
roger5641 | 0:3547f7580dbd | 498 | /*!***************************************************************** |
roger5641 | 0:3547f7580dbd | 499 | \brief Prints the configuration data that was read back from the |
open4416 | 8:404c4d795fde | 500 | LTC6811 to the serial port. |
roger5641 | 0:3547f7580dbd | 501 | *******************************************************************/ |
roger5641 | 0:3547f7580dbd | 502 | void print_rxconfig() |
roger5641 | 0:3547f7580dbd | 503 | { |
roger5641 | 4:47d6a0b63e38 | 504 | pc.printf("Received Configuration "); |
open4416 | 8:404c4d795fde | 505 | for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) { |
roger5641 | 4:47d6a0b63e38 | 506 | pc.printf(" IC "); |
open4416 | 8:404c4d795fde | 507 | pc.printf("%d", current_ic+1); |
roger5641 | 4:47d6a0b63e38 | 508 | pc.printf(": 0x"); |
roger5641 | 4:47d6a0b63e38 | 509 | serial_print_hex(bms_ic[current_ic].config.rx_data[0]); |
roger5641 | 4:47d6a0b63e38 | 510 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 511 | serial_print_hex(bms_ic[current_ic].config.rx_data[1]); |
roger5641 | 4:47d6a0b63e38 | 512 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 513 | serial_print_hex(bms_ic[current_ic].config.rx_data[2]); |
roger5641 | 4:47d6a0b63e38 | 514 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 515 | serial_print_hex(bms_ic[current_ic].config.rx_data[3]); |
roger5641 | 4:47d6a0b63e38 | 516 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 517 | serial_print_hex(bms_ic[current_ic].config.rx_data[4]); |
roger5641 | 4:47d6a0b63e38 | 518 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 519 | serial_print_hex(bms_ic[current_ic].config.rx_data[5]); |
roger5641 | 4:47d6a0b63e38 | 520 | pc.printf(", Received PEC: 0x"); |
roger5641 | 4:47d6a0b63e38 | 521 | serial_print_hex(bms_ic[current_ic].config.rx_data[6]); |
roger5641 | 4:47d6a0b63e38 | 522 | pc.printf(", 0x"); |
roger5641 | 4:47d6a0b63e38 | 523 | serial_print_hex(bms_ic[current_ic].config.rx_data[7]); |
open4416 | 8:404c4d795fde | 524 | pc.printf("\n"); |
roger5641 | 4:47d6a0b63e38 | 525 | } |
open4416 | 8:404c4d795fde | 526 | pc.printf("\n"); |
roger5641 | 0:3547f7580dbd | 527 | } |
roger5641 | 0:3547f7580dbd | 528 | |
roger5641 | 0:3547f7580dbd | 529 | void print_pec() |
roger5641 | 0:3547f7580dbd | 530 | { |
open4416 | 8:404c4d795fde | 531 | for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) { |
open4416 | 8:404c4d795fde | 532 | pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count); |
open4416 | 8:404c4d795fde | 533 | pc.printf(" : PEC Errors Detected on IC"); |
open4416 | 8:404c4d795fde | 534 | pc.printf("%d\n", current_ic+1); |
open4416 | 8:404c4d795fde | 535 | } |
roger5641 | 0:3547f7580dbd | 536 | } |
roger5641 | 0:3547f7580dbd | 537 | |
roger5641 | 0:3547f7580dbd | 538 | |
roger5641 | 0:3547f7580dbd | 539 | void serial_print_hex(uint8_t data) |
roger5641 | 0:3547f7580dbd | 540 | { |
open4416 | 8:404c4d795fde | 541 | if (data < 16) { |
open4416 | 8:404c4d795fde | 542 | pc.printf("0x0%X", data); |
open4416 | 8:404c4d795fde | 543 | } else |
open4416 | 8:404c4d795fde | 544 | pc.printf("0x%X", data); |
roger5641 | 0:3547f7580dbd | 545 | } |
roger5641 | 0:3547f7580dbd | 546 | |
roger5641 | 0:3547f7580dbd | 547 | //Function to check error flag and print PEC error message |
roger5641 | 0:3547f7580dbd | 548 | void check_error(int error) |
roger5641 | 0:3547f7580dbd | 549 | { |
open4416 | 8:404c4d795fde | 550 | if (error == -1) { |
open4416 | 8:404c4d795fde | 551 | pc.printf("A PEC error was detected in the received data"); |
open4416 | 8:404c4d795fde | 552 | } |
roger5641 | 0:3547f7580dbd | 553 | } |
open4416 | 8:404c4d795fde | 554 | |
open4416 | 8:404c4d795fde | 555 | |
open4416 | 8:404c4d795fde | 556 | // hex conversion constants |
open4416 | 8:404c4d795fde | 557 | char hex_digits[16]= { |
open4416 | 8:404c4d795fde | 558 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' |
open4416 | 8:404c4d795fde | 559 | }; |
open4416 | 8:404c4d795fde | 560 | |
open4416 | 8:404c4d795fde | 561 | // global variables |
open4416 | 8:404c4d795fde | 562 | |
open4416 | 8:404c4d795fde | 563 | char hex_to_byte_buffer[5]= { |
open4416 | 8:404c4d795fde | 564 | '0', 'x', '0', '0', '\0' |
open4416 | 8:404c4d795fde | 565 | }; // buffer for ASCII hex to byte conversion |
open4416 | 8:404c4d795fde | 566 | char byte_to_hex_buffer[3]= { |
open4416 | 8:404c4d795fde | 567 | '\0','\0','\0' |
open4416 | 8:404c4d795fde | 568 | }; |
open4416 | 8:404c4d795fde | 569 | |
open4416 | 8:404c4d795fde | 570 | //char read_hex() |
open4416 | 8:404c4d795fde | 571 | //// read 2 hex characters from the serial buffer and convert |
open4416 | 8:404c4d795fde | 572 | //// them to a byte |
open4416 | 8:404c4d795fde | 573 | //{ |
open4416 | 8:404c4d795fde | 574 | // byte data; |
open4416 | 8:404c4d795fde | 575 | // hex_to_byte_buffer[2]=get_char(); |
open4416 | 8:404c4d795fde | 576 | // hex_to_byte_buffer[3]=get_char(); |
open4416 | 8:404c4d795fde | 577 | // get_char(); |
open4416 | 8:404c4d795fde | 578 | // get_char(); |
open4416 | 8:404c4d795fde | 579 | // data = strtol(hex_to_byte_buffer, NULL, 0); |
open4416 | 8:404c4d795fde | 580 | // return(data); |
open4416 | 8:404c4d795fde | 581 | //} |
open4416 | 8:404c4d795fde | 582 | // |
open4416 | 8:404c4d795fde | 583 | //char get_char() |
open4416 | 8:404c4d795fde | 584 | //{ |
open4416 | 8:404c4d795fde | 585 | // // read a command from the serial port |
open4416 | 8:404c4d795fde | 586 | // while (pc.readable() == 0); |
open4416 | 8:404c4d795fde | 587 | // return(Serial.read()); |
open4416 | 8:404c4d795fde | 588 | //} |
open4416 | 8:404c4d795fde | 589 | |
open4416 | 8:404c4d795fde | 590 |