From e55e06d501ca2b607d10a9279f1f7e80a8b83f0e Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Mon, 16 Apr 2018 08:11:14 -0400 Subject: [PATCH 1/5] modify tick.c to work when interrupts disabled - modify PulseIn.c to cast argument to common_hal_delay_us --- ports/atmel-samd/common-hal/pulseio/PulseIn.c | 2 +- ports/atmel-samd/tick.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c index 2dca52913a..bf6dfa8d58 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c @@ -286,7 +286,7 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, common_hal_mcu_disable_interrupts(); gpio_set_pin_level(self->pin, !self->idle_state); - common_hal_mcu_delay_us(trigger_duration); + common_hal_mcu_delay_us((uint32_t)trigger_duration); gpio_set_pin_level(self->pin, self->idle_state); common_hal_mcu_enable_interrupts(); } diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index f5fd57f5d3..5c66df3cb0 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -59,14 +59,24 @@ void tick_init() { void tick_delay(uint32_t us) { uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000; uint32_t us_between_ticks = SysTick->VAL / ticks_per_us; - uint64_t start_ms = ticks_ms; + uint32_t start_tick; while (us > 1000) { - while (ticks_ms == start_ms) {} + start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET + while (SysTick->VAL < start_tick) {} us -= us_between_ticks; - start_ms = ticks_ms; us_between_ticks = 1000; } - while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {} + if(us&&(us < us_between_ticks)){ + while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {} + } + else { + start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET + while (SysTick->VAL < start_tick) {} + us -= us_between_ticks; + if(us){ + while (SysTick->VAL > ((1000 - us) * ticks_per_us)) {} + } + } } // us counts down! From e09d95067c20d126c3d24886d41938186856f8dd Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Tue, 17 Apr 2018 21:46:15 -0400 Subject: [PATCH 2/5] update tick.c (fix LOAD value) update PulseIn.c (do not enable interrupts for trigger_duration > 1000 --- ports/atmel-samd/common-hal/pulseio/PulseIn.c | 5 +++-- ports/atmel-samd/tick.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c index bf6dfa8d58..0b551858c8 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c @@ -283,8 +283,9 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, if (trigger_duration > 0) { gpio_set_pin_pull_mode(self->pin, GPIO_PULL_OFF); gpio_set_pin_direction(self->pin, GPIO_DIRECTION_OUT); - - common_hal_mcu_disable_interrupts(); + if(trigger_duration < 1000 ){ // only disable interrupts for < 1 ms + common_hal_mcu_disable_interrupts(); + } gpio_set_pin_level(self->pin, !self->idle_state); common_hal_mcu_delay_us((uint32_t)trigger_duration); gpio_set_pin_level(self->pin, self->idle_state); diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index 5c66df3cb0..9000be4740 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -52,7 +52,7 @@ void SysTick_Handler(void) { void tick_init() { uint32_t ticks_per_ms = common_hal_mcu_processor_get_frequency() / 1000; - SysTick_Config(ticks_per_ms); + SysTick_Config(ticks_per_ms-1); NVIC_EnableIRQ(SysTick_IRQn); } From 16bb40b1102016cd483915ab517d43f6ce074f13 Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Thu, 19 Apr 2018 22:25:48 -0400 Subject: [PATCH 3/5] modify tic.c to chec if interrupts are enabled, rename us_between_ticks to us until_next_tick --- ports/atmel-samd/tick.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index 9000be4740..8a927785f4 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -58,21 +58,24 @@ void tick_init() { void tick_delay(uint32_t us) { uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000; - uint32_t us_between_ticks = SysTick->VAL / ticks_per_us; + uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us; uint32_t start_tick; while (us > 1000) { + // check if interrupts are disabled + if(__get_PRIMASK()) + return; // if not just return start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET while (SysTick->VAL < start_tick) {} - us -= us_between_ticks; - us_between_ticks = 1000; + us -= us_until_next_tick; + us_until_next_tick = 1000; } - if(us&&(us < us_between_ticks)){ - while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {} + if(us&&(us < us_until_next_tick)){ + while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {} } else { start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET while (SysTick->VAL < start_tick) {} - us -= us_between_ticks; + us -= us_until_next_tick; if(us){ while (SysTick->VAL > ((1000 - us) * ticks_per_us)) {} } From fe738598dacd97149db738216fe4e574b8a926a7 Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Fri, 20 Apr 2018 11:59:33 -0400 Subject: [PATCH 4/5] modify tick.c to simplify - remove interupt disable from common_hal_pulseio_pulsein_resume --- ports/atmel-samd/common-hal/pulseio/PulseIn.c | 4 ---- ports/atmel-samd/tick.c | 15 ++------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c index 0b551858c8..6e3aa3abb3 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c @@ -283,13 +283,9 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, if (trigger_duration > 0) { gpio_set_pin_pull_mode(self->pin, GPIO_PULL_OFF); gpio_set_pin_direction(self->pin, GPIO_DIRECTION_OUT); - if(trigger_duration < 1000 ){ // only disable interrupts for < 1 ms - common_hal_mcu_disable_interrupts(); - } gpio_set_pin_level(self->pin, !self->idle_state); common_hal_mcu_delay_us((uint32_t)trigger_duration); gpio_set_pin_level(self->pin, self->idle_state); - common_hal_mcu_enable_interrupts(); } // Reconfigure the pin and make sure its set to detect the first edge. diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index 8a927785f4..72dddbe86f 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -60,26 +60,15 @@ void tick_delay(uint32_t us) { uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000; uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us; uint32_t start_tick; - while (us > 1000) { - // check if interrupts are disabled - if(__get_PRIMASK()) - return; // if not just return + while (us > us_until_next_tick) { start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET while (SysTick->VAL < start_tick) {} us -= us_until_next_tick; us_until_next_tick = 1000; } - if(us&&(us < us_until_next_tick)){ + if(us){ while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {} } - else { - start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET - while (SysTick->VAL < start_tick) {} - us -= us_until_next_tick; - if(us){ - while (SysTick->VAL > ((1000 - us) * ticks_per_us)) {} - } - } } // us counts down! From bef05ffbf183225563d087de8b48e80dbeb7dd17 Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Fri, 20 Apr 2018 15:23:03 -0400 Subject: [PATCH 5/5] cleanup in tick.c --- ports/atmel-samd/tick.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c index 72dddbe86f..27b5f05b44 100644 --- a/ports/atmel-samd/tick.c +++ b/ports/atmel-samd/tick.c @@ -60,15 +60,13 @@ void tick_delay(uint32_t us) { uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000; uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us; uint32_t start_tick; - while (us > us_until_next_tick) { + while (us >= us_until_next_tick) { start_tick=SysTick->VAL; // wait for SysTick->VAL to RESET while (SysTick->VAL < start_tick) {} us -= us_until_next_tick; us_until_next_tick = 1000; } - if(us){ - while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {} - } + while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {} } // us counts down!