Skip to content

Fix QMP6988 to work with AVR boards #4

@Erdien

Description

@Erdien

I'm working on ENV.III sensor with Arduino Uno and RaspberryPi Pico boards.
I found - the Pressure and Temperature from QMP6988 were incorrect because of 2 things:

1-st Issue:

M5Unit-ENV/src/QMP6988.h

Lines 12 to 13 in b1b5692

#define QMP6988_U32_t unsigned int
#define QMP6988_S32_t int

int on avr boards is int16_t.
long on both avr and 32-bit boards is int32_t

 #define QMP6988_U32_t unsigned long
 #define QMP6988_S32_t long

2-nd Issue:

qmp6988.qmp6988_cali.COE_a0 =
(QMP6988_S32_t)(((a_data_uint8_tr[18] << SHIFT_LEFT_12_POSITION) |
(a_data_uint8_tr[19] << SHIFT_LEFT_4_POSITION) |
(a_data_uint8_tr[24] & 0x0f))
<< 12);
qmp6988.qmp6988_cali.COE_a0 = qmp6988.qmp6988_cali.COE_a0 >> 12;
qmp6988.qmp6988_cali.COE_a1 =
(QMP6988_S16_t)(((a_data_uint8_tr[20]) << SHIFT_LEFT_8_POSITION) |
a_data_uint8_tr[21]);
qmp6988.qmp6988_cali.COE_a2 =
(QMP6988_S16_t)(((a_data_uint8_tr[22]) << SHIFT_LEFT_8_POSITION) |
a_data_uint8_tr[23]);
qmp6988.qmp6988_cali.COE_b00 =
(QMP6988_S32_t)(((a_data_uint8_tr[0] << SHIFT_LEFT_12_POSITION) |
(a_data_uint8_tr[1] << SHIFT_LEFT_4_POSITION) |
((a_data_uint8_tr[24] & 0xf0) >>
SHIFT_RIGHT_4_POSITION))
<< 12);

a_data_uint8_tr[18] and a_data_uint8_tr[0] after leftshifting these values by 12 - they'll overflow on avr boards.
changing their type to QMP6988_S32_t will solve this issue

 qmp6988.qmp6988_cali.COE_a0 = 
     (QMP6988_S32_t)((((QMP6988_S32_t)a_data_uint8_tr[18] << SHIFT_LEFT_12_POSITION) | 
                      (a_data_uint8_tr[19] << SHIFT_LEFT_4_POSITION) | 
                      (a_data_uint8_tr[24] & 0x0f)) 
                     << 12); 
 qmp6988.qmp6988_cali.COE_a0 = qmp6988.qmp6988_cali.COE_a0 >> 12; 
  
 qmp6988.qmp6988_cali.COE_a1 = 
     (QMP6988_S16_t)(((a_data_uint8_tr[20]) << SHIFT_LEFT_8_POSITION) | 
                     a_data_uint8_tr[21]); 
 qmp6988.qmp6988_cali.COE_a2 = 
     (QMP6988_S16_t)(((a_data_uint8_tr[22]) << SHIFT_LEFT_8_POSITION) | 
                     a_data_uint8_tr[23]); 
  
 qmp6988.qmp6988_cali.COE_b00 = 
     (QMP6988_S32_t)((((QMP6988_S32_t)a_data_uint8_tr[0] << SHIFT_LEFT_12_POSITION) | 
                      (a_data_uint8_tr[1] << SHIFT_LEFT_4_POSITION) | 
                      ((a_data_uint8_tr[24] & 0xf0) >> 
                       SHIFT_RIGHT_4_POSITION)) 
                     << 12); 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions