From 9f5a860dd57faab7e3d8e7915a373de1f26cc611 Mon Sep 17 00:00:00 2001 From: burg Date: Fri, 29 Apr 2005 23:44:43 +0000 Subject: Mise en commentaire du STuFF à Snayle qui compile pas pour la gestion des fromages Gestion de l'ascenseur avec un automate d'état. Epuration du protocole de commande. --- n/es/src/ascenseur.c | 133 ++++++++++++++++++++++++++++----------------------- n/es/src/ascenseur.h | 16 +++---- n/es/src/main.c | 89 +++++++++++++++++----------------- 3 files changed, 125 insertions(+), 113 deletions(-) diff --git a/n/es/src/ascenseur.c b/n/es/src/ascenseur.c index 0cbe866..964ca41 100644 --- a/n/es/src/ascenseur.c +++ b/n/es/src/ascenseur.c @@ -32,7 +32,7 @@ uint8_t ascenseur_vitesse_voulue; uint8_t ascenseur_vitesse; uint8_t ascenseur_min_monte = 0x20; -uint8_t ascenseur_max_monte = 0x03; +uint8_t ascenseur_max_monte = 0x05; uint8_t ascenseur_accel_monte = 1; uint8_t ascenseur_min_descend = 0x10; uint8_t ascenseur_max_descend = 0x01; @@ -40,7 +40,10 @@ uint8_t ascenseur_accel_descend = 1; uint8_t ascenseur_max; uint8_t ascenseur_min; uint8_t ascenseur_accel; -uint8_t ascenseur_state = ASCENSEUR_LIBRE; +uint8_t ascenseur_state = WAIT; +uint8_t asc_ordre; +uint8_t asc_message; + #define TC_STOP 0x00 #define TC_GO 0x1f /* mode CTC | OC2 | prescaler = 128. */ @@ -58,76 +61,86 @@ static uint8_t capteur_milieu(); static void asc_libre(void); static void ascenseur_update_vitesse (void); - void ascenseur_init () { TCCR2 = TC_STOP; + ascenseur_state = WAIT; + asc_libre(); } 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; + case CMD_Mgrande: // monter à vive allure + ascenseur_update_vitesse (); + asc_haut (ascenseur_vitesse); + asc_message = 255; + if (capteur_haut()) + ascenseur_state = CMD_Mpetite; + else + ascenseur_state = CMD_Mgrande; + break; + case CMD_Mpetite: // monter en réduisant la vitesse + ascenseur_vitesse_voulue = ascenseur_min; + ascenseur_update_vitesse (); + asc_haut (ascenseur_vitesse); + asc_message = 255; + if (capteur_bas()) + ascenseur_state = ERR; + else if (capteur_haut()) + ascenseur_state = CMD_Mpetite; + else + ascenseur_state = TENIR; + break; + case TENIR: // maintenir le mobile en haut + asc_stable(); + if (asc_message != 0) asc_message = 1; + if (capteur_bas()) + ascenseur_state = ERR; + else if (asc_ordre == 0x02) + { + ascenseur_state = CMD_D; + asc_ordre = 0; + } + else + ascenseur_state = TENIR; + break; + case CMD_D: // descente du mobile + ascenseur_vitesse_voulue = ascenseur_max; + ascenseur_update_vitesse (); + asc_bas (ascenseur_vitesse); + asc_message = 255; + if (!capteur_bas()) + ascenseur_state = CMD_D; + else + ascenseur_state = WAIT; + break; + case WAIT: // attente mobile normalement en bas + asc_libre(); + asc_message = 255; + if (capteur_bas() && (asc_ordre ==0x01 )) + { + ascenseur_state = CMD_Mgrande; + asc_ordre = 0; + } + else + ascenseur_state = WAIT; + break; + case ERR: // etat d'erreur + if (asc_message != 0) asc_message = 2; + asc_libre(); + if (capteur_bas() && (asc_ordre == 0x01)) + { + ascenseur_state = CMD_Mgrande; + asc_ordre = 0; + } + else + ascenseur_state = ERR; } } + static void ascenseur_update_vitesse (void) { diff --git a/n/es/src/ascenseur.h b/n/es/src/ascenseur.h index cf8ddac..31783c8 100644 --- a/n/es/src/ascenseur.h +++ b/n/es/src/ascenseur.h @@ -26,14 +26,12 @@ #include -#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 +#define CMD_Mgrande 0 +#define CMD_Mpetite 1 +#define TENIR 2 +#define CMD_D 3 +#define WAIT 4 +#define ERR 5 extern uint8_t ascenseur_vitesse_voulue; extern uint8_t ascenseur_vitesse; @@ -47,6 +45,8 @@ extern uint8_t ascenseur_max; extern uint8_t ascenseur_min; extern uint8_t ascenseur_accel; extern uint8_t ascenseur_state; +extern uint8_t asc_ordre; +extern uint8_t asc_message; void ascenseur_init (); void ascenseur_update (); diff --git a/n/es/src/main.c b/n/es/src/main.c index 2394884..fc49dc7 100644 --- a/n/es/src/main.c +++ b/n/es/src/main.c @@ -136,27 +136,41 @@ int main (void) PORTB &= ~_BV (1); } } - - if (socle) // active les fonctions liées au socle. - { - adc_start (pin_socle1); // pin socle1 sélectionnée - while(!adc_checkf()){} - valeur_socle1 = adc_read(); - - adc_start (pin_socle2); // pin socle2 sélectionnée - while(!adc_checkf()){} - valeur_socle2 = adc_read(); - - nb_valeur_socle++; - if(valeur_socle1 > SEUIL_SOCLE || valeur_socle2 > SEUIL_SOCLE) tableau_socle[nb_valeur_socle & 15] = 1; - else tableau_socle[nb_valeur_socle & 15] = 0; - - - for(temp = 0; temp < 16 ;temp++) - valeur_socle = tableau_socle[temp]; - - twi_update ((uint8_t *) valeur >> 3) - } + switch(asc_message) /* Affiche les messages de retour de + l'ascenceur : + 1 ascenseur en haut en attente. + 2 ascenseur en bas mais suite à un + disfonctionement + 255 valeur réservée à la réactivation + du message (Ne pas utiliser ici) + */ + { + case 1 : proto_send0('T'); break; + case 2 : proto_send0('E'); break; + } + +// Stuff a Snayle qui compile pas :-( +// +// if (socle) // active les fonctions liées au socle. +// { +// adc_start (pin_socle1); // pin socle1 sélectionnée +// while(!adc_checkf()){} +// valeur_socle1 = adc_read(); +// +// adc_start (pin_socle2); // pin socle2 sélectionnée +// while(!adc_checkf()){} +// valeur_socle2 = adc_read(); +// +// nb_valeur_socle++; +// if(valeur_socle1 > SEUIL_SOCLE || valeur_socle2 > SEUIL_SOCLE) tableau_socle[nb_valeur_socle & 15] = 1; +// else tableau_socle[nb_valeur_socle & 15] = 0; +// +// +// for(temp = 0; temp < 16 ;temp++) +// valeur_socle = tableau_socle[temp]; +// +// twi_update ((uint8_t *) valeur >> 3) +// } } } @@ -195,7 +209,7 @@ void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args) ascenseur_accel = ascenseur_accel_monte; ascenseur_vitesse = ascenseur_min; ascenseur_vitesse_voulue = ascenseur_max; - ascenseur_state = ASCENSEUR_MONTE; + asc_ordre = 0x01; }break; case c ('d',0): { // ordre de descendre l'ascenseur @@ -206,30 +220,9 @@ void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args) ascenseur_accel = ascenseur_accel_descend; ascenseur_vitesse = ascenseur_min; ascenseur_vitesse_voulue = ascenseur_max; - ascenseur_state = ASCENSEUR_DESCEND; - }break; - - case c ('n',0): { // ordre de nilieuser l'ascenseur - etat = 1; - ascenseur = 1; - 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; + asc_ordre = 0x02; }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]; @@ -238,10 +231,16 @@ void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args) ascenseur_max_descend = args[4]; ascenseur_accel_descend = args[5]; }break; - case c ('v',1): { + case c ('v',1): { // ordre décrochage de la + // ventouse ventouse = args[0]; PORTB |= _BV (1); }break; + case c ('F',1): { + // reset du message de + // l'ascenseur. + asc_message = args[0]; + }break; default: proto_send0 ('?'); -- cgit v1.2.3