diff options
| author | Robert Garbee <robert@gag.com> | 2012-07-18 18:41:00 -0600 | 
|---|---|---|
| committer | Robert Garbee <robert@gag.com> | 2012-07-18 18:41:00 -0600 | 
| commit | ada6f2dfc045e77cb9499f20cdec1b4a54ef0db1 (patch) | |
| tree | 879f53e8121f71d3c4ac924298b9472dee564abe /src/avr/ao_pwmin.c | |
| parent | e2b472bbb2418fc13be42dbc7c52beb88479c46d (diff) | |
telescience: correctly calculating rate values with higher resolution
Diffstat (limited to 'src/avr/ao_pwmin.c')
| -rw-r--r-- | src/avr/ao_pwmin.c | 28 | 
1 files changed, 24 insertions, 4 deletions
diff --git a/src/avr/ao_pwmin.c b/src/avr/ao_pwmin.c index 73a153b2..84397357 100644 --- a/src/avr/ao_pwmin.c +++ b/src/avr/ao_pwmin.c @@ -25,20 +25,40 @@   * project payload developed at Challenger Middle School.     */ -volatile __data uint16_t ao_icp3_count; +volatile __data uint16_t ao_icp3_count = 0; +volatile __data 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  {  	/* 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[] = { @@ -56,7 +76,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 */  | 
