STM32 Read event from remoteControlEvent_t and parse data. Values are wrong with passing

0

I have small problem with adding and reading values.

Define variables

#define ADC_BIT_MASK 0x0FFF
static TaskHandle_t remoteControlTaskHandle = NULL;

typedef enum
{
    ...
    rcEvent_FreshADC            = 0x80000000,
    ...
}

Code for notify task. adc12bitVal_pedal value is for example 100 and adc12bitVal_lr value for example 1000. I am shifting adc12bitVal_lr to the left that I can pass params ...

static void remoteControl_FreshADC(uint16_t adc12bitVal_pedal, uint16_t adc12bitVal_lr)
{
    if(remoteControlTaskHandle != NULL)
    {
        xTaskNotify(remoteControlTaskHandle,
                    (rcEvent_FreshADC | (adc12bitVal_pedal & ADC_BIT_MASK) | (adc12bitVal_lr & ADC_BIT_MASK)<<12),
                    eSetValueWithOverwrite);
    }
}

and then remoteControlHandleEvent which handle an event. Here I have problem with adcVal_lr which should be 1000 but is for example 52123. I need to shift 12 to the left that I get correct value. Or this is wrong?

returnCode_t remoteControlHandleEvent(remoteControlEvent_t event)
{
    if(event & rcEvent_motorControlACK)
    {
        uint8_t ackNum = (uint8_t) ( ((event >> MOTOR_CONTROL_ACK_BIT_POS) & MOTOR_CONTROL_ACK_BIT_MASK));
        printf("CONF: %u\n", (unsigned int)ackNum);
    }
    if(event & rcEvent_FreshADC)
    {
        ...
        // Value is 100
        uint16_t adcVal_pedal = (uint16_t)(event & ADC_BIT_MASK);

        // DOESN'T WORK VALUE IS 52123 instead of 1000
        uint16_t adcVal_lr = (uint16_t)((event & ADC_BIT_MASK)<<12);
        ...
    }
}

I don't understand and know why wrong value for

uint16_t adcVal_lr = (uint16_t)((event & ADC_BIT_MASK)<<12);

Thnak you for all comments and help.

stm32
asked on Stack Overflow Feb 2, 2021 by senzacionale • edited Feb 2, 2021 by senzacionale

1 Answer

1

You are shifting left (up) twice. To extract a value that you shifted left you need to shift right (down). You also apply the mask before shifting, when it should be after.

uint16_t adcVal_lr = (uint16_t)((event >> 12) & ADC_BIT_MASK);
answered on Stack Overflow Feb 2, 2021 by Tom V

User contributions licensed under CC BY-SA 3.0