summaryrefslogtreecommitdiff
path: root/n/es/src/ascenseur.c
diff options
context:
space:
mode:
authorburg2005-04-24 21:43:58 +0000
committerburg2005-04-24 21:43:58 +0000
commitc995c19c769f3584a6e103a3a6fe27afd5db0c05 (patch)
tree405e09a637246e925970f858a828431a514c0f31 /n/es/src/ascenseur.c
parent7d1f86949f4b72895aaf675a1f001d834160369b (diff)
Refonte de l'ascenseur par Ni
Diffstat (limited to 'n/es/src/ascenseur.c')
-rw-r--r--n/es/src/ascenseur.c151
1 files changed, 126 insertions, 25 deletions
diff --git a/n/es/src/ascenseur.c b/n/es/src/ascenseur.c
index f540474..0cbe866 100644
--- a/n/es/src/ascenseur.c
+++ b/n/es/src/ascenseur.c
@@ -24,13 +24,23 @@
#include "ascenseur.h"
#include "avr/io.h"
+/* Pin des capteurs. */
+#define CAPTEUR_BAS 0
+#define CAPTEUR_MILIEU 1
+#define CAPTEUR_HAUT 2
-extern uint8_t vitesse_ascenseur_m;
-extern uint8_t vitesse_ascenseur_d;
-extern uint8_t vitesse_montee_max;
-extern uint8_t vitesse_descente_max;
-extern uint8_t accel_montee;
-extern uint8_t accel_descente;
+uint8_t ascenseur_vitesse_voulue;
+uint8_t ascenseur_vitesse;
+uint8_t ascenseur_min_monte = 0x20;
+uint8_t ascenseur_max_monte = 0x03;
+uint8_t ascenseur_accel_monte = 1;
+uint8_t ascenseur_min_descend = 0x10;
+uint8_t ascenseur_max_descend = 0x01;
+uint8_t ascenseur_accel_descend = 1;
+uint8_t ascenseur_max;
+uint8_t ascenseur_min;
+uint8_t ascenseur_accel;
+uint8_t ascenseur_state = ASCENSEUR_LIBRE;
#define TC_STOP 0x00
#define TC_GO 0x1f /* mode CTC | OC2 | prescaler = 128. */
@@ -38,52 +48,143 @@ extern uint8_t accel_descente;
/* +AutoDec */
/* -AutoDec */
-void ascenseur_init()
+static void asc_haut(uint8_t valeur);
+static void asc_bas(uint8_t valeur);
+static void asc_stable(void);
+static void asc_libre(void);
+static uint8_t capteur_bas();
+static uint8_t capteur_haut();
+static uint8_t capteur_milieu();
+static void asc_libre(void);
+static void ascenseur_update_vitesse (void);
+
+
+void ascenseur_init ()
{
TCCR2 = TC_STOP;
- vitesse_ascenseur_m = 0xF0;
- vitesse_ascenseur_d = 0xF0;
- vitesse_montee_max = 0x20;
- vitesse_descente_max = 0x32;
- accel_montee = 3;
- accel_descente = 3;
}
-void asc_haut(uint8_t valeur)
+void ascenseur_update ()
+{
+ switch (ascenseur_state)
+ {
+ case ASCENSEUR_LIBRE:
+ asc_libre ();
+ break;
+ case ASCENSEUR_STOP:
+ asc_stable ();
+ break;
+ case ASCENSEUR_MONTE:
+ if (capteur_haut ())
+ {
+ ascenseur_state = ASCENSEUR_MONTE_STOP;
+ ascenseur_vitesse_voulue = ascenseur_min;
+ }
+ ascenseur_update_vitesse ();
+ asc_haut (ascenseur_vitesse);
+ break;
+ case ASCENSEUR_MONTE_STOP:
+ if (!capteur_haut ())
+ {
+ ascenseur_state = ASCENSEUR_STOP;
+ }
+ ascenseur_update_vitesse ();
+ asc_haut (ascenseur_vitesse);
+ break;
+ case ASCENSEUR_DESCEND:
+ if (capteur_bas ())
+ {
+ ascenseur_state = ASCENSEUR_DESCEND_STOP;
+ ascenseur_vitesse_voulue = ascenseur_min;
+ }
+ ascenseur_update_vitesse ();
+ asc_bas (ascenseur_vitesse);
+ break;
+ case ASCENSEUR_DESCEND_STOP:
+ if (!capteur_bas ())
+ {
+ ascenseur_state = ASCENSEUR_STOP;
+ }
+ ascenseur_update_vitesse ();
+ asc_bas (ascenseur_vitesse);
+ break;
+ case ASCENSEUR_MILIEU:
+ if (capteur_milieu ())
+ {
+ ascenseur_state = ASCENSEUR_MILIEU_STOP;
+ ascenseur_vitesse_voulue = ascenseur_min;
+ }
+ ascenseur_update_vitesse ();
+ asc_bas (ascenseur_vitesse);
+ break;
+ case ASCENSEUR_MILIEU_STOP:
+ if (!capteur_milieu ())
+ {
+ ascenseur_state = ASCENSEUR_STOP;
+ }
+ ascenseur_update_vitesse ();
+ asc_bas (ascenseur_vitesse);
+ break;
+ }
+}
+
+static void
+ascenseur_update_vitesse (void)
+{
+ if (ascenseur_vitesse < ascenseur_vitesse_voulue)
+ {
+ ascenseur_vitesse += ascenseur_vitesse_voulue;
+ if (ascenseur_vitesse > ascenseur_vitesse_voulue)
+ ascenseur_vitesse = ascenseur_vitesse_voulue;
+ }
+ else if (ascenseur_vitesse > ascenseur_vitesse_voulue)
+ {
+ ascenseur_vitesse -= ascenseur_vitesse_voulue;
+ if (ascenseur_vitesse < ascenseur_vitesse_voulue)
+ ascenseur_vitesse = ascenseur_vitesse_voulue;
+ }
+}
+
+static void asc_haut(uint8_t valeur)
{
+ PORTB |= _BV(0); // sens
TCCR2 = TC_GO;
OCR2 = valeur;
- PORTB |= _BV(0); // sens
PORTD |= _BV(6); // on enable
}
-void asc_bas(uint8_t valeur)
+static void asc_bas(uint8_t valeur)
{
+ PORTB &= ~_BV(0);
TCCR2 = TC_GO;
OCR2 = valeur;
- PORTB &= ~_BV(0);
PORTD |= _BV(6);
}
-void asc_stable(uint8_t valeur)
+static void asc_stable(void)
{
TCCR2 = TC_STOP;
- PORTB |= _BV(0);
PORTD |= _BV(6);
}
-uint8_t capteur_bas()
+static void asc_libre(void)
+{
+ TCCR2 = TC_STOP;
+ PORTD &= ~_BV(6);
+}
+
+static uint8_t capteur_bas()
{
- return PINA & _BV(CAPTEUR_BAS);
+ return !(PINA & _BV(CAPTEUR_BAS));
}
-uint8_t capteur_haut()
+static uint8_t capteur_haut()
{
- return PINA & _BV(CAPTEUR_HAUT);
+ return !(PINA & _BV(CAPTEUR_HAUT));
}
-uint8_t capteur_milieu()
+static uint8_t capteur_milieu()
{
- return PINA & _BV(CAPTEUR_MILIEU);
+ return !(PINA & _BV(CAPTEUR_MILIEU));
}