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;
}