summaryrefslogtreecommitdiff
path: root/n
diff options
context:
space:
mode:
Diffstat (limited to 'n')
-rw-r--r--n/es/src/ascenseur.c151
-rw-r--r--n/es/src/ascenseur.h40
-rw-r--r--n/es/src/main.c159
3 files changed, 202 insertions, 148 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));
}
diff --git a/n/es/src/ascenseur.h b/n/es/src/ascenseur.h
index ce809f5..cf8ddac 100644
--- a/n/es/src/ascenseur.h
+++ b/n/es/src/ascenseur.h
@@ -21,28 +21,34 @@
* Web: http://perso.efrei.fr/~dalmais/
* Email: <dalmais@efrei.fr>
* }}} */
-
#ifndef ascenseur_h
#define ascenseur_h
-#define CAPTEUR_BAS 0
-#define CAPTEUR_MILIEU 1
-#define CAPTEUR_HAUT 2
+#include <stdint.h>
-#define MONTE 0
-#define DESCEND 1
-#define STABLE 2
-#define MONTE_M 3
-#define DESCEND_M 4
+#define ASCENSEUR_LIBRE 0
+#define ASCENSEUR_STOP 1
+#define ASCENSEUR_MONTE 2
+#define ASCENSEUR_MONTE_STOP 3
+#define ASCENSEUR_DESCEND 4
+#define ASCENSEUR_DESCEND_STOP 5
+#define ASCENSEUR_MILIEU 6
+#define ASCENSEUR_MILIEU_STOP 7
-#include <stdint.h>
+extern uint8_t ascenseur_vitesse_voulue;
+extern uint8_t ascenseur_vitesse;
+extern uint8_t ascenseur_max_monte;
+extern uint8_t ascenseur_min_monte;
+extern uint8_t ascenseur_accel_monte;
+extern uint8_t ascenseur_max_descend;
+extern uint8_t ascenseur_min_descend;
+extern uint8_t ascenseur_accel_descend;
+extern uint8_t ascenseur_max;
+extern uint8_t ascenseur_min;
+extern uint8_t ascenseur_accel;
+extern uint8_t ascenseur_state;
-void ascenseur_init();
-void asc_haut(uint8_t valeur);
-void asc_bas(uint8_t valeur);
-void asc_stable(uint8_t valeur);
-uint8_t capteur_bas();
-uint8_t capteur_haut();
-uint8_t capteur_milieu();
+void ascenseur_init ();
+void ascenseur_update ();
#endif
diff --git a/n/es/src/main.c b/n/es/src/main.c
index 9f3ecb5..3802523 100644
--- a/n/es/src/main.c
+++ b/n/es/src/main.c
@@ -44,19 +44,10 @@ char buffer_serie ; // buffer RS232
const uint16_t prescaler = 8;// prescaler
uint16_t tableau_longueur[25];
uint16_t SEUIL = 0x0100;
-uint8_t mesure = 0;
-uint8_t ascenseur = 0;
+uint8_t mesure;
+uint8_t ascenseur;
+uint8_t ventouse;
uint8_t pont;
-uint8_t vitesse_ascenseur_m = 0;
-uint8_t vitesse_ascenseur_d = 0;
-uint8_t vitesse_ascenseur = 0;
-uint8_t commande = 0;
-uint8_t vitesse_montee_max = 0;
-uint8_t vitesse_descente_max = 0;
-uint8_t accel_montee = 0;
-uint8_t accel_descente = 0;
-uint8_t decel_montee = 0;
-uint8_t decel_descente = 0;
int main (void)
{
@@ -67,7 +58,7 @@ int main (void)
/// intialisation
DDRD = 0xC0;
DDRA = 0x00;
- DDRB = 0x11;
+ DDRB = 0x13;
DDRC = 0x00;
rs232_init ();
@@ -81,7 +72,6 @@ int main (void)
mesure = 0;
etat = 1;
clk = 1;
- commande = 10;
sei (); // on met les interruptions
@@ -131,70 +121,15 @@ int main (void)
}
if(ascenseur == 1)
{
-
- switch(commande)
+ ascenseur_update ();
+ }
+ if (ventouse)
+ {
+ ventouse--;
+ if (!ventouse)
{
- case MONTE:
-
- if(!capteur_haut())
- {
- if(vitesse_ascenseur > 0xF0)
- {
- asc_stable(vitesse_ascenseur);
- }
- else
- {
- vitesse_ascenseur += accel_montee;
- asc_haut(vitesse_ascenseur);
- }
- }
- else
- {
- if(vitesse_ascenseur > vitesse_montee_max) vitesse_ascenseur -= decel_montee;
- asc_haut(vitesse_ascenseur);
- proto_send1b('O',vitesse_ascenseur);
- }
- break;
- case DESCEND:
-
- if(!capteur_bas())
- {
-
-
- if(vitesse_ascenseur > 0xF0)
- {
- asc_stable(vitesse_ascenseur);
- }
- else
- {
- vitesse_ascenseur += decel_descente;
- asc_bas(vitesse_ascenseur);
- }
- }
-
- else
- {
- if(vitesse_ascenseur > vitesse_descente_max) vitesse_ascenseur -= accel_descente;
- asc_bas(vitesse_ascenseur);
- proto_send1b('O',vitesse_ascenseur);
- }
-
- break;
- case STABLE :
- asc_stable(vitesse_ascenseur);
- proto_send1b('O',vitesse_ascenseur);
-
- break;
- case MONTE_M :
- asc_haut(vitesse_ascenseur);
- proto_send1b('O',vitesse_ascenseur);
- break;
- case DESCEND_M :
- asc_bas(vitesse_ascenseur);
- proto_send1b('O',vitesse_ascenseur);
- break;
+ PORTB &= ~_BV (1);
}
-
}
}
@@ -229,49 +164,61 @@ void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args)
case c ('m',0): { // ordre de monter l'ascenseur
etat = 1;
ascenseur = 1;
- vitesse_ascenseur = vitesse_ascenseur_m;
- commande = MONTE;
-
+ ascenseur_min = ascenseur_min_monte;
+ ascenseur_max = ascenseur_max_monte;
+ ascenseur_accel = ascenseur_accel_monte;
+ ascenseur_vitesse = ascenseur_min;
+ ascenseur_vitesse_voulue = ascenseur_max;
+ ascenseur_state = ASCENSEUR_MONTE;
}break;
case c ('d',0): { // ordre de descendre l'ascenseur
etat = 1;
ascenseur = 1;
- vitesse_ascenseur = vitesse_ascenseur_d;
- commande = DESCEND;
+ ascenseur_min = ascenseur_min_descend;
+ ascenseur_max = ascenseur_max_descend;
+ ascenseur_accel = ascenseur_accel_descend;
+ ascenseur_vitesse = ascenseur_min;
+ ascenseur_vitesse_voulue = ascenseur_max;
+ ascenseur_state = ASCENSEUR_DESCEND;
}break;
- case c ('s',0): { // ordre de stabiliser l'ascenseur
+ case c ('n',0): { // ordre de nilieuser l'ascenseur
etat = 1;
ascenseur = 1;
- commande = STABLE;
+ ascenseur_min = ascenseur_min_descend;
+ ascenseur_max = ascenseur_max_descend;
+ ascenseur_accel = ascenseur_accel_descend;
+ ascenseur_vitesse = ascenseur_min;
+ ascenseur_vitesse_voulue = ascenseur_max;
+ ascenseur_state = ASCENSEUR_MILIEU;
}break;
- case c ('M',1):{ // unique
- vitesse_ascenseur = args[0];
- ascenseur = 1;
- commande = MONTE_M;
- etat = 1;
- }break;
- case c ('D',1):{ // unique
- vitesse_ascenseur = args[0];
- ascenseur = 1;
- commande = DESCEND_M;
- etat = 1;
- }break;
-
- case c ('P',6):{ // unique
- ascenseur = 1;
- vitesse_ascenseur_m = args[0];
- vitesse_ascenseur_d = args[1];
- vitesse_montee_max = args[2];
- vitesse_descente_max = args[3];
- accel_montee = args[4];
- accel_descente = args[5];
- }break;
+ case c ('s',0): { // ordre de stabiliser l'ascenseur
+ etat = 1;
+ ascenseur = 1;
+ ascenseur_state = ASCENSEUR_STOP;
+ }break;
+ case c ('l',0): { // ordre de stabiliser l'ascenseur
+ etat = 1;
+ ascenseur = 1;
+ ascenseur_state = ASCENSEUR_LIBRE;
+ }break;
+ case c ('P',6): { // parametrage
+ ascenseur_min_monte = args[0];
+ ascenseur_max_monte = args[1];
+ ascenseur_accel_monte = args[2];
+ ascenseur_min_descend = args[3];
+ ascenseur_max_descend = args[4];
+ ascenseur_accel_descend = args[5];
+ }break;
+ case c ('v',1): {
+ ventouse = args[0];
+ PORTB |= _BV (1);
+ }break;
default:
- proto_send0 ('?');
+ proto_send0 ('?');
}
proto_send (cmd, size, args);
}