Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    In bma4.c the function bma4_get_temperature() returns incorrect values for negative temperatures

    In bma4.c the function bma4_get_temperature() returns incorrect values for negative temperatures

    john-rubis
    New Poster

    There appears to be a casting issue in this function that is causing negative temperatures to be returned as larger positive values.

    Specifically in this line : temp_raw_scaled = (int32_t)data[BMA4_TEMP_BYTE] * BMA4_SCALE_TEMP;

    Test case to demonstrate: set data = 0x81 

    The expected return value in deg C would be -104C

    Actual return value is 152,000 C

    5 REPLIES 5

    BSTRobin
    Community Moderator
    Community Moderator

    Hi john-rubis,

    Which sensor part you used?
    And could you attached all the source files you used?

    We are using the BMA456  The source code is from Bosch. See attached. 

    The issue is the cast on the line mentioned is from a uint8_t to int32_t resulting in a positive value instead of a negative value. I think it should be a cast to an int8_t.

    BSTRobin
    Community Moderator
    Community Moderator

    Hi john-rubis,

    We couldn't see the line "temp_raw_scaled = (int32_t)data[BMA4_TEMP_BYTE] * BMA4_SCALE_TEMP;" in driver code.

    Which degree Fahrenheit or degree Kelvin you used?

    /*!
    * @brief This API reads the chip temperature of sensor.
    *
    * @note Using a scaling factor of 1000, to obtain integer values, which
    * at the user end, are used to get accurate temperature value .
    * BMA4_FAHREN_SCALED = 1.8 * 1000, BMA4_KELVIN_SCALED = 273.15 * 1000
    */
    int8_t bma4_get_temperature(int32_t *temp, uint8_t temp_unit, struct bma4_dev *dev)
    {
    int8_t rslt;
    uint8_t data[BMA4_TEMP_DATA_SIZE] = { 0 };
    int32_t temp_raw_scaled = 0;

    /* Check the dev structure as NULL */
    rslt = null_pointer_check(dev);

    if ((rslt == BMA4_OK) && (temp != NULL))
    {
    /* Read temperature value from the register */
    rslt = bma4_read_regs(BMA4_TEMPERATURE_ADDR, data, BMA4_TEMP_DATA_SIZE, dev);
    if (rslt == BMA4_OK)
    {
    temp_raw_scaled = (int32_t)data[BMA4_TEMP_BYTE] * BMA4_SCALE_TEMP;
    }

    /* '0' value read from the register corresponds to 23 degree C */
    (*temp) = temp_raw_scaled + (BMA4_OFFSET_TEMP * BMA4_SCALE_TEMP);
    switch (temp_unit)
    {
    case BMA4_DEG:
    break;
    case BMA4_FAHREN:

    /* Temperature in degree Fahrenheit */
    (*temp) = (((*temp) / BMA4_SCALE_TEMP) * BMA4_FAHREN_SCALED) + (32 * BMA4_SCALE_TEMP);
    break;
    case BMA4_KELVIN:

    /* Temperature in degree Kelvin */
    (*temp) = (*temp) + BMA4_KELVIN_SCALED;
    break;
    default:
    break;
    }
    }
    else
    {
    rslt = BMA4_E_NULL_PTR;
    }

    return rslt;
    }

    https://github.com/BoschSensortec/BMA456-Sensor-API/blob/master/bma4.c 

    Line 1634

    Celcius. So temp_unit is  equal to BMA4_DEG

     

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist