This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to Read 16 bit ADC Value on nRF Master app? not 8 bit!

FormerMember
FormerMember

Hello!

I'm trying to read 16 bit ADC Value on nRF Master app instead of only 8 bit, and I know that there is the example code on github which is only send me the 8 bit "uint8_t adc_result" data to nRF mater app

/* Interrupt handler for ADC data ready event */
void ADC_IRQHandler(void)
{
	uint8_t adc_result;
	
	/* Clear dataready event */
  NRF_ADC->EVENTS_END = 0;	

  /* Write ADC result both to the UART and over BLE */
	adc_result = NRF_ADC->RESULT;
	app_uart_put(adc_result);
	ble_nus_send_string(&m_nus, &adc_result, 1);
	nrf_gpio_pin_toggle(LED_3);        //indicate on LED that the ADC interrupt handler is executing
	
	//Use the STOP task to save current. Workaround for PAN_028 rev1.5 anomaly 1.
  NRF_ADC->TASKS_STOP = 1;
	
	//Release the external crystal
	sd_clock_hfclk_release();
}	

where it sends the ADC value over Bluetooth by the "ble_nus_send_string()" command:

uint32_t ble_nus_send_string(ble_nus_t * p_nus, uint8_t * string, uint16_t length)
{
    ble_gatts_hvx_params_t hvx_params;

    if (p_nus == NULL)
    {
        return NRF_ERROR_NULL;
    }
    
    if ((p_nus->conn_handle == BLE_CONN_HANDLE_INVALID) || (!p_nus->is_notification_enabled))
    {
        return NRF_ERROR_INVALID_STATE;
    }
    
    if (length > BLE_NUS_MAX_DATA_LEN)
    {
        return NRF_ERROR_INVALID_PARAM;
    }
    
    memset(&hvx_params, 0, sizeof(hvx_params));

    hvx_params.handle = p_nus->rx_handles.value_handle;
    hvx_params.p_data = string;
    hvx_params.p_len  = &length;
    hvx_params.type   = BLE_GATT_HVX_NOTIFICATION;
    
    return sd_ble_gatts_hvx(p_nus->conn_handle, &hvx_params);
}

if I just similarly change the 'uint8_t adc_result' to 'uint16_t adc_result' it will show me endless ERROR.

Does anyone have any solutions for reading the ADC value on the nRF Mater Control panel app 16 bits instead of only 8 bits?

Any help is appreciated!

Parents
  • This seems to be much the same as your last question.

    For a start "it will show me endless ERROR". What will show you endless ERROR, compilation, logging from the device, the master app? Where are you seeing this ERROR?

    Your code won't work anyway because the value you're reading you're putting into a stack variable adc_result which will be gone by the time the softdevice sends it out, you need to put it into something static.

    As I tried to explain to you before, data is just data, all you want to do is send out two bytes of information. If you are seeing ERROR on the receiving end it's not because there's an error, it's because it's trying to interpret the data in some way in order to show it to you and is unable to do so, possibly because it's expecting ascii strings or something. Try using something like Lightblue which shows you the raw bytes and doesn't try to interpret them. Since in the end you're not going to be using the MCP to receive your data, but an app of some sort, getting hung up on how it's displaying or not displaying two random bytes doesn't help you.

    To send a uint16_t is very simple,

    static uint16_t adc_value;
    static uint16_t adc_len = sizeof( adc_value)
    
    .... // get the value into the adc_value handle in any way you like
    
    hvx_params.handle = p_nus->rx_handles.value_handle;
    hvx_params.p_data = (uint8_t*)&adc_value;
    hvx_params.p_len  = &adc_len;
    hvx_params.type   = BLE_GATT_HVX_NOTIFICATION;
    
    return sd_ble_gatts_hvx(p_nus->conn_handle, &hvx_params);
    

    That's it - your value will now go out as two bytes representing the uint16_t in little endian format. That is everything you need to do.

  • FormerMember
    0 FormerMember in reply to RK

    could you please tell me what this code does? hvx_params.p_data = (uint8_t*)&adc_value;

    Does it send the ADC value as 16 bit by using this code, and what the uint8_t doing in here?

Reply Children
No Data
Related