Hello,
I am making the interface between the MSP430FG4618 and MCP3551.
I am getting a value of 1048573 which is not consistent with the input state +VIN = VCC (+ 5V) and -Vin = GND (0V).
When +VIN and -Vin = VCC (+ 5V) the value is 2097151 and when +VIN = GND and -Vin (0V), the value is 2097151 also !. Would not it be 0?
I'm doing something wrong?
Already replaces the MCP3551 and is in the same state!
The following code:
#include "msp430xG46x.h"
#include "LCD16x2_Data_Logger.c"
#include <stdio.h>
#include <intrinsics.h>
#include <stdlib.h>
#include <string.h>
#define Time_80_ms 2622
unsigned int value;
long adcValue;
char strADC_Value[12];
void Delay_Timer(unsigned int Delay);
//************************************************************************************************************//
// Definições dos Pinos de Entrada e Saída do MSP430 do Data Logger //
//************************************************************************************************************//
void initPORTS(void)
{
P1IE = (BIT0+BIT1);
P1IES = !(BIT0+BIT1);
P2DIR |= BIT0+BIT1+BIT2; // P2.2 e P2.1 como saída
P2OUT |= BIT0; // Apaga LED1 e LED2
P2OUT &=~ BIT1+BIT2; // Apaga LED1 e LED2
P5DIR |= 0x002; // P5.1 output
P3SEL |= 0x0C; // P3.3,2 option select
P3DIR |= 0x01; // P3.0 output direction
P5DIR = 0x02; // Define P5.1 como Saída
P5OUT &=~ 0x02; // Apaga LED4
}
//************************************************************************************************************//
// Definições e Inicialização do BASIC TIMER para Temporizações do Data Logger //
//************************************************************************************************************//
void initBT(void)
{
BTCNT1 = BTCNT2 = 0;
BTCTL = BTDIV + BT_fCLK2_DIV128; // Configura o Basic Timer
}
void Delay_Timer (unsigned int Delay)
{
TACCTL0 &=~ CCIFG;
TACTL = TASSEL_1 + MC_1 + TACLR;
TACCR0 = Delay;
TACCTL0 = CCIE;
__bis_SR_register(LPM3_bits + GIE);
}
/*******************************************************************************
* Function MCP3551_Read
* ------------------------------------------------------------------------------
* Overview: Read over SPI ADC value in MCP3551 register
* Input: Nothing
* Output: ADC Value
*******************************************************************************/
long MCP3551_Read()
{
char ADC_Byte1, ADC_Byte2, ADC_Byte3 = 0;
long ADC_Value = 0;
P3OUT &=~ 0x01; // Enable MCP3551 CS_pin; Clear(port bit); put low
Delay_Timer(Time_80_ms);//__delay_cycles(1000000); // PowerUp Time (min.10us)
IFG2 &= ~UCB0RXIFG; // Clear int flag // I get the third byte
UCB0TXBUF = 0x00; // Dummy write to start SPI
while (!(IFG2 & UCB0RXIFG)); // RXBUF ready?
ADC_Byte3 = UCB0RXBUF; // Move value
IFG2 &= ~UCB0RXIFG; // Clear int flag // I get the third byte
UCB0TXBUF = 0x00; // Dummy write to start SPI
while (!(IFG2 & UCB0RXIFG)); // RXBUF ready?
ADC_Byte2 = UCB0RXBUF; // Move value
IFG2 &= ~UCB0RXIFG; // Clear int flag // I get the third byte
UCB0TXBUF = 0x00; // Dummy write to start SPI
while (!(IFG2 & UCB0RXIFG)); // RXBUF ready?
ADC_Byte1 = UCB0RXBUF; // Move value
// enter shutdown (typ.10us)
P3OUT |= 0x01; // Disable MCP3551 CS_pin; Set(port bit); put high
Delay_Timer(Time_80_ms);//__delay_cycles(100000); // PowerUp Time (min.10us)
// store 24 bits in ADC_Value
ADC_Value = ADC_Byte3;
ADC_Value = (ADC_Value << 8) | ADC_Byte2;
ADC_Value = (ADC_Value << 8) | ADC_Byte1;
// OVH (false) condition
if (ADC_Byte3 == 0x60 && ADC_Byte1 > 0)
ADC_Value = 3000000; // Vin+ >= Vref ; Vin- = GND
// OVL (false) condition
else if (ADC_Byte3 == 0x9F && ADC_Byte1 > 0){
ADC_Value = -3000000; // Vin- >= Vref ; Vin+ = GND
}
else {
if ((ADC_Byte3 & 0x20) >> 5) // Bit 21 = 1 ; value is negative
ADC_Value = ADC_Value - 4194304; // for 22 bit resolution
}
return ADC_Value;
}
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP14PF; // Configure load caps
// Wait for xtal to stabilize
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
initPORTS();
initBT();
UCB0CTL1 |= UCSWRST;
UCB0CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI mstr, MSb 1st
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x02;
UCB0BR1 = 0;
UCB0CTL1 &=~ UCSWRST; // **Initialize USCI state machine**
P5OUT &=~ 0x02; // Liga o LCD16X2
InitLCD();
LCDClear();
LCDPrintString("Testando...");
__delay_cycles(1000000);
LCDSetPosition(1,0);
LCDPrintString("Display LCD16X2");
__delay_cycles(1000000);
LCDClear();
//P7OUT = 0;
//P5OUT |= 0x02; // Desliga o LCD16X2
LCDSetPosition(0,1);
LCDPrintString("ADC 2 Click Ex."); // Display message on the Lcd
LCDSetPosition(1,1);
LCDPrintString("Value: "); // Display message on the Lcd
do
{
adcValue = MCP3551_Read(); // Read ADC value from MCP3551
sprintf(strADC_Value,"%ld",adcValue);
LCDSetPosition(1,8);
LCDPrintString(" "); // Reading Error
if (adcValue == -4000000){
LCDSetPosition(1,8);
LCDPrintString("Erro"); // Reading Error
}
else if (adcValue == 3000000) {
LCDSetPosition(1,8);
LCDPrintString("OVH"); // Overflow High
}
else if (adcValue == -3000000) {
LCDSetPosition(1,8);
LCDPrintString("OVL"); // Overflow Low
}
else {
LCDSetPosition(1,8);
LCDPrintString(strADC_Value); // Display message on the Lcd
}
__delay_cycles(1000000);
//__bis_SR_register(LPM3_bits + GIE); // Entra em LPM3 (Modo de Baixo Consumo)
}while(1);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void) // When the value of the TimerA=TACCR0, we get out of the low power mode
{
__bic_SR_register_on_exit(LPM3_bits + GIE);
}