X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Favr%2Fao_pwmin.c;h=2d83380f2d43aa64e0a5b938066883ec9ac2d554;hb=2de8922b505f0358a36933721fbddf6a9ef7e9a4;hp=73a153b2e4cc67332b879e18b02febe1333687c5;hpb=da7ac5e95575f6aa1d2514748869771b7686c0e1;p=fw%2Faltos diff --git a/src/avr/ao_pwmin.c b/src/avr/ao_pwmin.c index 73a153b2..2d83380f 100644 --- a/src/avr/ao_pwmin.c +++ b/src/avr/ao_pwmin.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,23 +26,43 @@ * project payload developed at Challenger Middle School. */ -volatile __data uint16_t ao_icp3_count; +volatile uint16_t ao_icp3_count = 0; +volatile uint16_t ao_icp3_last = 0; + +uint16_t ao_icp3(void) +{ + uint16_t v; + ao_arch_critical( + v = ao_icp3_count; + ); + return v; +} static void -ao_pwmin_display(void) __reentrant +ao_pwmin_display(void) { /* display the most recent value */ - printf("icp 3: %5u\n", ao_icp3_count); + printf("icp 3: %5u\n", ao_icp3()); } + + ISR(TIMER3_CAPT_vect) { + uint8_t lo = ICR3L; uint8_t hi = ICR3H; - ao_icp3_count = (hi <<8) | lo; + uint16_t ao_icp3_this = (hi <<8) | lo; + + /* handling counter rollovers */ + if (ao_icp3_this >= ao_icp3_last) + ao_icp3_count = ao_icp3_this - ao_icp3_last; + else + ao_icp3_count = ao_icp3_this + (65536 - ao_icp3_last); + ao_icp3_last = ao_icp3_this; } -__code struct ao_cmds ao_pwmin_cmds[] = { +const struct ao_cmds ao_pwmin_cmds[] = { { ao_pwmin_display, "p\0PWM input" }, { 0, NULL }, }; @@ -56,7 +77,7 @@ ao_pwmin_init(void) (0 << ICES3) | /* input capture on falling edge (don't care) */ (0 << WGM33) | /* normal mode, OCR3A */ (0 << WGM32) | /* normal mode, OCR3A */ - (4 << CS30)); /* clk/256 from prescaler */ + (3 << CS30)); /* clk/64 from prescaler */