Dear People,

I have a very simple setup. I need to multiply a reference by 15. to be measured by A1 (P2.1)

A reference voltage is generated at P2.2(confirmed with a voltmeter) with respect to P2.0 which is grounded. ( will be used later to measure differential voltage).

The opamp module is to be operating as a differential gain array, for debugging I am using the RF2500 board serial port.

The output I am getting is as follows, which means that the voltage sampling at P2.2 is all good,  but the op amp is not, and I am not sure why? any help or reference would be appreciated.

 GND Ref ('-'P2.0): 0001         POT Reference x 15(P2.1): 0355         POT Reference('+' P2.2): 0624 (confirmed good)

 GND Ref ('-'P2.0): 0001         POT Reference x 15(P2.1): 0239         POT Reference('+' P2.2): 0099 (confirmed good)

 

//****CODE is compiling, and UART and ADC10 is working

#include "msp430x22x4.h"

void TXString( char* string, int length );
void MCU_Init(void);

// work loop semaphores
char sSelfMeasureSem = 1;
char value[4];

void main (void)
{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  {
    volatile int i;
    for(i = 0; i < 0xFFFF; i++){}
  }
  if( CALBC1_8MHZ == 0xFF )                 // Do not run if cal values are erased
  {
    volatile int i;
    while(1)
    {
      for(i = 0; i < 0x5FFF; i++){}
    }
  }
   
 
  MCU_Init();
  TXString( "Done\r\n", 6);

  while (1)
  {
 
    // if it is time to measure our own temperature...
    if(sSelfMeasureSem)
    {
      int degC;
      volatile long temp;
      int results[2];
     
     
      OA0CTL0 = OAN_1 + OAP_0 + OAPM_1 + OAADC0; //'+'->p2.0 '-'->p2.2 output/A1->p2.1
      OA0CTL1 = OAFBR_7 + OAFC_7;                //('+'-'-')*R2/R1 G15; diff amp configuration
       
      ADC10AE0 = 0x11;                          // A0-A2 analog function
    
      ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR;
      ADC10CTL1 = INCH_0 + ADC10DIV_4;    
      for( degC = 240; degC > 0; degC-- ); 
      ADC10CTL0 |= ENC + ADC10SC;          
      __bis_SR_register(CPUOFF + GIE);     
      results[0] = ADC10MEM;
      ADC10CTL0 &= ~ENC;

     
      TXString( " GND Ref ('-'): ", 16 );
      temp = ADC10MEM;
      value[0] = '0'+((results[0]/1000)%10);
      value[1] = '0'+((results[0]/100)%10);
      value[2] = '0'+((results[0]/10)%10);
      value[3] = '0'+(results[0]%10);
      TXString(value, sizeof value);
     
     
      ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR;
      ADC10CTL1 = INCH_1 + ADC10DIV_4;    
      for( degC = 240; degC > 0; degC-- ); 
      ADC10CTL0 |= ENC + ADC10SC;          
      __bis_SR_register(CPUOFF + GIE);     
      results[0] = ADC10MEM;
      ADC10CTL0 &= ~ENC;

     
      TXString( " POT Reference x 15: ", 21 );
      temp = ADC10MEM;
      value[0] = '0'+((results[0]/1000)%10);
      value[1] = '0'+((results[0]/100)%10);
      value[2] = '0'+((results[0]/10)%10);
      value[3] = '0'+(results[0]%10);
      TXString(value, sizeof value);      

      ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR;
      ADC10CTL1 = INCH_2 + ADC10DIV_4;    
      for( degC = 240; degC > 0; degC-- ); 
      ADC10CTL0 |= ENC + ADC10SC;          
      __bis_SR_register(CPUOFF + GIE);     
      results[0] = ADC10MEM;
      ADC10CTL0 &= ~ENC;

     
      TXString( " POT Reference('+'): ", 21 );
      temp = ADC10MEM;
      value[0] = '0'+((results[0]/1000)%10);
      value[1] = '0'+((results[0]/100)%10);
      value[2] = '0'+((results[0]/10)%10);
      value[3] = '0'+(results[0]%10);
      TXString(value, sizeof value);
     
      ADC10CTL0 &= ~(REFON + ADC10ON);      // turn off A/D to save power
      TXString( "\r\n", 2);  //new line    
      sSelfMeasureSem = 0;
    }
  }
}

void TXString( char* string, int length )
{
  int pointer;
  for( pointer = 0; pointer < length; pointer++)
  {
    volatile int i;
    UCA0TXBUF = string[pointer];
    while (!(IFG2&UCA0TXIFG));              // USCI_A0 TX buffer ready?
  }
}

/*------------------------------------------------------------------------------
*
------------------------------------------------------------------------------*/
void MCU_Init()
{
  BCSCTL1 = CALBC1_8MHZ;                    // Set DCO
  DCOCTL = CALDCO_8MHZ;
 
  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
  TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
  TACCR0 = 12000;                           // ~1 second
  TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode
 
  P3SEL |= 0x30;                            // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL1 = UCSSEL_2;                      // SMCLK
  UCA0BR0 = 0x41;                           // 9600 from 8Mhz
  UCA0BR1 = 0x3;
  UCA0MCTL = UCBRS_2;                      
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  __enable_interrupt();
}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  sSelfMeasureSem = 1;
}