|
-
-
- #include "FreqCount.h"
- #include "util/FreqCountTimers.h"
-
- #if(!defined(__IMXRT1062__))
- static uint16_t count_msw;
- static uint16_t gate_length;
- static uint16_t gate_index;
-
- void FreqCountClass::begin(uint16_t msec)
- {
- if (msec < 1) return;
- gate_index = 0;
- count_msw = 0;
- count_prev = 0;
- count_ready = 0;
- counter_init();
- gate_length = timer_init(msec);
- uint8_t status = SREG;
- cli();
- timer_start();
- timer_isr_latency_delay();
- counter_start();
- SREG = status;
- }
-
- uint8_t FreqCountClass::available(void)
- {
- return count_ready;
- }
-
- uint32_t FreqCountClass::read(void)
- {
- uint32_t count;
- uint8_t status;
-
- status = SREG;
- cli();
- #if defined(TIMER_USE_TIMER2) && F_CPU == 12000000L
- float correct = count_output * 0.996155;
- count = (uint32_t) (correct+0.5);
- #else
- count = count_output;
- #endif
- count_ready = 0;
- SREG = status;
- return count;
- }
-
- void FreqCountClass::end(void)
- {
- timer_shutdown();
- counter_shutdown();
- }
-
-
- ISR(TIMER_ISR_VECTOR)
- {
- uint16_t lsw, msw;
- uint32_t count;
- uint16_t index, length;
-
- lsw = counter_read();
- msw = count_msw;
- if (counter_overflow()) {
- counter_overflow_reset();
- if (lsw < 0xFA00) {
- msw = msw + 1;
- count_msw = msw;
- } else {
- count_msw = msw + 1;
- }
- }
- index = gate_index + 1;
- length = gate_length;
- if (index >= length) {
- gate_index = 0;
- count = ((uint32_t)msw << 16) + lsw;
- count_output = count - count_prev;
- count_prev = count;
- count_ready = 1;
- restore_other_interrupts();
- } else {
- if (index == length - 1) disable_other_interrupts();
- gate_index = index;
- }
- }
-
- #else
- void FreqCountClass::begin(uint32_t usec)
- {
- counter_init();
- timer_init(usec);
-
-
- }
-
- uint8_t FreqCountClass::available(void)
- {
- return count_ready;
- }
-
- uint32_t FreqCountClass::read(void)
- {
- count_output = count - count_prev;
- count_prev = count;
-
- count_prev = count;
- count_ready = 0;
-
- return count_output;
- }
-
- #endif
-
- FreqCountClass FreqCount;
-
|