From 9649abd1d9917217b27f437c7aec641a2c78393a Mon Sep 17 00:00:00 2001 From: lambert Date: Sat, 20 May 2006 19:05:54 +0000 Subject: ES (Barillet) : - ajout des modifications (changement dans la gestion de la machine à états, ...). --- n/es-2006/src/barillet.c | 382 ++++++++++++++++++++++++----------------------- n/es-2006/src/barillet.h | 20 ++- n/es-2006/src/main.c | 7 +- 3 files changed, 209 insertions(+), 200 deletions(-) (limited to 'n') diff --git a/n/es-2006/src/barillet.c b/n/es-2006/src/barillet.c index 6f0813e..22b7ced 100644 --- a/n/es-2006/src/barillet.c +++ b/n/es-2006/src/barillet.c @@ -45,20 +45,12 @@ /* XXX verifier que les turbines sont en vitesse lente si inutilisé */ /* XXX verifier que le sens de rotation du barillet est 0 si inutilisé */ - -/* etat pour l'interruption fourche optique montee de balle arriere */ -#define MONTEE 1 -#define DESCENTE 0 - -#define TERMINE 0 -#define EN_COURS 1 - /* XXX XXX passer en 16 bits */ /* vitesse de rotation maximale du barillet */ -#define VITESSE_BAR_MAX_ 0x015F +#define VITESSE_BAR_MAX_ 0x03FF /* vitesse de rotation minimale du barillet */ -#define VITESSE_BAR_MIN_ 0xA0 /* XXX a etalonner */ +#define VITESSE_BAR_MIN_ 0x1FF /* XXX a etalonner */ /* vitesse de rotation maximale des turbines */ #define VITESSE_TURB_MAX_ 0x0333 @@ -70,14 +62,24 @@ #define DELAY_ 1 /* define de l'etat_en_cours_ */ -#define SLEEP_ 0 // etat d'attente que la PC104 nous dise GO +#define SLEEP_ 0 #define STAND_BY_ 1 -#define BARRIERE_AVANT_ACTIVEE_ 2 -#define EXTRACTION_DEPOT_ 3 -#define ROTATION_BARILLET_ 4 -#define ROTATION_EN_COURS_ 5 - -/* varaible d'état_barillet */ +#define BALLE_AVALE_ATTENTE 2 +#define BALLE_AVALEE 3 +#define TOURNE_ANALYSE_BALLE 4 +#define ANALYSE_BALLE 5 +#define ROTATION 6 +#define ROTATION_EN_COURS 7 +#define EXTRACTION 8 +#define EXTRACTION_EN_COURS 9 +#define EXTRACTION_EN_HAUT 10 +#define DEPOT 11 +#define DEPOT_EN_COURS 12 +#define DEPOT_FIN 13 + + + +/* variable d'état_barillet */ volatile uint8_t etat_en_cours_; /*XXX XXX variable de debug pour la rotation barillet */ @@ -87,46 +89,30 @@ volatile uint8_t pos_temp_; volatile uint8_t pos_actuel_; volatile uint8_t pos_prec_; volatile uint8_t pos_final_; +volatile uint8_t pos_lenteur_; /* etat d'attente pour l'interruption fourche optique */ volatile uint8_t etat_inter_ar_; /* fourche arriere */ volatile uint8_t etat_inter_av_; /* fourche avant */ -/* variable pour le delay aspiration */ -volatile uint8_t compteur_timer_; - -/* etat de la rotation */ -volatile uint8_t rotation_en_cours_; -uint8_t rotation_local_; - -/* position a aller pour une rotation local */ -uint8_t pos_a_aller_; - -/* variable indiquant que la balle est en cours d'extraction */ -volatile uint8_t extraire; +/* variable d'attente pour que la balle soit completemebnt montee dnas le barillet */ +volatile uint8_t attente; /* variable gerant le pb de rebond dans les interruptions */ volatile uint8_t rebond_inter_ar; volatile uint8_t rebond_inter_av; -/*** variable globale avec le main ***/ -/* variable indiquant qu'il faut faire une extraction de balle */ -uint8_t extraction; -/* variable indiquant que l'on depose une balle, on attend que la barriere optique voit la balle passee */ -uint8_t depot; -/* variable pour lancer une rotation */ -uint8_t rotation; /* position du barillet a aller */ -uint8_t pos_a_aller; +uint8_t pos_a_aller_; /* fonctions static dans le fichier */ -static void rotation_barillet( uint8_t pos_a_aller ); +static void rotation_barillet( void ); static void pos_bar(void); -static void extraction_depot(void); static void extraction_balle(void); static void extraction_fin(void); static void new_balle(void); static void depose_balle(void); +static void depot_fin(void); /* Initialisation pour tout ce qui concerne le barillet */ @@ -159,15 +145,7 @@ barillet_init (void) /* mode PWM = 0 */ OCR1A = 0; /* vitesse moteur barillet nulle */ utils_delay_us ( DELAY_ ); /* attente d'1 µs pour la puiss_barillet */ - // FIXME - // 1µs ok, mais fait pas appel à delay_ms non ? - // Passe aussi ton 1 en define, histoire que si tu veuilles le changer, - // ca ne soit pas trop galère. Voir meme une fonction inline qui - // appelle que le utils_delay_ms, enfin on verra après. - // FIXME - // il y a pas un _ à la fin ? Met en majuscule, ca sera plus - // simple donc. OCR1B = 0; /* vitesse turb nulle */ OCR1C = 0; /* vitesse turb nulle */ @@ -183,21 +161,17 @@ barillet_init (void) EIMSK |= _BV(7) | _BV(6) | _BV(5) | _BV(4); /* initialisation de la position du barillet */ - pos_prec_ = 0; // XXX penser a mettre le barillet avec un trou vers l'avant du robot XXX - pos_temp_ = 0; - pos_a_aller = 0; + // XXX penser a mettre le barillet avec un trou vers l'avant du robot XXX + pos_prec_ = ( PINE >> 4) & 3; // 00 00 00 XX + pos_temp_ = pos_prec_; + pos_a_aller_ = 0; pos_actuel_ = 0; pos_final_ = 0; + pos_lenteur_ = 0; etat_en_cours_ = SLEEP_; - rotation = 0; - rotation_en_cours_ = 0; - rotation_local_ = 0; - compteur_timer_ = 0; - extraction = 0; - depot = 0; rebond_inter_av = 0; rebond_inter_ar = 0; - + attente = 0; } @@ -215,51 +189,85 @@ void init_2_barillet(void) } + + /******************************** * fonction appelee dans le main * * ******************************/ +/* demande de rotation */ +void rotation( uint8_t pos_fin ) +{ + pos_a_aller_ = pos_fin; + if ( etat_en_cours_ == STAND_BY_ ) + { + etat_en_cours_ = ROTATION; + } +} +/* demande d'extraction */ +void extraction ( void ) +{ + if ( etat_en_cours_ == STAND_BY_ ) + { + etat_en_cours_ = EXTRACTION; + } +} +/* demande de depot */ +void depot_balle ( void ) +{ + if ( etat_en_cours_ == STAND_BY_ ) + { + etat_en_cours_ = DEPOT; + } +} /* fonction main barillet */ void sequenceur_barillet() { - if ( etat_en_cours_ != SLEEP_ ) + static uint8_t old_pos_actuel = 0; + if (old_pos_actuel != pos_actuel_) { - ++compteur_timer_; - if ( etat_en_cours_ == ROTATION_EN_COURS_ ) - { - //ne rien faire - proto_send1b ('f', pos_temp_); // affichage de pos_temp_ et pos_actuel_ - } - else if ( ( rotation_en_cours_ == 0 ) && ( rotation == 1 ) ) - { - etat_en_cours_ = ROTATION_BARILLET_; - } - else if ( ( etat_inter_av_ == MONTEE ) && ( compteur_timer_ > 5 ) ) // XXX verifier le 5, est ce suffisant ? XXX la balle est elle montee depuis longtemps ? - { - etat_en_cours_ = BARRIERE_AVANT_ACTIVEE_; - } - else if ( ( etat_inter_ar_ == MONTEE ) || ( etat_inter_ar_ == DESCENTE ) || ( extraction == 1) || ( depot == 1 ) ) - { - etat_en_cours_ = EXTRACTION_DEPOT_; - } + proto_send2b('W', pos_actuel_, pos_temp_); + old_pos_actuel = pos_actuel_; } switch(etat_en_cours_) { case SLEEP_ : - break; // XXX cette partie sera gerer autrement quand le main 'es' sera finie + break; case STAND_BY_ : break; - case BARRIERE_AVANT_ACTIVEE_ : + case BALLE_AVALE_ATTENTE : new_balle(); break; - case EXTRACTION_DEPOT_ : - extraction_depot(); + case TOURNE_ANALYSE_BALLE : + // faire une rotation pour checker la couleur + rotation_barillet( ); break; - case ROTATION_BARILLET_ : - rotation_barillet(pos_a_aller); + case ANALYSE_BALLE : + // lancer la fonction pour l'analyse balle + break; + case ROTATION : + //appel de la fonction rotation_barillet + rotation_barillet(); + break; + case ROTATION_EN_COURS : + break; + case EXTRACTION : + //debut de l'extraction + extraction_balle(); + break; + case EXTRACTION_EN_COURS : + break; + case EXTRACTION_EN_HAUT : + extraction_fin(); break; - case ROTATION_EN_COURS_ : + case DEPOT : + depose_balle(); + break; + case DEPOT_EN_COURS : + break; + case DEPOT_FIN : + depot_fin(); break; default : break; } @@ -272,36 +280,47 @@ void sequenceur_barillet() /* ********************** * ROTATION DU BARILLET * * **********************/ -void rotation_barillet( uint8_t pos_a_aller ) +void rotation_barillet(void) { - /* initialisation pour la rotation */ - pos_final_ = ( pos_a_aller * 4 ); + uint8_t dist_trigo, dist_pas_trigo; + pos_final_ = pos_a_aller_; - /* affecter le bon sens de rotation */ -/* if ( ( ( ( (40 + pos_actuel_ - pos_final_) % 40 ) >= 10 && ( pos_final_ < 10 ) ) ) || - ( ( ( (40 + pos_actuel_ - pos_final_) % 40 ) < 10 && ( pos_final_ > 10 ) ) ) ) + if (pos_final_ != pos_actuel_) { - PORTB &= ~_BV(4); + /* affecter le bon sens de rotation */ + dist_trigo = (40 + pos_final_ - pos_actuel_) % 40; + dist_pas_trigo = (40 + pos_actuel_ - pos_final_) % 40; + + if ( dist_trigo < dist_pas_trigo ) + { + PORTB &= ~_BV(4); + pos_lenteur_ = (pos_final_ + (40 - 2)) % 40; + } + else + { + PORTB |= _BV(4); + pos_lenteur_ = (pos_final_ + 2) % 40; + } utils_delay_us ( DELAY_ ); + + vitesse_turbine ( 1,VITESSE_TURB_MIN_); + vitesse_turbine ( 2,VITESSE_TURB_MIN_); + + /* affectation de la vitesse du barillet */ + if ( ( dist_pas_trigo < 4 ) || ( dist_trigo < 4 ) ) + { + OCR1A = VITESSE_BAR_MIN_; + } + else + { + OCR1A = VITESSE_BAR_MAX_; + } + etat_en_cours_ = ROTATION_EN_COURS; } - else // ( pos_final < 20 ) + else { - PORTB |= _BV(4); - utils_delay_us ( DELAY_ ); + etat_en_cours_ = STAND_BY_; } -*/ - vitesse_turbine ( 1,VITESSE_TURB_MIN_); - /* tourner le barillet */ -// if ( ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) < 5 ) || -// ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) > 35 ) ) -// { -// OCR1A = VITESSE_BAR_MIN_; -// } -// else -// { - OCR1A = VITESSE_BAR_MAX_; -// } - etat_en_cours_ = ROTATION_EN_COURS_; } /* gestion de la position du barillet */ @@ -314,7 +333,6 @@ void pos_bar(void) pos_temp_ = ( PINE >> 4) & 3; // 00 00 00 XX pos_conc_ = ( pos_temp_ << 2 ) | pos_prec_; - etat_en_cours_ = ROTATION_EN_COURS_; switch ( pos_conc_ ) { // actu pres @@ -322,11 +340,11 @@ void pos_bar(void) case 7 : // 01 11 case 8 : // 10 00 case 14 : // 11 10 - --pos_actuel_; - if ( pos_actuel_ < 0 ) + if ( pos_actuel_ == 0 ) { - pos_actuel_ = 40 + pos_actuel_; + pos_actuel_ = 40; } + --pos_actuel_; break; case 2 : // 00 10 case 4 : // 01 00 @@ -342,22 +360,16 @@ void pos_bar(void) break; } -// if ( ( pos_temp_ == 3 ) && ( pos_actuel_ == pos_final_ ) ) - if ( pos_actuel_ == ( pos_final_ - 2 )) // +/- + if ( pos_actuel_ == pos_lenteur_ ) { - OCR1A = 0; + OCR1A = VITESSE_BAR_MIN_; } - -/* if ( ( pos_actuel_ == pos_final_ ) && ( pos_actuel_ == 3 ) ) + else if ( pos_actuel_ == pos_final_ ) { OCR1A = 0; - rotation_en_cours_ = TERMINE; - rotation_local_ = TERMINE; - vitesse_turbine ( 1, VITESSE_BAR_MAX_); - rotation = TERMINE; + vitesse_turbine ( 1, VITESSE_TURB_MAX_); /* XXX a changer, il faut attendre que la PC104 nous disent : ok tu peux remettre le ventillo avant a fond, donc ce sera pas a mettre ici*/ etat_en_cours_ = STAND_BY_; } -*/ pos_prec_ = pos_temp_; } @@ -399,60 +411,67 @@ void sens(uint8_t sens_rotat) * EXTRACTION ET DEPOT DE BALLE * * ******************************/ -void extraction_depot(void) -{ - rebond_inter_av = 0; - rebond_inter_ar = 0; - if ( extraction == 1 ) - { - if ( extraire == TERMINE ) // debut de l'extraction - { - extraction_balle(); - } - else // fin de l'extraction - { - extraction_fin(); - } - } - else if ( depot == 1 ) - { - depose_balle(); - } -} - /* Si balle dans trou => Extraction */ void extraction_balle(void) { + rebond_inter_ar = 0; /* Ralentir la turbine avant */ - vitesse_turbine( 2, VITESSE_TURB_MIN_); + vitesse_turbine( 1, VITESSE_TURB_MIN_); /* Vitesse max de la turbine arriere */ - vitesse_turbine( 1, VITESSE_TURB_MAX_); - extraire = EN_COURS; + vitesse_turbine( 2, VITESSE_TURB_MAX_); + + etat_en_cours_ = EXTRACTION_EN_COURS; } -/* fin d'extration de balle a appeller si extraction_balle =1 et interrupt arriere =1 */ +/* fin d'extration de balle */ void extraction_fin(void) { - /* Ralentir la vitesse de la turbine arriere pour la rotation */ - vitesse_turbine( 1, VITESSE_TURB_MIN_); - /* fin d'extraction */ - extraction = TERMINE; - extraire = TERMINE; - /* rotation local */ - pos_a_aller_ = ( pos_prec_ + 2) % 10; - rotation_local_ = EN_COURS; - etat_en_cours_ = ROTATION_BARILLET_; + if ( (PINE & 128 ) == 0 ) /* le Port E bit 7 est a 0 => plus de balle devant la barriere optique */ + { + ++attente; + /* attendre que la balle soit bien montee */ + if ( attente >= 10 ) + { + rebond_inter_ar = 0; + vitesse_turbine( 2, VITESSE_TURB_MIN_); + /* fin d'extraction - faire la rotation */ + pos_a_aller_ = ( 40 + pos_actuel_ + 8 ) % 40; + etat_en_cours_ = TOURNE_ANALYSE_BALLE; + } + } + else + { + // XXX que faire ??? + } } /* deposer une balle dans un trou apres rotation */ void depose_balle(void) { - /* attente de l'interruption */ - etat_inter_ar_ = DESCENTE; + rebond_inter_ar = 0; /* vitesse turbine arriere nulle */ vitesse_turbine( 2, 0); + etat_en_cours_ = DEPOT_EN_COURS; +} +/* fin de la depose de balle */ +void depot_fin(void) +{ + if ( (PINE & 128 ) == 0 ) /* le Port E bit 6 est a 0 => plus de balle devant la barriere optique */ + { + ++attente; + /* attendre que la balle soit bien montee */ + if ( attente >= 10 ) + { + etat_inter_ar_ = 0; + vitesse_turbine( 2, VITESSE_BAR_MIN_); + etat_en_cours_ = STAND_BY_; + } + } + else + { + /* XXX que faire */ + } } - /* *********************** @@ -460,20 +479,17 @@ void depose_balle(void) * ***********************/ void new_balle(void) { - /* baisser la vitesse de la turbine */ - OCR1B = VITESSE_TURB_MIN_; if ( (PINE & 64 ) == 0 ) /* le Port E bit 6 est a 0 => plus de balle devant la barriere optique */ { - /* faire tourner le barillet pour voir la couleur */ - rotation_barillet( pos_prec_ + 8 ); - - } - else if ( rotation_en_cours_ == TERMINE ) - { - /* XXX appel de la fonction pour lire la couleur de la balle */ - - /* ca y'ai, on a fini, remettre la variable etat_inter_av_ a 0 */ - etat_inter_av_ = DESCENTE; //interruption terminee + ++attente; + /* attendre que la balle soit bien montee */ + if ( attente >= 10 ) + { + rebond_inter_av = 0; + /* faire tourner le barillet pour voir la couleur */ + pos_a_aller_ = ( 40 + pos_actuel_ + 8 ) % 40; + etat_en_cours_ = TOURNE_ANALYSE_BALLE; + } } } @@ -491,13 +507,12 @@ SIGNAL ( SIG_INTERRUPT6 ) { if ( rebond_inter_av == 0 ) { - if(etat_en_cours_ == STAND_BY_) - { - etat_inter_av_ = MONTEE; - compteur_timer_ = 0; - } + rebond_inter_av == 1; + OCR1B = VITESSE_TURB_MIN_; + attente = 0; + etat_en_cours_ = BALLE_AVALE_ATTENTE; + //proto_send0('A'); } - //proto_send0('A'); } } @@ -508,21 +523,19 @@ SIGNAL ( SIG_INTERRUPT7 ) { if ( rebond_inter_ar == 0 ) { + attente = 0; rebond_inter_ar = 1; - if ( extraire == EN_COURS ) + if ( etat_en_cours_ == EXTRACTION_EN_COURS ) { - etat_inter_ar_ = MONTEE; - compteur_timer_ = 0; + etat_en_cours_ = EXTRACTION_EN_HAUT; } - else if ( etat_inter_ar_ == DESCENTE ) + else if ( etat_en_cours_ == DEPOT_EN_COURS ) { /* remettre la vitesse turbine a min */ - vitesse_turbine( 1, VITESSE_TURB_MIN_); + vitesse_turbine( 2, VITESSE_TURB_MIN_); /* XXX verifier que la balle ne remonte pas */ - - /* XXX mettre une variable pour dire : OK, on peut avancer ??*/ + etat_en_cours_ = DEPOT_FIN; } - // sinon c'est que la barriere s'est déclanché dans un cas non voulu //proto_send0('B'); } } @@ -550,5 +563,4 @@ SIGNAL ( SIG_INTERRUPT4 ) } } -/* XXX XXX XXX XXX gerer pb des rebond dans les iterruptions pour les barrieres optiques */ - +/* XXX dans la PC104, apres un depot, il faudra remmetre le barillet dans une des positions 00, 08, 10, 18, 20 ( position exa ) */ diff --git a/n/es-2006/src/barillet.h b/n/es-2006/src/barillet.h index bdba150..5f67d60 100644 --- a/n/es-2006/src/barillet.h +++ b/n/es-2006/src/barillet.h @@ -28,17 +28,6 @@ #include "common.h" -/* variable globale avec le main */ - -extern uint8_t extraction; -/* variable indiquant que l'on depose une balle, on attend que la barriere optique voit la balle passee */ -extern uint8_t depot; -/* variable pour lancer une rotation */ -extern uint8_t rotation; -/* position du barillet a aller */ -extern uint8_t pos_a_aller; - - /* fonction d'initialisation */ void barillet_init(void); @@ -54,5 +43,14 @@ void sens( uint8_t sens_rotat ); /* fonction main de la gestion du barillet */ void sequenceur_barillet(void); +/* fonction pour setter une rotation */ +void rotation(uint8_t pos_fin); + +/* fonction pour setter une extraction */ +void extraction(void); + +/* fonction pour setter un depot de balle */ +void depot_balle(void); + #endif diff --git a/n/es-2006/src/main.c b/n/es-2006/src/main.c index ceb07d9..fdab030 100644 --- a/n/es-2006/src/main.c +++ b/n/es-2006/src/main.c @@ -132,18 +132,17 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) /* deposer une balle du barillet */ case c ('d', 0): - depot = 1; + depot_balle(); break; /* extraire une balle */ case c ('e', 0): - extraction = 1; + extraction(); break; /* rotation du barillet */ case c ('t', 1): - rotation = 1; - pos_a_aller = args[0]; + rotation(args[0]); break; /* Unknown commands */ -- cgit v1.2.3