v0.1 board believed to be reading Vbat, Pressure, and X/Y/Z correctly now,
[fw/openalt] / adc / adc.c
index 21d8572b4252efa3e97eb8237ec6a73c44ac6e2f..b34dcf121c5f247989b71444b1c2786eda7ce72a 100644 (file)
--- a/adc/adc.c
+++ b/adc/adc.c
@@ -3,27 +3,81 @@
 #include "adc.h"
 
 //
+//  Assumes PCLK == 48Mhz
 //
-//
-int adcRead0_3 (void)
+void adcInit (void)
 {
-  AD0_CR = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT) | AD_CR_SEL3;
-  AD0_CR |= AD_CR_START_NOW;
+  unsigned portLONG ulCompareMatch;
+
+  SCB_PCONP |= SCB_PCONP_PCAD0;
+  SCB_PCONP |= SCB_PCONP_PCAD1;
+
+  PCB_PINSEL0 |= PCB_PINSEL0_P06_AD10;
+  PCB_PINSEL0 |= PCB_PINSEL0_P010_AD12;
+  PCB_PINSEL0 |= PCB_PINSEL0_P012_AD13;
+  PCB_PINSEL0 |= PCB_PINSEL0_P013_AD14;
+  PCB_PINSEL0 |= PCB_PINSEL0_P015_AD15;
+
+  // configure MAT0.1 ... assumes TIMER0 already initialized and running
 
-  while (!(AD0_DR3 & AD_DR_DONE))
-    ;
+  // Calculate the match value required for 1khz ADC trigger rate
+  ulCompareMatch = configCPU_CLOCK_HZ / 1000;
 
-  return ((AD0_DR3 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
+  // Account for prescaler, protecting against divide by zero.
+  #if portPRESCALE_VALUE != 0
+  {
+       ulCompareMatch /= ( portPRESCALE_VALUE + 1 );
+  }
+  #endif
+  T0_MR1 = ulCompareMatch;
+  
+  // burst sample desired inputs triggering on MAT0.1
+  AD1_CR  = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT);
+  AD1_CR |= AD_CR_SEL0 | AD_CR_SEL2 | AD_CR_SEL3 | AD_CR_SEL4 | AD_CR_SEL5 | AD_CR_BURST;
+  AD1_CR |= AD_CR_START_MAT01;
 }
 
 //
-//  Assumes PCLK == 48Mhz
+//  Read and return X accelerometer value
 //
-void adcInit (void)
+int adcReadX (void)
 {
-  SCB_PCONP |= SCB_PCONP_PCAD0;
+  while (!(AD1_DR3 & AD_DR_DONE)) ;
+  return ((AD1_DR3 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
+}
+
+//
+//  Read and return Y accelerometer value
+//
+int adcReadY (void)
+{
+  while (!(AD1_DR4 & AD_DR_DONE)) ;
+  return ((AD1_DR4 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
+}
+
+//
+//  Read and return Z accelerometer value
+//
+int adcReadZ (void)
+{
+  while (!(AD1_DR5 & AD_DR_DONE)) ;
+  return ((AD1_DR5 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
+}
 
-  PCB_PINSEL1 |= PCB_PINSEL1_P030_AD03;
+//
+//  Read and return battery voltage
+//
+int adcReadVbat (void)
+{
+  while (!(AD1_DR0 & AD_DR_DONE)) ;
+  return ((AD1_DR0 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
+}
 
-  AD0_CR = AD_CR_CLKS10 | AD_CR_PDN | ((11 - 1) << AD_CR_CLKDIVSHIFT) | AD_CR_SEL3;
+//
+//  Read and return barometric pressure
+//
+int adcReadPres (void)
+{
+  while (!(AD1_DR2 & AD_DR_DONE)) ;
+  return ((AD1_DR2 & AD_DR_RESULTMASK) >> AD_DR_RESULTSHIFT);
 }