summaryrefslogtreecommitdiff
path: root/src/ao_adc.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-01-15 12:18:32 -0800
committerKeith Packard <keithp@keithp.com>2011-01-16 20:24:36 -0800
commit2681a17500913cbaf3966f09380bb1d6b59e3863 (patch)
tree8e7860c8aadea07692860b6d748ca005a7469264 /src/ao_adc.c
parent69290588980bb15732a99eca5c911a3b6e9a37b9 (diff)
altos: Sample the accelerometer reference voltage on v1.1 boards
This places the 5v reference samples in an array parallel to the basic ADC values. It doesn't do anything with the values, just stores them. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/ao_adc.c')
-rw-r--r--src/ao_adc.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/ao_adc.c b/src/ao_adc.c
index f577b458..3adf9b2e 100644
--- a/src/ao_adc.c
+++ b/src/ao_adc.c
@@ -19,12 +19,19 @@
#include "ao_pins.h"
volatile __xdata struct ao_adc ao_adc_ring[AO_ADC_RING];
+#if HAS_ACCEL_REF
+volatile __xdata uint16_t ao_accel_ref[AO_ADC_RING];
+#endif
volatile __data uint8_t ao_adc_head;
void
ao_adc_poll(void)
{
+#if HAS_ACCEL_REF
+ ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 2;
+#else
ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 0;
+#endif
}
void
@@ -41,20 +48,29 @@ ao_adc_isr(void) __interrupt 1
uint8_t __xdata *a;
sequence = (ADCCON2 & ADCCON2_SCH_MASK) >> ADCCON2_SCH_SHIFT;
- if (sequence == ADCCON3_ECH_TEMP)
- sequence = 2;
- a = (uint8_t __xdata *) (&ao_adc_ring[ao_adc_head].accel + sequence);
+#if HAS_ACCEL_REF
+ if (sequence == 2) {
+ a = (uint8_t __xdata *) (&ao_accel_ref[ao_adc_head]);
+ sequence = 0;
+ } else
+#endif
+ {
+ if (sequence == ADCCON3_ECH_TEMP)
+ sequence = 2;
+ a = (uint8_t __xdata *) (&ao_adc_ring[ao_adc_head].accel + sequence);
+ sequence++;
+ }
a[0] = ADCL;
a[1] = ADCH;
- if (sequence < 5) {
+ if (sequence < 6) {
#if HAS_EXTERNAL_TEMP == 0
/* start next channel conversion */
/* v0.2 replaces external temp sensor with internal one */
- if (sequence == 1)
+ if (sequence == 2)
ADCCON3 = ADCCON3_EREF_1_25 | ADCCON3_EDIV_512 | ADCCON3_ECH_TEMP;
else
#endif
- ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | (sequence + 1);
+ ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | sequence;
} else {
/* record this conversion series */
ao_adc_ring[ao_adc_head].tick = ao_time();