summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--digital/io/src/simu.host.c3
-rw-r--r--digital/io/src/simu.host.h2
-rw-r--r--digital/io/src/usdist.c97
-rw-r--r--digital/io/src/usdist.h8
4 files changed, 89 insertions, 21 deletions
diff --git a/digital/io/src/simu.host.c b/digital/io/src/simu.host.c
index 134d0ba4..c4f607d0 100644
--- a/digital/io/src/simu.host.c
+++ b/digital/io/src/simu.host.c
@@ -73,6 +73,9 @@ uint8_t PORTB;
/** Contact registers. */
uint8_t PORTC, PINC;
+/** Unused AVR registers. */
+uint8_t PORTD, PORTG, DDRC, DDRD, DDRG;
+
void
handle_contact (void *user, mex_msg_t *msg)
{
diff --git a/digital/io/src/simu.host.h b/digital/io/src/simu.host.h
index f885a1c5..09dade39 100644
--- a/digital/io/src/simu.host.h
+++ b/digital/io/src/simu.host.h
@@ -32,6 +32,8 @@
extern uint8_t PORTC, PINC;
+extern uint8_t PORTD, PORTG, DDRC, DDRD, DDRG;
+
/** Hooked, do nothing. */
void
switch_init (void);
diff --git a/digital/io/src/usdist.c b/digital/io/src/usdist.c
index 342358ea..d7f69975 100644
--- a/digital/io/src/usdist.c
+++ b/digital/io/src/usdist.c
@@ -24,41 +24,100 @@
* }}} */
#include "common.h"
#include "usdist.h"
+#include "main_timer.h"
#include "modules/adc/adc.h"
#include "modules/utils/utils.h"
#include "io.h"
+#include "simu.host.h"
+
uint16_t usdist_mm[USDIST_NB];
+/** Describe a sensor. */
+struct usdist_sensor_t
+{
+ /** ADC number. */
+ uint8_t adc;
+ /** Sync PORT. */
+ volatile uint8_t *sync_port;
+ /** Sync DDR. */
+ volatile uint8_t *sync_ddr;
+ /** Sync bit mask. */
+ uint8_t sync_bv;
+};
+
+/** Define sensors configuration. */
+#define USDIST_SENSOR(adc, p, n) \
+ { adc, &IO_PORT_ (p, n), &IO_DDR_ (p, n), IO_BV_ (p, n) }
+struct usdist_sensor_t usdist_sensors[USDIST_NB] = {
+ USDIST_SENSOR (0, G, 3),
+ USDIST_SENSOR (1, G, 1),
+ USDIST_SENSOR (2, C, 7),
+ USDIST_SENSOR (3, D, 4),
+};
+
void
usdist_init (void)
{
+ uint8_t i;
adc_init ();
+ for (i = 0; i < USDIST_NB; i++)
+ {
+ usdist_mm[i] = 0xffff;
+ *usdist_sensors[i].sync_port |= usdist_sensors[i].sync_bv;
+ *usdist_sensors[i].sync_ddr |= usdist_sensors[i].sync_bv;
+ }
}
-void
+uint8_t
usdist_update (void)
{
- uint8_t i;
- /* Simple algorithm, just make a conversion for every sensor. This should
- * be improved because it takes too long. */
- for (i = 0; i < USDIST_NB; i++)
+ /* Current measuring sensor. */
+ static uint8_t current;
+ /* Number of cycles until the measure ends. */
+ static uint8_t wait;
+ /* Set to one once first cycle is done. */
+ static uint8_t init;
+ /* Time to measure? */
+ if (wait == 0)
+ {
+ if (init)
+ {
+ /* Stop sensor. */
+ *usdist_sensors[current].sync_port |=
+ usdist_sensors[current].sync_bv;
+ /* Read ADC value. */
+ adc_start (usdist_sensors[current].adc);
+ while (!adc_checkf ())
+ ;
+ uint16_t v = adc_read ();
+ /* Our sensors return a value between 1 and 5 V proportional to
+ * the distance between calibrated values. */
+ if (v <= 1024 / 5)
+ usdist_mm[current] = USDIST_MM_MIN;
+ else
+ usdist_mm[current] = USDIST_MM_MIN
+ + ((uint32_t) (v - 1024 / 5)
+ * (USDIST_MM_MAX - USDIST_MM_MIN)
+ / (4 * 1024 / 5));
+ if (usdist_mm[current] >= USDIST_MM_TOO_FAR)
+ usdist_mm[current] = 0xffff;
+ /* Next. */
+ current = (current + 1) % USDIST_NB;
+ }
+ init = 1;
+ /* Prepare next measure. */
+ *usdist_sensors[current].sync_port &=
+ ~usdist_sensors[current].sync_bv;
+ wait = USDIST_PERIOD_CYCLE;
+ /* New mesure done. */
+ return 1;
+ }
+ else
{
- adc_start (i);
- while (!adc_checkf ())
- ;
- uint16_t v = adc_read ();
- /* Our sensors return a value between 1 and 5 V proportional to the
- * distance between calibrated values. */
- if (v <= 1024 / 5)
- usdist_mm[i] = USDIST_MM_MIN;
- else
- usdist_mm[i] = USDIST_MM_MIN
- + (uint32_t) (v - 1024 / 5) * (USDIST_MM_MAX - USDIST_MM_MIN)
- / (4 * 1024 / 5);
- if (usdist_mm[i] >= USDIST_MM_TOO_FAR)
- usdist_mm[i] = 0xffff;
+ wait--;
+ return 0;
}
}
diff --git a/digital/io/src/usdist.h b/digital/io/src/usdist.h
index f5ceef99..541d1c93 100644
--- a/digital/io/src/usdist.h
+++ b/digital/io/src/usdist.h
@@ -41,6 +41,9 @@
/** Distance considered as too far to be true. */
#define USDIST_MM_TOO_FAR 650
+/** Measuring period in cycles. */
+#define USDIST_PERIOD_CYCLE (uint8_t) (8.0 / MT_TC0_PERIOD)
+
/** Array containing the last measures in millimeters. */
extern uint16_t usdist_mm[USDIST_NB];
@@ -48,8 +51,9 @@ extern uint16_t usdist_mm[USDIST_NB];
void
usdist_init (void);
-/** To be called every cycle to update sensor measures. */
-void
+/** To be called every cycle to update sensor measures.
+ * - returns: non zero if sensor value has been updated. */
+uint8_t
usdist_update (void);
#endif /* usdist_h */