I am trying to use the comparator to wake me up when a potentiometer is moved a certain amount.
Before I sleep I read the ADC value of the comparator and use this to set the upper and lower value of the comparator.
My issue is this only works when I move the POT down. For some reason the UP direction is not working.
I am including the NRF_DRV_COMP_EVT_EN_UP_MASK in my nrf_drv_comp_start command. What else needs to be added to get an event when the voltage crosses the upper threshold?
This is using the nRF52832 , SDK14
#define COMPTH_MAX 63 #define COMPTH_INTERVAL 5 void zoom_comp_init(void) { uint32_t err_code; nrf_saadc_value_t vdd, adcval; nrf_drv_comp_uninit(); APP_ERROR_CHECK(nrf_drv_saadc_sample_convert(4, &vdd)); APP_ERROR_CHECK(nrf_drv_saadc_sample_convert(0, &adcval)); // hw_adc_disable(); float frac = (float)adcval / (float)vdd; // ref_setting = frac*16.0; static uint8_t myrefval = 0; //(0-16) frac *= 64.0; myrefval = (uint8_t)frac; nrf_drv_comp_config_t myCompConfig = NRF_DRV_COMP_DEFAULT_CONFIG(NRF_COMP_INPUT_0); myCompConfig.input = NRF_COMP_INPUT_0; myCompConfig.main_mode = NRF_COMP_MAIN_MODE_SE; myCompConfig.reference = NRF_COMP_REF_VDD; myCompConfig.speed_mode = NRF_COMP_SP_MODE_Normal; //myCompConfig.hyst = NRF_COMP_HYST_50mV; myCompConfig.isource = COMP_ISOURCE_ISOURCE_Off; myCompConfig.interrupt_priority = 6; if (myrefval > (COMPTH_MAX - COMPTH_INTERVAL) ) { myCompConfig.threshold.th_down = COMPTH_MAX - COMPTH_INTERVAL*2; myCompConfig.threshold.th_up = COMPTH_MAX; } else if (myrefval < COMPTH_INTERVAL) { myCompConfig.threshold.th_down = 0; myCompConfig.threshold.th_up = COMPTH_INTERVAL*2; } else { myCompConfig.threshold.th_down = myrefval - COMPTH_INTERVAL; myCompConfig.threshold.th_up = myrefval + COMPTH_INTERVAL; } NRF_LOG_INFO("ZOOM | Reference Value=%d", myrefval); NRF_LOG_INFO("ZOOM | TH_DOWN=%d TH_UP=%d", myCompConfig.threshold.th_down, myCompConfig.threshold.th_up); err_code = nrf_drv_comp_init(&myCompConfig, comp_event_handler); APP_ERROR_CHECK(err_code); nrf_drv_comp_start( NRF_DRV_COMP_EVT_EN_DOWN_MASK | NRF_DRV_COMP_EVT_EN_UP_MASK , NRF_DRV_COMP_SHORT_STOP_AFTER_UP_EVT | NRF_DRV_COMP_SHORT_STOP_AFTER_DOWN_EVT | NRF_DRV_COMP_SHORT_STOP_AFTER_CROSS_EVT);
static void comp_event_handler(nrf_comp_event_t event) { asm("nop;"); NRF_LOG_INFO("Comp Event."); switch (event) { case NRF_COMP_EVENT_CROSS: NRF_LOG_INFO("Comp CROSS Event."); sysEvents.zoom_change = 1; break; case NRF_COMP_EVENT_DOWN: // sysEvents.zoom_change = 1; //if (update_zoom()) { NRF_LOG_INFO("Comp DOWN Event."); sysEvents.zoom_change = 1; } break; case NRF_COMP_EVENT_UP: //if (update_zoom()) { NRF_LOG_INFO("Comp UP Event."); sysEvents.zoom_change = 1; } // sysEvents.zoom_change = 1; break; } }