From a4266f564c72cbf02266eebea6989b6cb2cbe7e7 Mon Sep 17 00:00:00 2001 From: dufourj Date: Wed, 10 May 2006 00:10:50 +0000 Subject: ES (RVB) : - correction d'un bug dans la machine a états des capteurs RVB ; - fonctionne avec deux capteurs RVB simultanément ! --- n/es-2006/src/main.c | 9 ++++----- n/es-2006/src/sensor_rvb.c | 26 ++++++++++++++------------ n/es-2006/src/timer_main.h | 1 + 3 files changed, 19 insertions(+), 17 deletions(-) (limited to 'n/es-2006/src') diff --git a/n/es-2006/src/main.c b/n/es-2006/src/main.c index f5e15a8..e95db14 100644 --- a/n/es-2006/src/main.c +++ b/n/es-2006/src/main.c @@ -28,6 +28,7 @@ #include "modules/uart/uart.h" #include "modules/proto/proto.h" #include "modules/utils/utils.h" +#include "modules/utils/byte.h" #include "timer_main.h" /* main timer */ #include "sensor_rvb.h" /* RVB sensors management */ @@ -43,6 +44,7 @@ void proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) { uint8_t compt; + uint16_t temp_16b; /* This macro combine command and size in one integer. */ #define c(cmd, size) (cmd << 8 | size) switch (c (cmd, size)) @@ -53,14 +55,11 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) break; /* RVB sensors stats */ case c ('S', 3): + temp_16b = v8_to_v16 (args[0], args[1]); for (compt = 0; compt < RVB_MAX_SENSOR; compt++) - // TODO improve this ! - if ( ((compt >= 8) && (args[0] & _BV(compt))) - || ((compt < 8) && (args[1] & _BV(compt))) ) - { + if (temp_16b & _BV(compt)) sensor_rvb_stat_enable[compt] = sensor_rvb_stats[compt] = args[2]; - } break; // case c ('s', 2): // sensor_rvb_watch (args[0], args[1]); diff --git a/n/es-2006/src/sensor_rvb.c b/n/es-2006/src/sensor_rvb.c index a354c53..b6576e1 100644 --- a/n/es-2006/src/sensor_rvb.c +++ b/n/es-2006/src/sensor_rvb.c @@ -27,8 +27,6 @@ #include "io.h" #include "modules/utils/utils.h" /* regv */ -#include "modules/uart/uart.h" -#include "modules/proto/proto.h" /** * Somes defines. @@ -37,7 +35,7 @@ #define S1RVB 7 #define S0RVB 6 /** Max input capture before considering we can start the real capture. */ -#define RVB_MAX_FALSE_IC 4 +#define RVB_MAX_FALSE_IC 8 /** Max overflow of the timer 1 before thinking the sensor is HS. */ /* TODO Find a way to compute this value */ #define RVB_MAX_OVERFLOW 250 @@ -206,6 +204,9 @@ sensor_rvb_update (void) else { sensor_rvb_state_ = RVB_STATE_WAIT_IC; + /* Ensure we have no pending interrupt for IC1. */ + // XXX | ? + TIFR |= _BV (ICF1); /* Enable interrupt for IC1 */ TIMSK |= _BV (TICIE1); } @@ -227,6 +228,9 @@ sensor_rvb_update (void) sensor_rvb_color_select (sensor_rvb_color_ = 0); sensor_rvb_state_ = RVB_STATE_WAIT_IC; sensor_rvb_overflow_count_ = 0; + /* Ensure we have no pending interrupt for IC1. */ + // XXX | ? + TIFR |= _BV (ICF1); /* Enable interrupt for IC1 and counter overflow */ TIMSK |= _BV (TICIE1); TIMSK |= _BV (TOIE1); @@ -238,7 +242,7 @@ SIGNAL (SIG_OVERFLOW1) { switch (sensor_rvb_state_) { - case RVB_STATE_START_CAPTURE: + case RVB_STATE_STOP_CAPTURE: ++sensor_rvb_overflow_count_; break; case RVB_STATE_WAIT_IC: @@ -265,28 +269,26 @@ SIGNAL (SIG_INPUT_CAPTURE1) case RVB_STATE_WAIT_IC: sensor_rvb_ic_count_ = RVB_MAX_FALSE_IC; sensor_rvb_state_ = RVB_STATE_WAIT_IC2; + /* nobreak */ case RVB_STATE_WAIT_IC2: if (!--sensor_rvb_ic_count_) /* Last ignored capture */ sensor_rvb_state_ = RVB_STATE_START_CAPTURE; break; case RVB_STATE_START_CAPTURE: - sensor_rvb_overflow_count_ = 0; /* Save capture start */ sensor_rvb_value_ = ICR1; + sensor_rvb_overflow_count_ = 0; /* New capture */ sensor_rvb_state_ = RVB_STATE_STOP_CAPTURE; break; case RVB_STATE_STOP_CAPTURE: + /* Save */ + // XXX Check this please + sensor_rvb_values[sensor_rvb_number_ - 1][sensor_rvb_color_] = ICR1 + + sensor_rvb_overflow_count_ * TC1_TOP - sensor_rvb_value_; /* Disable IC interrupt */ TIMSK &= ~_BV (TICIE1); - /* Ensure we have no pending interrupt for IC1. */ - TIFR = _BV (ICF1); - /* Compute value */ - sensor_rvb_value_ = ICR1 + sensor_rvb_overflow_count_ * TC1_TOP - - sensor_rvb_value_; - /* Save */ - sensor_rvb_values[sensor_rvb_number_ - 1][sensor_rvb_color_] = sensor_rvb_value_; sensor_rvb_state_ = RVB_STATE_NEXT_COLOR; /* Next please */ sensor_rvb_update (); diff --git a/n/es-2006/src/timer_main.h b/n/es-2006/src/timer_main.h index 458db2e..6a932b7 100644 --- a/n/es-2006/src/timer_main.h +++ b/n/es-2006/src/timer_main.h @@ -45,6 +45,7 @@ timer_main_wait (void) while (!(TIFR & _BV (TOV0))) ; /* Write 1 to clear. */ + // XXX Check why there is no | TIFR = _BV (TOV0); } -- cgit v1.2.3