This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Simple question on ADC sample code

The bold part of code below states that if A1 > 0.5*AVcc, P1.0 set, else reset.
But I don't quite understand how 0x1FF represents 0.5*AVcc.
Does anybody have idea?

//******************************************************************************
// MSP430G2x31 Demo - ADC10, Sample A1, AVcc Ref, Set P1.0 if > 0.5*AVcc
//
// Description: A single sample is made on A1 with reference to AVcc.
// Software sets ADC10SC to start sample and conversion - ADC10SC
// automatically cleared at EOC. ADC10 internal oscillator times sample (16x)
// and conversion. In Mainloop MSP430 waits in LPM0 to save power until ADC10
// conversion complete, ADC10_ISR will force exit from LPM0 in Mainloop on
// reti. If A1 > 0.5*AVcc, P1.0 set, else reset.
//
// MSP430G2x31
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// >---|P1.1/A1 P1.0|-->LED
//
// D. Dang
// Texas Instruments Inc.
// October 2010
// Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include "msp430g2231.h"

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
P1DIR |= 0x01; // Set P1.0 to output direction

for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
if (ADC10MEM < 0x1FF)
P1OUT &= ~0x01; // Clear P1.0 LED off
else
P1OUT |= 0x01; // Set P1.0 LED on
}
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
  • One more question,

    what does &= and |= mean?

    I know this might be very dumb question, but I am a real beginner in programming. :-(

  • Hi,

    Full scale output for a 10 bit ADC is 0x3FF.  Half of that would be approximately 0x1FF. The default reference is Vcc and Vss so and input on A1 that is the same or greater than Vcc would result in a value of 0x3FF a value that is .5*Vcc or greater would result in a value of 0x1FF or greater.

    P1OUT &= ~(0x01) is the same as P1OUT = P1OUT & ~(0x01)  - This clears the first bit in the P1OUT register.

    P1OUT |= 0x01 is the same as P1OUT = P1OUT | 0x01; - This sets the first bit in the P1OUT register.

    Barry

  • Hi,

    People always forget to thank the people who cleared their doubts. I dont get it.

    Anyways, thanks blb, even i did not know the meaning of those commands. Thanks for your explanation.

    best wishes

    janmay

  • Hi Janmay,

    Thanks very much for your thanks. I very much appreciate it and I'm glad I was able to be of some help.

    Warm Regards,

    Barry

**Attention** This is a public forum