X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fmsp430%2Fadc12%2FMsp430Adc12.h;h=6cbce0175d4ca765e5d182e682a62070178f6b06;hb=87eba3b4a58cfd7ce142d0ae3868923e7befc860;hp=90952a0c2594b0ed06190466660e11d2b8299e98;hpb=1a329382c4f4556fd52d85f4e3f4a67e54911682;p=tinyos-2.x.git diff --git a/tos/chips/msp430/adc12/Msp430Adc12.h b/tos/chips/msp430/adc12/Msp430Adc12.h index 90952a0c..6cbce017 100644 --- a/tos/chips/msp430/adc12/Msp430Adc12.h +++ b/tos/chips/msp430/adc12/Msp430Adc12.h @@ -37,93 +37,16 @@ #define MSP430ADC12_H #include "Msp430RefVoltGenerator.h" -#define P6PIN_AUTO_CONFIGURE +#define ADC12_TIMERA_ENABLED +#define ADC12_P6PIN_AUTO_CONFIGURE +#define ADC12_CHECK_ARGS +//#define ADC12_ONLY_WITH_DMA + +// for HIL clients #define REF_VOLT_AUTO_CONFIGURE -#define CHECK_ARGS - -/* - * The msp430adc12_channel_config_t includes all relevant flags to configure - * the ADC12 for single channel conversions. They are contained in the following - * MSP430 registers: ADC12CTL0, ADC12CTL1, ADC12MCTLx and TACTL of TimerA (if - * applicable) and named according to section "17.3 ADC12 Registers" of the - * "MSP430x1xx Family User's Guide". - * - * ********************************** - * - * .inch: ADC12 input channel (ADC12MCTLx register). An (external) input - * channel maps to one of msp430's A0-A7 pins (see device specific data sheet). - * - * .sref: reference voltage (ADC12MCTLx register). If REFERENCE_VREFplus_AVss - * or REFERENCE_VREFplus_VREFnegterm is chosen AND the client wires to the - * Msp430Adc12ClientAutoRVGC or Msp430Adc12ClientAutoDMA_RVGC component then - * the reference voltage generator has automatically been enabled to the - * voltage level defined by the "ref2_5v" flag (see below) when the - * Resource.granted() event is signalled to the client. Otherwise this flag is - * ignored. - * - * .ref2_5v: Reference generator voltage level (ADC12CTL0 register). See "sref" - * flag. - * - * .adc12ssel: ADC12 clock source select for the sample-hold-time (ADC12CTL1 - * register). In combination the "adc12ssel", "adc12div" and "sht" define the - * sample-hold-time: "adc12ssel" defines the clock source, "adc12div" defines - * the ADC12 clock divider and "sht" define the time expressed in jiffies. - * (the sample-hold-time depends on the resistence of the attached sensor, and - * is calculated using to the formula in section 17.2.4 of the user guide) - * - * .adc12div: ADC12 clock divider (ADC12CTL1 register). See "adc12ssel". - * - * .sht: Sample-and-hold time (ADC12CTL1 register). See "adc12ssel". - * - * .sampcon_ssel: Clock source for the sampling period (TASSEL for TimerA). - * When an ADC client specifies a non-zero "jiffies" parameter (passed in the - * relevant Msp430Adc12SingleChannel interface commands), the ADC - * implementation will automatically configure TimerA to be sourced from - * "sampcon_ssel" with an input divider of "sampcon_id". During the sampling - * process TimerA will then be used to trigger a conversion every "jiffies" - * clock ticks. - * - * .sampcon_id: Input divider for "sampcon_ssel" (IDx in TACTL register, - * TimerA). See "sampcon_ssel". - * - * - * ********************************** - * - * EXAMPLE: Assuming that SMCLK runs at 1 MHz the following code snippet - * performs 2000 ADC conversions on channel A2 with a sampling period of 4000 Hz. - * The sampling period is defined by the combination of SAMPCON_SOURCE_SMCLK, - * SAMPCON_CLOCK_DIV_1 and a "jiffies" parameter of (1000000 / 4000) = 250. - - #define NUM_SAMPLES 2000 - uint16_t buffer[NUM_SAMPLES]; - - msp430adc12_channel_config_t config = { - INPUT_CHANNEL_A2, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_NONE, - SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_64_CYCLES, - SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 - }; - - event void Boot.booted() - { - call Resource.request(); - } - - event void Resource.granted() - { - error_t result; - result = call SingleChannel.configureMultiple(&config, buffer, BUFFER_SIZE, 250); - if (result == SUCCESS) - call SingleChannel.getData(); - } - - async event uint16_t* SingleChannel.multipleDataReady(uint16_t *buf, uint16_t length) - { - // buffer contains conversion results - } - */ - typedef struct { + // see README.txt unsigned int inch: 4; // input channel unsigned int sref: 3; // reference voltage unsigned int ref2_5v: 1; // reference voltage level @@ -135,6 +58,15 @@ typedef struct { unsigned int : 0; // align to a word boundary } msp430adc12_channel_config_t; +typedef struct +{ + // see README.txt + volatile unsigned + inch: 4, // input channel + sref: 3, // reference voltage + eos: 1; // end of sequence flag +} __attribute__ ((packed)) adc12memctl_t; + enum inch_enum { // see device specific data sheet which pin Ax is mapped to @@ -232,23 +164,23 @@ enum sampcon_id_enum // The unique string for accessing HAL2 via ReadStream #define ADCC_READ_STREAM_SERVICE "AdcC.ReadStream.Client" -typedef struct -{ - volatile unsigned - inch: 4, // input channel - sref: 3, // reference voltage - eos: 1; // end of sequence flag -} __attribute__ ((packed)) adc12memctl_t; - -/* Test for GCC bug (bitfield access) - only version 3.2.3 is known to be stable */ -// check: is this relevant anymore ? +/* Test for GCC bug (bitfield access) - versions 3.2.3 and 4.4.3 are known to + * be stable + */ +// TODO: check whether this is still relevant... #define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__) #if GCC_VERSION == 332 #error "The msp430-gcc version (3.3.2) contains a bug which results in false accessing \ of bitfields in structs and makes MSP430ADC12M.nc fail ! Use version 3.2.3 instead." #elif GCC_VERSION != 323 +#if GCC_VERSION < 443 #warning "This version of msp430-gcc might contain a bug which results in false accessing \ of bitfields in structs (MSP430ADC12M.nc would fail). Use version 3.2.3 instead." +#endif #endif +#ifndef __msp430_have_adc12 +#error MSP430ADC12C: Target msp430 device does not have ADC12 module +#endif + #endif