From c995c19c769f3584a6e103a3a6fe27afd5db0c05 Mon Sep 17 00:00:00 2001 From: burg Date: Sun, 24 Apr 2005 21:43:58 +0000 Subject: Refonte de l'ascenseur par Ni --- n/es/src/ascenseur.c | 151 ++++++++++++++++++++++++++++++++++++++++-------- n/es/src/ascenseur.h | 40 +++++++------ n/es/src/main.c | 159 +++++++++++++++++---------------------------------- 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: * }}} */ - #ifndef ascenseur_h #define ascenseur_h -#define CAPTEUR_BAS 0 -#define CAPTEUR_MILIEU 1 -#define CAPTEUR_HAUT 2 +#include -#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 +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); } -- cgit v1.2.3