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 #include #include #include #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 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); }
↧