From f63437ec75cad6e72bc2d8197b3244be25bc0bfa Mon Sep 17 00:00:00 2001 From: lambert Date: Mon, 15 May 2006 22:08:33 +0000 Subject: dje fait chier, il veux que je commit, donc voila ce qui marche : interruptions sont detectees les vitesses de turbines et moteurs + sens changent a faire : gerer les rebond et continuer les tests demain bonne nuit --- n/es-2006/src/barillet.c | 233 +++++++++++++++++++++++++++++------------------ n/es-2006/src/barillet.h | 15 ++- n/es-2006/src/main.c | 28 +++++- 3 files changed, 177 insertions(+), 99 deletions(-) (limited to 'n') diff --git a/n/es-2006/src/barillet.c b/n/es-2006/src/barillet.c index 8e4c03a..fd3eb20 100644 --- a/n/es-2006/src/barillet.c +++ b/n/es-2006/src/barillet.c @@ -28,6 +28,7 @@ #include "modules/utils/utils.h" #include "common.h" #include "io.h" +#include "modules/proto/proto.h" /* utilisation de OCR1A pour le moteur barillet OCR1B pour la turbine 1 => avant @@ -52,25 +53,31 @@ #define TERMINE 0 #define EN_COURS 1 - +/* XXX XXX passer en 16 bits */ /* vitesse de rotation maximale du barillet */ -#define VITESSE_BAR_MAX_ 0xA0 /* XXX a etalonner */ +#define VITESSE_BAR_MAX_ 0x03FF /* vitesse de rotation minimale du barillet */ -#define VITESSE_BAR_MIN_ 0x10 /* XXX a etalonner */ +#define VITESSE_BAR_MIN_ 0xA0 /* XXX a etalonner */ /* vitesse de rotation maximale des turbines */ -#define VITESSE_TURB_MAX_ 0x70 /* XXX a etalonner */ +#define VITESSE_TURB_MAX_ 0x0333 /* vitesse de rotation minimale des turbines */ -#define VITESSE_TURB_MIN_ 0x10 /* XXX a etalonner */ +#define VITESSE_TURB_MIN_ 0xA0 /* XXX a etalonner */ /* delai d'une µs pour la carte puissance */ #define DELAY_ 1 +/* define de l'etat_en_cours_ */ +#define SLEEP_ 0 // etat d'attente que la PC104 nous dise GO +#define STAND_BY_ 1 +#define BARRIERE_AVANT_ACTIVEE_ 2 +#define EXTRACTION_DEPOT_ 3 +#define ROTATION_BARILLET_ 4 - - +/* varaible d'état_barillet */ +uint8_t etat_en_cours_; /* position relative au barillet */ volatile uint8_t pos_actuel_; @@ -86,15 +93,22 @@ volatile uint8_t compteur_timer_; /* etat de la rotation */ 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 extraite */ -volatile uint8_t inter_ar_; +/* variable indiquant que la balle est en cours d'extraction */ +volatile uint8_t extraire; -/* XXX variable globale avec le main */ +/* temp a la con pour initialiser la turbine avant a full pattate XXX sera mis dans le main des q ue le jack sera retirer */ +uint8_t gogogo; + +/*** 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 depose; +uint8_t depot; /* variable pour lancer une rotation */ uint8_t rotation; /* position du barillet a aller */ @@ -103,11 +117,11 @@ uint8_t pos_a_aller; /* fonctions static dans le fichier */ static void rotation_barillet( uint8_t pos_a_aller ); 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 vitesse_turbine( uint8_t turbine, uint8_t vitesse ); /* Initialisation pour tout ce qui concerne le barillet */ @@ -135,9 +149,10 @@ barillet_init (void) /* initialisation des entrees du port E pour les interruptions */ DDRE &= ~(_BV(7) | _BV(6) | _BV (5) | _BV (4)); + PORTE |= _BV(7) | _BV(6); /* mode PWM = 0 */ - OCR1A = 0; /* vitesse moteur barillet null */ + 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 ? @@ -148,8 +163,8 @@ barillet_init (void) // FIXME // il y a pas un _ à la fin ? Met en majuscule, ca sera plus // simple donc. - OCR1B = VITESSE_TURB_MAX_; /* vitesse turb av max */ - OCR1C = VITESSE_TURB_MIN_; /* vitesse turb ar min */ + OCR1B = 0; /* vitesse turb nulle */ + OCR1C = 0; /* vitesse turb nulle */ /* initialisation sens rotation */ PORTB &= ~_BV(4); @@ -157,81 +172,74 @@ barillet_init (void) /* interruption autorisees INT7 INT6 INT5 INT4 à chaque changement logique */ EICRB = regv ( ISC71, ISC70, ISC61, ISC60, ISC51, ISC50, ISC41, ISC40, - 1, 1, 1, 1, 0, 1, 0, 1); + 1, 0, 1, 0, 0, 1, 0, 1); EIFR |= _BV(7) | _BV(6) | _BV(5) | _BV(4); 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 + etat_en_cours_ = SLEEP_; } +/*************************** + * init quand le jack part * XXX changer le nom et gerer autrament + * *************************/ +void init_2_barillet(void) +{ + /* commencer a faire tourner les turbines */ + OCR1B = VITESSE_TURB_MAX_; + OCR1C = VITESSE_TURB_MIN_; + /* passer a l'etat suivant */ + etat_en_cours_ = STAND_BY_; +} -/***************************** - * fonction main du barillet * - * ***************************/ - -/* A la fin du main */ - -// if ( rotation != 1 ) -// -// { -// /* extraire une balle */ -// extraction = 1; - -// /* deposer une balle */ -// depose = 2; -// /* appel pour une rotation */ -// pos_a_aller = 4; -// rotation = 1; -// -// -// main_barillet(); -// } +/******************************** + * fonction appelee dans le main * + * ******************************/ -/* fonction principale du barillet a apeller a la fin de la boucle principale du main */ -void main_barillet(void) +/* fonction main barillet */ +void sequenceur_barillet() { - - /* rotation en cours */ - if ( rotation_en_cours_ == EN_COURS ) // XXX a faire dans le main, ce sera plus simple + ++compteur_timer_; + if ( ( rotation_en_cours_ == 0 ) && ( rotation == 1 ) ) { - /* ne rien faire dans cette fonction et attendre que le barillet est fini de tourner */ + etat_en_cours_ = ROTATION_BARILLET_; } - else if ( rotation == 1 ) + else if ( ( etat_inter_av_ == MONTEE ) && ( compteur_timer_ > 5 ) ) // XXX verifier le 5, est ce suffisant ? XXX la balle est elle montee depuis longtemps ? { - rotation_barillet( pos_a_aller ); + etat_en_cours_ = BARRIERE_AVANT_ACTIVEE_; } - /* fonction pour l'extraction d'une balle */ - else if ( inter_ar_ == MONTEE ) + else if ( ( etat_inter_ar_ == MONTEE ) || ( etat_inter_ar_ == DESCENTE ) || ( extraction == 1) || ( depot == 1 ) ) { - if ( compteur_timer_ == 5 ) - { - extraction_fin(); /* fin de l'extraction */ - } - } - else if ( extraction == EN_COURS ) - { - extraction_balle(); /* debut de l'extraction */ - } - else if ( depose == EN_COURS ) - { - depose_balle(); + etat_en_cours_ = EXTRACTION_DEPOT_; } - /* fonction pou la gestion d'une montee de balle a l'avant */ - else if ( etat_inter_av_ == MONTEE ) + switch(etat_en_cours_) { - if ( compteur_timer_ == 5 ) - { + case SLEEP_ : + break; // XXX cette partie sera gerer autrement quand le main 'es' sera finie + case STAND_BY_ : + break; + case BARRIERE_AVANT_ACTIVEE_ : new_balle(); - } + break; + case EXTRACTION_DEPOT_ : + extraction_depot(); + break; + case ROTATION_BARILLET_ : + rotation_barillet(pos_a_aller); + break; + default : break; } -} +} + + + /* ********************** @@ -258,8 +266,8 @@ void rotation_barillet( uint8_t pos_a_aller ) vitesse_turbine ( 1,VITESSE_TURB_MIN_); /* tourner le barillet */ rotation_en_cours_ = EN_COURS; - if ( ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) < 4 ) || - ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) > 36 ) ) + if ( ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) < 5 ) || + ( ( ( 40 + pos_actuel_ - pos_final_) % 40 ) > 35 ) ) { OCR1A = VITESSE_BAR_MIN_; } @@ -267,6 +275,7 @@ void rotation_barillet( uint8_t pos_a_aller ) { OCR1A = VITESSE_BAR_MAX_; } + etat_en_cours_ = STAND_BY_; } /* gestion de la position du barillet */ @@ -313,8 +322,9 @@ void pos_bar(void) { OCR1A = 0; rotation_en_cours_ = TERMINE; + rotation_local_ = TERMINE; vitesse_turbine ( 1, VITESSE_BAR_MAX_); - rotation = 0; + rotation = TERMINE; } pos_prec_ = pos_temp_; @@ -324,8 +334,7 @@ void pos_bar(void) /************************************** * CHANGEMENT DE VITESSE DES TURBINES * **************************************/ -static void -vitesse_turbine(uint8_t turbine, uint8_t vitesse) +void vitesse_turbine(uint8_t turbine, uint16_t vitesse) { if ( turbine == 1 ) { @@ -335,23 +344,57 @@ vitesse_turbine(uint8_t turbine, uint8_t vitesse) { OCR1C = vitesse; } + else if ( turbine == 3 ) // moteur barillet + { + OCR1A = vitesse; + } } +/**** changement de sens ****/ +void sens(uint8_t sens_rotat) +{ + if ( sens_rotat == 0 ) + { + PORTB |= _BV(4); + } + else if ( sens_rotat == 1 ) + { + PORTB &= ~_BV(4); + } +} + +/* ****************************** + * EXTRACTION ET DEPOT DE BALLE * + * ******************************/ -/* ********************* - * EXTRACTION DE BALLE * - * *********************/ +void extraction_depot(void) +{ + 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) { - /* mode extraction */ - etat_inter_ar_ = MONTEE; /* Ralentir la turbine avant */ vitesse_turbine( 1, VITESSE_TURB_MIN_); /* Vitesse max de la turbine arriere */ vitesse_turbine( 2, VITESSE_TURB_MAX_); + extraire = EN_COURS; } /* fin d'extration de balle a appeller si extraction_balle =1 et interrupt arriere =1 */ @@ -361,22 +404,20 @@ void extraction_fin(void) vitesse_turbine( 2, 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_; } - - - -/****************** - * DEPOT DE BALLE * - * ****************/ - /* deposer une balle dans un trou apres rotation */ void depose_balle(void) { /* attente de l'interruption */ etat_inter_ar_ = DESCENTE; /* vitesse turbine arriere nulle */ - vitesse_turbine( 2, 0); + vitesse_turbine( 1, 0); } @@ -399,7 +440,7 @@ void new_balle(void) /* 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; + etat_inter_av_ = DESCENTE; //interruption terminee } } @@ -413,28 +454,36 @@ void new_balle(void) /* interruption fourche optique turbine avant */ SIGNAL ( SIG_INTERRUPT6 ) { - etat_inter_av_ = MONTEE; - compteur_timer_ = 0; +/* + if(etat_en_cours_ == STAND_BY_) + { + etat_inter_av_ = MONTEE; + compteur_timer_ = 0; + } +*/ + proto_send0('A'); } /* interruption fourche optique turbine arriere */ -/* XXX attention car l'interruption est rapide et le barillet va commencer à tourner avant que - * la balle soit arrivé */ SIGNAL ( SIG_INTERRUPT7 ) { - if ( etat_inter_ar_ == MONTEE ) +#if 0 + if ( extraire == EN_COURS ) { - inter_ar_ = MONTEE; + etat_inter_ar_ = MONTEE; compteur_timer_ = 0; } else if ( etat_inter_ar_ == DESCENTE ) { /* remettre la vitesse turbine a min */ - vitesse_turbine( 2, VITESSE_TURB_MIN_); + vitesse_turbine( 1, VITESSE_TURB_MIN_); /* XXX verifier que la balle ne remonte pas */ /* XXX mettre une variable pour dire : OK, on peut avancer ??*/ } + // sinon c'est que la barriere s'est déclanché dans un cas non voulu +#endif + proto_send0('B'); } @@ -451,3 +500,5 @@ SIGNAL ( SIG_INTERRUPT4 ) pos_bar(); } +/* XXX XXX XXX XXX gerer pb des rebond dans les iterruptions pour les barrieres optiques */ + diff --git a/n/es-2006/src/barillet.h b/n/es-2006/src/barillet.h index defae26..bdba150 100644 --- a/n/es-2006/src/barillet.h +++ b/n/es-2006/src/barillet.h @@ -32,20 +32,27 @@ 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 depose; +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); +/* fonction d'initialisation 2 */ +void init_2_barillet(void); + +/* changement de vitesse turbine */ +void vitesse_turbine(uint8_t num_turb, uint16_t vitesse); + +/* changement de sens */ +void sens( uint8_t sens_rotat ); + /* fonction main de la gestion du barillet */ -void main_barillet(void); +void sequenceur_barillet(void); #endif diff --git a/n/es-2006/src/main.c b/n/es-2006/src/main.c index 44c0c30..8edfb78 100644 --- a/n/es-2006/src/main.c +++ b/n/es-2006/src/main.c @@ -112,10 +112,28 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) // case c ('j', 0 ): // proto_send1b('j', others_jack()); // break; + + +/* tests primaires pour le barillet */ + case c('v',3): + temp_16b = v8_to_v16 (args[1], args[2]); + vitesse_turbine( args[0], temp_16b); + break; + + case c('m',1): + sens(args[0]); + break; - /* deposer une balle dans le barillet */ +/* tests plus complexes de la gestion du barillet */ + + /* bon on commence - le jack est parti */ + case c ('g', 0): + init_2_barillet(); // le nom est mal choisi, mais cette fonction sera gerer autrement quand le main sera fini + break; + + /* deposer une balle du barillet */ case c ('d', 0): - depose = 1; + depot = 1; break; /* extraire une balle */ @@ -128,8 +146,6 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) rotation = 1; pos_a_aller = args[0]; break; - - /* Unknown commands */ default: @@ -201,6 +217,10 @@ main (void) /* Update RVB sensors data. */ sensor_rvb_start_capture (); + /* gestion du barilet */ + sequenceur_barillet(); + + /* Get data for serial port */ while (uart0_poll ()) proto_accept (uart0_getc ()); -- cgit v1.2.3