summaryrefslogtreecommitdiff
path: root/digital/asserv/src/asserv
diff options
context:
space:
mode:
authorNicolas Schodet2011-03-19 18:16:06 +0100
committerNicolas Schodet2011-03-19 18:16:06 +0100
commit05923d2e343371075607f0240e7db2c04f5080c9 (patch)
tree6da1d76d059e19236ebe77763141522961aab0ba /digital/asserv/src/asserv
parentb8f4a34f5aa835cd79bf524e8132db28c5aa2be7 (diff)
digital/{asserv,mimot}: fix counter shift
The shift should be done on a signed value or else there is a problem on overflow.
Diffstat (limited to 'digital/asserv/src/asserv')
-rw-r--r--digital/asserv/src/asserv/counter_ext.avr.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/digital/asserv/src/asserv/counter_ext.avr.c b/digital/asserv/src/asserv/counter_ext.avr.c
index c7c2afe7..6a883caa 100644
--- a/digital/asserv/src/asserv/counter_ext.avr.c
+++ b/digital/asserv/src/asserv/counter_ext.avr.c
@@ -177,21 +177,23 @@ counter_update (void)
/* Wants fresh data. */
counter_update_step ();
/* Left counter. */
- uint16_t left = counter_left_new_step >> COUNTER_LEFT_SHIFT;
+ uint16_t left = counter_left_new_step;
#if !COUNTER_LEFT_REVERSE
counter_left_diff = (int16_t) (left - counter_left_old);
#else
counter_left_diff = (int16_t) (counter_left_old - left);
#endif
+ counter_left_diff >>= COUNTER_LEFT_SHIFT;
counter_left_old = left;
counter_left += counter_left_diff;
/* Right counter. */
- uint16_t right = counter_right_new_step >> COUNTER_RIGHT_SHIFT;
+ uint16_t right = counter_right_new_step;
#if !COUNTER_RIGHT_REVERSE
counter_right_diff = (int16_t) (right - counter_right_old);
#else
counter_right_diff = (int16_t) (counter_right_old - right);
#endif
+ counter_right_diff >>= COUNTER_RIGHT_SHIFT;
counter_right_old = right;
/* Fix right counter. */
counter_right_raw += counter_right_diff;
@@ -200,21 +202,23 @@ counter_update (void)
counter_right_diff = (int16_t) (right_new - counter_right);
counter_right = right_new;
/* First auxiliary counter. */
- uint16_t aux0 = counter_aux_new_step[0] >> COUNTER_AUX0_SHIFT;
+ uint16_t aux0 = counter_aux_new_step[0];
#if !COUNTER_AUX0_REVERSE
counter_aux_diff[0] = (int16_t) (aux0 - counter_aux_old[0]);
#else
counter_aux_diff[0] = (int16_t) (counter_aux_old[0] - aux0);
#endif
+ counter_aux_diff[0] >>= COUNTER_AUX0_SHIFT;
counter_aux_old[0] = aux0;
counter_aux[0] += counter_aux_diff[0];
/* Second auxiliary counter. */
- uint16_t aux1 = counter_aux_new_step[1] >> COUNTER_AUX1_SHIFT;
+ uint16_t aux1 = counter_aux_new_step[1];
#if !COUNTER_AUX1_REVERSE
counter_aux_diff[1] = (int16_t) (aux1 - counter_aux_old[1]);
#else
counter_aux_diff[1] = (int16_t) (counter_aux_old[1] - aux1);
#endif
+ counter_aux_diff[1] >>= COUNTER_AUX1_SHIFT;
counter_aux_old[1] = aux1;
counter_aux[1] += counter_aux_diff[1];
}