altos: Add battery voltage sampling driver
authorKeith Packard <keithp@keithp.com>
Sun, 23 Oct 2011 21:51:32 +0000 (14:51 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 23 Oct 2011 21:51:32 +0000 (14:51 -0700)
For devices without a full ADC compliment, this just samples the
battery pin and converts to mV.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_battery.c [new file with mode: 0644]
src/core/ao.h
src/product/ao_teleterra_0_2.c
src/teleterra-v0.2/Makefile
src/teleterra-v0.2/ao_pins.h

diff --git a/src/cc1111/ao_battery.c b/src/cc1111/ao_battery.c
new file mode 100644 (file)
index 0000000..070f682
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+static __data union {
+       uint8_t d[2];
+       int16_t v;
+} ao_battery_value;
+
+void
+ao_battery_isr(void) ao_arch_interrupt(1)
+{
+       ao_battery_value.d[0] = ADCL;
+       ao_battery_value.d[1] = ADCH;
+       ao_wakeup(DATA_TO_XDATA(&ao_battery_value));
+}
+
+uint16_t
+ao_battery_get(void) 
+{
+       ao_arch_critical(
+               ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | BATTERY_PIN;
+               ao_sleep(DATA_TO_XDATA(&ao_battery_value));
+               );
+       return (uint16_t) ((int32_t) ao_battery_value.v * (int32_t) 3333 >> 15);
+}
+
+static void
+ao_battery_show(void)
+{
+       printf("Battery: %u mV\n", ao_battery_get());
+}
+
+__code struct ao_cmds ao_battery_cmds[] = {
+       { ao_battery_show,      "B\0Show battery voltage" },
+       { 0, NULL },
+};
+
+void
+ao_battery_init(void)
+{
+       ADCCFG = (1 << BATTERY_PIN);
+       ADCIF = 0;
+       IEN0 |= IEN0_ADCIE;
+       ao_cmd_register(&ao_battery_cmds[0]);
+}
index 43d4e0e3ddf84242a7b5265314781986b9607b23..558d0e3866b2bf0b04687f6d43030e6f00147a4b 100644 (file)
@@ -1858,4 +1858,19 @@ ao_log_single(void);
 void
 ao_terraui_init(void);
 
+/*
+ * ao_battery.c
+ */
+
+#ifdef BATTERY_PIN
+void
+ao_battery_isr(void) ao_arch_interrupt(1);
+
+uint16_t
+ao_battery_get(void);
+
+void
+ao_battery_init(void);
+#endif /* BATTERY_PIN */
+
 #endif /* _AO_H_ */
index b38f2907d7399d80767793abb7b5d442b55d8002..3272970f84e1e0bc3049eff9b712ec57cd1bf258 100644 (file)
@@ -38,5 +38,6 @@ main(void)
        ao_config_init();
        ao_lcd_init();
        ao_terraui_init();
+       ao_battery_init();
        ao_start_scheduler();
 }
index 8e4569a9a6ff8eecdcc9478541fc6276bbd47dbf..36f523a323345774d4701395445e4bac10a6d283 100644 (file)
@@ -32,6 +32,7 @@ CORE_SRC = \
        ao_task.c
 
 CC1111_SRC = \
+       ao_battery.c \
        ao_beep.c \
        ao_button.c \
        ao_dbg.c \
index 7b6f08b217e762be5446d70e5e828e5d336cf501..36f3c19917435f0e534050e598a5345ce2a8f3aa 100644 (file)
@@ -57,6 +57,8 @@
        #define HAS_P2_ISR              1
        #define HAS_BUTTON_P0           1
        #define HAS_BUTTON_P2           1
+
+       #define BATTERY_PIN             5
 #endif
 
 #if DBG_ON_P1