From fd2feb1325a6899fa20fd9996e22d22205c01f85 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sun, 8 May 2011 12:34:13 +0200 Subject: digital/{asserv,mimot}: fix counter fix, see 05923d2e3433 If division is done after difference, then odd displacement are dropped. Mask unused bit so that difference is always even. --- digital/asserv/src/asserv/counter_ext.avr.c | 4 ++++ digital/mimot/src/dirty/counter_ext.avr.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/digital/asserv/src/asserv/counter_ext.avr.c b/digital/asserv/src/asserv/counter_ext.avr.c index 6a883caa..29c51b87 100644 --- a/digital/asserv/src/asserv/counter_ext.avr.c +++ b/digital/asserv/src/asserv/counter_ext.avr.c @@ -178,6 +178,7 @@ counter_update (void) counter_update_step (); /* Left counter. */ uint16_t left = counter_left_new_step; + left &= 0xffff << COUNTER_LEFT_SHIFT; /* Reset unused bits. */ #if !COUNTER_LEFT_REVERSE counter_left_diff = (int16_t) (left - counter_left_old); #else @@ -188,6 +189,7 @@ counter_update (void) counter_left += counter_left_diff; /* Right counter. */ uint16_t right = counter_right_new_step; + right &= 0xffff << COUNTER_RIGHT_SHIFT; /* Reset unused bits. */ #if !COUNTER_RIGHT_REVERSE counter_right_diff = (int16_t) (right - counter_right_old); #else @@ -203,6 +205,7 @@ counter_update (void) counter_right = right_new; /* First auxiliary counter. */ uint16_t aux0 = counter_aux_new_step[0]; + aux0 &= 0xffff << COUNTER_AUX0_SHIFT; /* Reset unused bits. */ #if !COUNTER_AUX0_REVERSE counter_aux_diff[0] = (int16_t) (aux0 - counter_aux_old[0]); #else @@ -213,6 +216,7 @@ counter_update (void) counter_aux[0] += counter_aux_diff[0]; /* Second auxiliary counter. */ uint16_t aux1 = counter_aux_new_step[1]; + aux1 &= 0xffff << COUNTER_AUX1_SHIFT; /* Reset unused bits. */ #if !COUNTER_AUX1_REVERSE counter_aux_diff[1] = (int16_t) (aux1 - counter_aux_old[1]); #else diff --git a/digital/mimot/src/dirty/counter_ext.avr.c b/digital/mimot/src/dirty/counter_ext.avr.c index e99d9dc0..bd004c25 100644 --- a/digital/mimot/src/dirty/counter_ext.avr.c +++ b/digital/mimot/src/dirty/counter_ext.avr.c @@ -150,6 +150,7 @@ counter_update (void) counter_update_step (); /* First auxiliary counter. */ uint16_t aux0 = counter_aux_new_step[0]; + aux0 &= 0xffff << COUNTER_AUX0_SHIFT; /* Reset unused bits. */ #if !COUNTER_AUX0_REVERSE counter_aux_diff[0] = (int16_t) (aux0 - counter_aux_old[0]); #else @@ -160,6 +161,7 @@ counter_update (void) counter_aux[0] += counter_aux_diff[0]; /* Second auxiliary counter. */ uint16_t aux1 = counter_aux_new_step[1]; + aux1 &= 0xffff << COUNTER_AUX1_SHIFT; /* Reset unused bits. */ #if !COUNTER_AUX1_REVERSE counter_aux_diff[1] = (int16_t) (aux1 - counter_aux_old[1]); #else -- cgit v1.2.3