From: Keith Packard Date: Sat, 5 Apr 2014 07:18:57 +0000 (-0700) Subject: altos: Report battery voltage instead of S at startup X-Git-Tag: 1.3.2.2~149 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=0d367fc24bfd0377db6f3b00a888a18245616767 altos: Report battery voltage instead of S at startup This works on everything with a beeper except TeleMetrum v1.0 which just doesn't have enough flash space for the code. Signed-off-by: Keith Packard --- diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h index 34235b08..fcac331b 100644 --- a/src/cc1111/ao_arch.h +++ b/src/cc1111/ao_arch.h @@ -326,4 +326,6 @@ void ao_p0_isr(void) __interrupt(13); #endif +#define AO_ADC_MAX 32767 + #endif /* _AO_ARCH_H_ */ diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h index 2f0e2884..5b1586e0 100644 --- a/src/cc1111/ao_pins.h +++ b/src/cc1111/ao_pins.h @@ -58,6 +58,7 @@ #define HAS_FLIGHT 1 #define HAS_USB 1 #define HAS_BEEP 1 + #define HAS_BATTERY_REPORT 1 #define HAS_GPS 1 #define HAS_SERIAL_1 1 #define HAS_ADC 1 @@ -94,6 +95,7 @@ #define HAS_FLIGHT 1 #define HAS_USB 1 #define HAS_BEEP 1 + #define HAS_BATTERY_REPORT 1 #define HAS_GPS 1 #define HAS_SERIAL_1 1 #define HAS_ADC 1 @@ -572,4 +574,21 @@ struct ao_adc { #endif }; +/* + * Voltage divider on ADC battery sampler + */ +#define AO_BATTERY_DIV_PLUS 5 /* 5k */ +#define AO_BATTERY_DIV_MINUS 10 /* 10k */ + +/* + * Voltage divider on ADC igniter samplers + */ +#define AO_IGNITE_DIV_PLUS 100 /* 100k */ +#define AO_IGNITE_DIV_MINUS 27 /* 27k */ + +/* + * ADC reference in decivolts + */ +#define AO_ADC_REFERENCE_DV 33 + #endif /* _AO_PINS_H_ */ diff --git a/src/easymega-v1.0/ao_pins.h b/src/easymega-v1.0/ao_pins.h index 0b6c0f07..fb6e05b1 100644 --- a/src/easymega-v1.0/ao_pins.h +++ b/src/easymega-v1.0/ao_pins.h @@ -66,6 +66,7 @@ #define USE_STORAGE_CONFIG 0 #define HAS_USB 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define HAS_RADIO 0 #define HAS_TELEMETRY 0 #define HAS_APRS 0 diff --git a/src/easymini-v1.0/Makefile b/src/easymini-v1.0/Makefile index 7dae2692..654be22b 100644 --- a/src/easymini-v1.0/Makefile +++ b/src/easymini-v1.0/Makefile @@ -32,6 +32,7 @@ ALTOS_SRC = \ ao_sample.c \ ao_data.c \ ao_convert_pa.c \ + ao_convert_volt.c \ ao_task.c \ ao_log.c \ ao_log_mini.c \ diff --git a/src/easymini-v1.0/ao_pins.h b/src/easymini-v1.0/ao_pins.h index 6757047f..0edde5a2 100644 --- a/src/easymini-v1.0/ao_pins.h +++ b/src/easymini-v1.0/ao_pins.h @@ -15,7 +15,8 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#define HAS_BEEP 1 +#define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define AO_STACK_SIZE 384 @@ -133,3 +134,20 @@ struct ao_adc { #define AO_ADC_DUMP(p) \ printf("tick: %5u apogee: %5d main: %5d batt: %5d\n", \ (p)->tick, (p)->adc.sense_a, (p)->adc.sense_m, (p)->adc.v_batt) + +/* + * Voltage divider on ADC battery sampler + */ +#define AO_BATTERY_DIV_PLUS 100 /* 100k */ +#define AO_BATTERY_DIV_MINUS 27 /* 27k */ + +/* + * Voltage divider on ADC igniter samplers + */ +#define AO_IGNITE_DIV_PLUS 100 /* 100k */ +#define AO_IGNITE_DIV_MINUS 27 /* 27k */ + +/* + * ADC reference in decivolts + */ +#define AO_ADC_REFERENCE_DV 33 diff --git a/src/kernel/ao_convert_volt.c b/src/kernel/ao_convert_volt.c index 8556d423..7afc34bf 100644 --- a/src/kernel/ao_convert_volt.c +++ b/src/kernel/ao_convert_volt.c @@ -17,17 +17,23 @@ #include "ao.h" -#define scale(v,p,m) ((int32_t) (v) * (AO_ADC_REFERENCE_DV * ((p) + (m))) / (AO_ADC_MAX * (m))) +#define MUL(p,m) ((int32_t) AO_ADC_REFERENCE_DV * ((p) + (m))) +#define ADD(p,m) (MUL(p,m)/2) +#define DIV(p,m) ((int32_t) AO_ADC_MAX * (m)) +#define scale(v,p,m) (((int32_t) (v) * MUL(p,m) + ADD(p,m)) / DIV(p,m)) +#if HAS_APRS || HAS_BATTERY_REPORT int16_t ao_battery_decivolt(int16_t adc) { return scale(adc, AO_BATTERY_DIV_PLUS, AO_BATTERY_DIV_MINUS); } +#endif +#if HAS_APRS int16_t ao_ignite_decivolt(int16_t adc) { return scale(adc, AO_IGNITE_DIV_PLUS, AO_IGNITE_DIV_MINUS); } - +#endif diff --git a/src/kernel/ao_report.c b/src/kernel/ao_report.c index 1104cd82..1a0e9e16 100644 --- a/src/kernel/ao_report.c +++ b/src/kernel/ao_report.c @@ -87,19 +87,18 @@ ao_report_digit(uint8_t digit) __reentrant } static void -ao_report_altitude(void) +ao_report_number(int16_t n) { - __pdata int16_t agl = ao_max_height; __xdata uint8_t digits[10]; __pdata uint8_t ndigits, i; - if (agl < 0) - agl = 0; + if (n < 0) + n = 0; ndigits = 0; do { - digits[ndigits++] = agl % 10; - agl /= 10; - } while (agl); + digits[ndigits++] = n % 10; + n /= 10; + } while (n); i = ndigits; do @@ -107,6 +106,27 @@ ao_report_altitude(void) while (i != 0); } +static void +ao_report_altitude(void) +{ + ao_report_number(ao_max_height); +} + +#if HAS_BATTERY_REPORT +static void +ao_report_battery(void) +{ + __xdata struct ao_data packet; + for (;;) { + ao_data_get(&packet); + if (packet.adc.v_batt != 0) + break; + ao_sleep(DATA_TO_XDATA(&ao_sample_data)); + } + ao_report_number(ao_battery_decivolt(packet.adc.v_batt)); +} +#endif + #if HAS_IGNITE_REPORT static uint8_t ao_report_igniter_ready(enum ao_igniter igniter) @@ -163,7 +183,12 @@ ao_report(void) { ao_report_state = ao_flight_state; for(;;) { - ao_report_beep(); +#if HAS_BATTERY_REPORT + if (ao_flight_state == ao_flight_startup) + ao_report_battery(); + else +#endif + ao_report_beep(); if (ao_flight_state == ao_flight_landed) { ao_report_altitude(); #if HAS_FLIGHT diff --git a/src/lpc/ao_arch.h b/src/lpc/ao_arch.h index 9dcfadc0..dd0debd4 100644 --- a/src/lpc/ao_arch.h +++ b/src/lpc/ao_arch.h @@ -143,4 +143,8 @@ ao_serial_init(void); #define AO_BOOT_LOADER_BASE ((uint32_t *) 0x00000000) #define HAS_BOOT_LOADER 1 +/* ADC definitions */ + +#define AO_ADC_MAX 32767 + #endif /* _AO_ARCH_H_ */ diff --git a/src/teleballoon-v1.1/ao_pins.h b/src/teleballoon-v1.1/ao_pins.h index 7ba48c96..4c23ca88 100644 --- a/src/teleballoon-v1.1/ao_pins.h +++ b/src/teleballoon-v1.1/ao_pins.h @@ -28,6 +28,7 @@ #define HAS_FLIGHT 1 #define HAS_USB 1 #define HAS_BEEP 1 + #define HAS_BATTERY_REPORT 1 #define HAS_GPS 1 #define HAS_SERIAL_1 1 #define HAS_ADC 1 diff --git a/src/teleballoon-v2.0/ao_pins.h b/src/teleballoon-v2.0/ao_pins.h index 22551d9e..f2515521 100644 --- a/src/teleballoon-v2.0/ao_pins.h +++ b/src/teleballoon-v2.0/ao_pins.h @@ -66,6 +66,7 @@ #define USE_STORAGE_CONFIG 0 #define HAS_USB 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define BEEPER_CHANNEL 4 #define HAS_RADIO 1 #define HAS_TELEMETRY 1 diff --git a/src/telemega-v0.1/ao_pins.h b/src/telemega-v0.1/ao_pins.h index db397c66..a63c76a0 100644 --- a/src/telemega-v0.1/ao_pins.h +++ b/src/telemega-v0.1/ao_pins.h @@ -71,6 +71,7 @@ #define USE_STORAGE_CONFIG 0 #define HAS_USB 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 diff --git a/src/telemega-v1.0/ao_pins.h b/src/telemega-v1.0/ao_pins.h index fe97c684..7f0b1f94 100644 --- a/src/telemega-v1.0/ao_pins.h +++ b/src/telemega-v1.0/ao_pins.h @@ -71,6 +71,7 @@ #define USE_STORAGE_CONFIG 0 #define HAS_USB 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 diff --git a/src/telemetrum-v1.1/Makefile b/src/telemetrum-v1.1/Makefile index e44be7f9..61e9273b 100644 --- a/src/telemetrum-v1.1/Makefile +++ b/src/telemetrum-v1.1/Makefile @@ -12,6 +12,7 @@ TM_SRC = \ ao_companion.c \ ao_gps_skytraq.c \ ao_gps_show.c \ + ao_convert_volt.c \ ao_m25.c include ../product/Makefile.telemetrum diff --git a/src/telemetrum-v1.2/Makefile b/src/telemetrum-v1.2/Makefile index f2285fbe..38ba6d49 100644 --- a/src/telemetrum-v1.2/Makefile +++ b/src/telemetrum-v1.2/Makefile @@ -12,6 +12,7 @@ TM_SRC = \ ao_companion.c \ ao_gps_skytraq.c \ ao_gps_show.c \ + ao_convert_volt.c \ ao_m25.c include ../product/Makefile.telemetrum diff --git a/src/telemetrum-v2.0/ao_pins.h b/src/telemetrum-v2.0/ao_pins.h index 1b5cedc7..2ccac628 100644 --- a/src/telemetrum-v2.0/ao_pins.h +++ b/src/telemetrum-v2.0/ao_pins.h @@ -66,6 +66,7 @@ #define USE_STORAGE_CONFIG 0 #define HAS_USB 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define BEEPER_CHANNEL 4 #define HAS_RADIO 1 #define HAS_TELEMETRY 1 diff --git a/src/telemini-v2.0/Makefile b/src/telemini-v2.0/Makefile index 606b4f3b..34f35cd9 100644 --- a/src/telemini-v2.0/Makefile +++ b/src/telemini-v2.0/Makefile @@ -59,6 +59,7 @@ CC1111_SRC = \ ao_spi.c \ ao_usb.c \ ao_convert_pa.c \ + ao_convert_volt.c \ ao_beep.c \ ao_timer.c \ ao_exti.c \ diff --git a/src/telemini-v2.0/ao_pins.h b/src/telemini-v2.0/ao_pins.h index c4681ee2..dc18aff7 100644 --- a/src/telemini-v2.0/ao_pins.h +++ b/src/telemini-v2.0/ao_pins.h @@ -24,6 +24,7 @@ #define HAS_USB 1 #define USB_FORCE_FLIGHT_IDLE 1 #define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 #define HAS_GPS 0 #define HAS_SERIAL_1 0 #define HAS_EEPROM 1 @@ -158,4 +159,21 @@ struct ao_adc { ao_data_ring[ao_data_head].ms5607_raw.temp = ao_ms5607_current.temp; \ } while (0) +/* + * Voltage divider on ADC battery sampler + */ +#define AO_BATTERY_DIV_PLUS 100 /* 100k */ +#define AO_BATTERY_DIV_MINUS 27 /* 27k */ + +/* + * Voltage divider on ADC igniter samplers + */ +#define AO_IGNITE_DIV_PLUS 100 /* 100k */ +#define AO_IGNITE_DIV_MINUS 27 /* 27k */ + +/* + * ADC reference in decivolts + */ +#define AO_ADC_REFERENCE_DV 33 + #endif /* _AO_PINS_H_ */