Hi All
I'm trying to measure the Ton and the Toff of a signal present on an input pin of a nRF51822.
The idea is to use PPI, Timer 1 and save timer on every falling/rising edge of the input pin into CC[3]
I wrote a simple code , attached below, referring to : https://devzone.nordicsemi.com/f/nordic-q-a/8707/how-to-use-timer1-capture-function
int main(void) { Init_HFCLK(); // HF clock launching Init_RTC(); // RTC Timer interrupt setting // DAFARE inserire timer per IR led Init_IO(); // I/O pinout setting Init_PPI(); while(1) { __NOP(); } } void Init_PPI(void) { NRF_PPI->CH[1].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0]; // NRF_PPI->CH[1].TEP = (uint32_t)&NRF_TIMER1->TASKS_COUNT; NRF_PPI->CH[1].TEP = (uint32_t)&NRF_TIMER1->TASKS_CAPTURE[3]; NRF_PPI->CHEN = (PPI_CHEN_CH0_Enabled << PPI_CHEN_CH0_Pos); } // RTC Timer interrupt setting void Init_RTC(void) { NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer; // set Timer mode NRF_TIMER1->TASKS_CLEAR = 1; // clear the task first to be usable for later NRF_TIMER1->PRESCALER = 4; NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_24Bit; //Set counter 24 bit resolution NRF_TIMER1->CC[1] = 1000; NRF_TIMER1->CC[2] = 250; NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE2_Enabled << TIMER_INTENSET_COMPARE2_Pos) | (TIMER_INTENSET_COMPARE1_Enabled << TIMER_INTENSET_COMPARE1_Pos); NVIC_EnableIRQ(TIMER1_IRQn); NRF_TIMER1->TASKS_START = 1; // Start TIMER } void Init_IO(void) { // OUTPUT nrf_gpio_cfg_output(LED_FB); nrf_gpio_pin_clear(LED_FB); // INPUT nrf_gpio_cfg_input(IN_pin,NRF_GPIO_PIN_NOPULL); nrf_gpiote_event_config(0, IN_pin, NRF_GPIOTE_POLARITY_TOGGLE); //GPIOTE gives an interrupt on pin change } void Init_HFCLK(void) { // NRF_CLOCK->XTALFREQ = 0x0; NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_CLOCK->TASKS_HFCLKSTART = 1; while(NRF_CLOCK->EVENTS_HFCLKSTARTED == 0); } void TIMER1_IRQHandler (void) { if ((NRF_TIMER1->EVENTS_COMPARE[2] != 0) && ((NRF_TIMER1->INTENSET & TIMER_INTENSET_COMPARE2_Msk) != 0)) { NRF_TIMER1->EVENTS_COMPARE[2] = 0; NRF_TIMER1->CC[2] += 250;//TMR_BASE; // retrigger compare interrupt nrf_gpio_pin_set(LED_FB); } if ((NRF_TIMER1->EVENTS_COMPARE[1] != 0) && ((NRF_TIMER1->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0)) { NRF_TIMER1->EVENTS_COMPARE[1] = 0; NRF_TIMER1->CC[1] += 1000; nrf_gpio_pin_clear(LED_FB); // NRF_TIMER1->TASKS_START = 1; } }
This is the first time I'm using the PPI and I'm a bit confused about its working.
It seems Timer1 interrupt works as expected, as far as LED_FB (output pin) toggles, but I supposed that, when the input signal changes its level value, from L to H or H to L, an interrupt on Timer 1 is triggered and capture timer is saved in CC[3]. This, actually, doesn't happen.
How do I have to modify the code to save capture timer in CC[3], or in some other register?
Thanks in advance for your support.
Kind regards
Cristian