From 6a74406e0532da33502c585774aa0ed38ae4aae1 Mon Sep 17 00:00:00 2001 From: lambert Date: Sun, 14 May 2006 07:23:06 +0000 Subject: 1er comit de la partie barillet pour test J'espere qu'on va rien cramer :) --- n/es-2006/src/barillet.c | 408 +++++++++++++++++++++++++++++++++-------------- n/es-2006/src/barillet.h | 23 ++- n/es-2006/src/main.c | 23 ++- n/es-2006/src/timer_1.c | 6 +- 4 files changed, 326 insertions(+), 134 deletions(-) (limited to 'n') diff --git a/n/es-2006/src/barillet.c b/n/es-2006/src/barillet.c index 96aad2a..8e4c03a 100644 --- a/n/es-2006/src/barillet.c +++ b/n/es-2006/src/barillet.c @@ -30,13 +30,13 @@ #include "io.h" /* utilisation de OCR1A pour le moteur barillet - OCR1B pour la turbine avant - OCR1C pour la turbine arriere + OCR1B pour la turbine 1 => avant + OCR1C pour la turbine 2 => arriere SIG_INTERRUPT7 pour la fourche montee de balle arriere SIG_INTERRUPT6 pour la fourche montee de balle avant - SIG_INTERRUPT5 pour la fourche barillet 1 - SIG_INTERRUPT4 pour la fourche barillet 2 + SIG_INTERRUPT5 pour la fourche barillet 1 => celle pres de la carte de puissance + SIG_INTERRUPT4 pour la fourche barillet 2 => celle pres de la carte de es-2006 */ @@ -46,8 +46,11 @@ /* etat pour l'interruption fourche optique montee de balle arriere */ -#define MONTEE 0 -#define DESCENTE 1 +#define MONTEE 1 +#define DESCENTE 0 + +#define TERMINE 0 +#define EN_COURS 1 /* vitesse de rotation maximale du barillet */ @@ -65,24 +68,46 @@ /* delai d'une µs pour la carte puissance */ #define DELAY_ 1 -/* compteur nombre de pas fourche barillet 1 */ -volatile uint8_t fourche_bar_1_; -/* compteur nombre de pas fourche barillet 2 */ -volatile uint8_t fourche_bar_2_; -/* sens de rotation du barillet */ -uint8_t sens_rotat_; -/* nb de pas que le barillet doit tourner */ -uint8_t nb_pas_bar_; -/* etat d'attente pour l'interruption fourche optique arriere */ -uint8_t etat_inter_ar_; +/* position relative au barillet */ +volatile uint8_t pos_actuel_; +uint8_t pos_prec_; +uint8_t pos_final_; + +/* etat d'attente pour l'interruption fourche optique */ +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 */ uint8_t rotation_en_cours_; +/* variable indiquant que la balle est extraite */ +volatile uint8_t inter_ar_; + +/* XXX 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; +/* variable pour lancer une rotation */ +uint8_t rotation; +/* position du barillet a aller */ +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_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 */ @@ -91,19 +116,19 @@ barillet_init (void) { /* initialisation des registres du timer 1 pour la PWM total*/ -/******************************* - * a inserer dans es_config * - * *****************************/ - - TCCR1A = - regv (COM1A1, COM1A0, COM1B1, COM1B0, COM1C1, COM1C0, WGM11, WGM10, - 1, 0, 1, 0, 1, 0, 1, 1); - - TCCR1B = - regv ( ICNC1, ICES1, 5, WGM13, WGM12, CS12, CS11, CS10, - 0, 0, 0, 0, 1, 0, 0, 1); - -/********************************/ +///******************************* +// * a inserer dans es_config * +// * *****************************/ +// +// TCCR1A = +// regv (COM1A1, COM1A0, COM1B1, COM1B0, COM1C1, COM1C0, WGM11, WGM10, +// 1, 0, 1, 0, 1, 0, 1, 1); +// +// TCCR1B = +// regv ( ICNC1, ICES1, 5, WGM13, WGM12, CS12, CS11, CS10, +// 0, 0, 0, 0, 1, 0, 0, 1); +// +///********************************/ /* initialisation des sorties sur le port B pour moteur et turbines */ DDRB |= _BV(7) | _BV(6) | _BV (5) | _BV (4); @@ -113,7 +138,7 @@ barillet_init (void) /* mode PWM = 0 */ OCR1A = 0; /* vitesse moteur barillet null */ - utils_delay_ms ( DELAY_ ); /* attente d'1 µs pour la puiss_barillet */ + 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, @@ -129,100 +154,283 @@ barillet_init (void) /* initialisation sens rotation */ PORTB &= ~_BV(4); - /* interruption autorisees INT7 INT6 INT5 INT4 sur front montant */ - // FIXME - // Je pense que 0xFF c'est mieux quand même ici. + /* interruption autorisees INT7 INT6 INT5 INT4 à chaque changement logique */ EICRB = regv ( ISC71, ISC70, ISC61, ISC60, ISC51, ISC50, ISC41, ISC40, - 1, 1, 1, 1, 1, 1, 1, 1); + 1, 1, 1, 1, 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 } -/* fonction de rotation du barillet */ -inline void -rotation_barillet( uint8_t nb_pas, uint8_t sens ) + + + +/***************************** + * 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 principale du barillet a apeller a la fin de la boucle principale du main */ +void main_barillet(void) { - if ( rotation_en_cours_ == 1 ) + + /* rotation en cours */ + if ( rotation_en_cours_ == EN_COURS ) // XXX a faire dans le main, ce sera plus simple { - /* XXX mettre une methode pour attendre sans bloquer les interruptions */ - /* Possibilite de le mettre dans le main, mais pb pour l'interrupt montee_balle_av sauf si on met tout dans le main et juste une variable dans l'interrupt */ + /* ne rien faire dans cette fonction et attendre que le barillet est fini de tourner */ } - else + else if ( rotation == 1 ) { - /* initialisation pour la rotation */ - fourche_bar_1_ = 0; - fourche_bar_2_ = 0; - nb_pas_bar_ = nb_pas; + rotation_barillet( pos_a_aller ); + } + /* fonction pour l'extraction d'une balle */ + else if ( inter_ar_ == MONTEE ) + { + 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(); + } - /* affecter le bon sens de rotation */ - if ( sens ) + /* fonction pou la gestion d'une montee de balle a l'avant */ + else if ( etat_inter_av_ == MONTEE ) + { + if ( compteur_timer_ == 5 ) { - sens_rotat_ = 1; - utils_delay_ms ( DELAY_ ); /* XXX XXX pb si appel de la fonction dans l'une des interrupt XXX XXX */ + new_balle(); } - - /* tourner le barillet-les interruptions feront le reste */ - rotation_en_cours_ = 1; + } +} + + +/* ********************** + * ROTATION DU BARILLET * + * **********************/ +void rotation_barillet( uint8_t pos_a_aller ) +{ + /* initialisation pour la rotation */ + pos_final_ = ( pos_a_aller * 4 ); + + /* affecter le bon sens de rotation */ + if ( ( ( ( (40 + pos_actuel_ - pos_final_) % 40 ) >= 20 && ( pos_final_ < 20 ) ) ) || + ( ( ( (40 + pos_actuel_ - pos_final_) % 40 ) < 20 && ( pos_final_ > 20 ) ) ) ) + { + PORTB &= ~_BV(4); + utils_delay_us ( DELAY_ ); + } + else // ( pos_final < 20 ) + { + PORTB |= _BV(4); + utils_delay_us ( DELAY_ ); + } + + 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 ) ) + { + OCR1A = VITESSE_BAR_MIN_; + } + else + { OCR1A = VITESSE_BAR_MAX_; } } +/* gestion de la position du barillet */ +void pos_bar(void) +{ + uint8_t pos_conc_; + uint8_t pos_temp_; + + pos_temp_ = ( PINE >> 4) & 3; + pos_conc_ = ( pos_temp_ << 2 ) | pos_prec_; + + switch ( pos_conc_ ) + { + case 1 : // 00 01 + --pos_actuel_; + break; + case 2 : // 00 10 + ++pos_actuel_; + break; + case 4 : // 01 00 + ++pos_actuel_; + break; + case 7 : // 01 11 + --pos_actuel_; + break; + case 8 : // 10 00 + --pos_actuel_; + break; + case 11 : // 10 11 + ++pos_actuel_; + break; + case 13 : // 11 01 + ++pos_actuel_; + break; + case 14 : // 11 10 + --pos_actuel_; + break; + } + if ( ( ( 40 + pos_actuel_ - pos_final_ ) % 40 ) == 1 ) + { + OCR1A = VITESSE_BAR_MIN_; + } + else if ( ( ( 40 + pos_actuel_ - pos_final_ ) % 40 ) == 0 ) + { + OCR1A = 0; + rotation_en_cours_ = TERMINE; + vitesse_turbine ( 1, VITESSE_BAR_MAX_); + rotation = 0; + } + + pos_prec_ = pos_temp_; +} + + +/************************************** + * CHANGEMENT DE VITESSE DES TURBINES * + **************************************/ +static void +vitesse_turbine(uint8_t turbine, uint8_t vitesse) +{ + if ( turbine == 1 ) + { + OCR1B = vitesse; + } + else if ( turbine == 2 ) + { + OCR1C = vitesse; + } +} + + + +/* ********************* + * EXTRACTION DE BALLE * + * *********************/ + /* Si balle dans trou => Extraction */ -inline void -extraction_balle(void) +void extraction_balle(void) { + /* mode extraction */ + etat_inter_ar_ = MONTEE; /* Ralentir la turbine avant */ - OCR1B = VITESSE_TURB_MIN_; + vitesse_turbine( 1, VITESSE_TURB_MIN_); /* Vitesse max de la turbine arriere */ - OCR1C = VITESSE_TURB_MAX_; - /* attente de l'interruption */ - etat_inter_ar_ = MONTEE; + vitesse_turbine( 2, VITESSE_TURB_MAX_); } +/* fin d'extration de balle a appeller si extraction_balle =1 et interrupt arriere =1 */ +void extraction_fin(void) +{ + /* Ralentir la vitesse de la turbine arriere pour la rotation */ + vitesse_turbine( 2, VITESSE_TURB_MIN_); + /* fin d'extraction */ + extraction = TERMINE; +} + + + + +/****************** + * DEPOT DE BALLE * + * ****************/ /* deposer une balle dans un trou apres rotation */ -inline void -depose_balle(void) +void depose_balle(void) { - /* vitesse turbine arriere nulle */ - OCR1C = 0; /* attente de l'interruption */ etat_inter_ar_ = DESCENTE; + /* vitesse turbine arriere nulle */ + vitesse_turbine( 2, 0); } -/* interruption fourche optique turbine avant */ -SIGNAL ( SIG_INTERRUPT6 ) + +/* *********************** + * MONTEE DE BALLE AVANT * + * ***********************/ +void new_balle(void) { /* baisser la vitesse de la turbine */ OCR1B = VITESSE_TURB_MIN_; - /* XXX attendre qu'ilm n'y ia plus d'obstacle devant le capteur */ - /* check la fourche optique */ + 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; + } +} + + + - /* faire tourner le barillet pour voir la couleur */ - rotation_barillet( 2, 0 ); - /* regarder la couleur */ -// check_color /* XXX nom de la fonction a changer */ - /* renvoyer l'info a la PC104 */ +/* *************** + * INTERRUPTIONS * + * ***************/ + +/* interruption fourche optique turbine avant */ +SIGNAL ( SIG_INTERRUPT6 ) +{ + etat_inter_av_ = MONTEE; + compteur_timer_ = 0; } /* 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 ) { - /* Ralentir la vitesse de la turbine arriere pour la rotation */ - OCR1C = VITESSE_TURB_MIN_; - /* rotation du barillet pour la couleur */ - rotation_barillet( 2, 0 ); + inter_ar_ = MONTEE; + compteur_timer_ = 0; } else if ( etat_inter_ar_ == DESCENTE ) { /* remettre la vitesse turbine a min */ - OCR1C = 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 ??*/ @@ -233,57 +441,13 @@ SIGNAL ( SIG_INTERRUPT7 ) /* interruption fourche optique barillet 1 */ SIGNAL ( SIG_INTERRUPT5 ) { - /* XXX tester pour voir si on ralenti pas trop tard */ - if ( ++fourche_bar_1_ == nb_pas_bar_ ) - { - if ( OCR1A == VITESSE_BAR_MAX_ ) - { - OCR1A = VITESSE_BAR_MIN_; - } - else if ( OCR1A == VITESSE_BAR_MIN_ ) - { - OCR1A = 0; - if ( sens_rotat_ ) - { - utils_delay_ms ( DELAY_ ); /* XXX bof bof */ - sens_rotat_ = 0; - } - rotation_en_cours_ =0; - } - } + pos_bar(); } /* interruption fourche optique barillet 1 */ SIGNAL ( SIG_INTERRUPT4 ) { - if ( ++fourche_bar_2_ == nb_pas_bar_ ) - { - if ( OCR1A == VITESSE_BAR_MAX_ ) - { - OCR1A = VITESSE_BAR_MIN_; - } - else if ( OCR1A == VITESSE_BAR_MIN_ ) - { - OCR1A = 0; - if ( sens_rotat_ == 1 ) - { - utils_delay_ms ( DELAY_ ); /* XXX XXX XXX XXX */ - sens_rotat_ = 0; - } - rotation_en_cours_ = 0; - } - } + pos_bar(); } - -/*Dans le main : - * apres extraction de balle - * => check couleur - * => remonter l'info a la PC104 - * => rucup quelle balle on doit mettre - * => rotation barillet - * => depose_balle - * => on ravance - */ - diff --git a/n/es-2006/src/barillet.h b/n/es-2006/src/barillet.h index c361397..defae26 100644 --- a/n/es-2006/src/barillet.h +++ b/n/es-2006/src/barillet.h @@ -28,17 +28,24 @@ #include "common.h" -/* fonction d'initialisation */ -void barillet_init(void); +/* 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 depose; +/* variable pour lancer une rotation */ +extern uint8_t rotation; +/* position du barillet a aller */ +extern uint8_t pos_a_aller; + -/* fonction de rotation du barillet */ -void rotation_barillet( uint8_t nb_pas, uint8_t sens ); -/* fonction d'extraction de balle */ -void extraction_balle(void); -/* fonction pour déposer une balle dans un trou */ -void depose_balle(void); +/* fonction d'initialisation */ +void barillet_init(void); + +/* fonction main de la gestion du barillet */ +void main_barillet(void); #endif diff --git a/n/es-2006/src/main.c b/n/es-2006/src/main.c index 314df6a..44c0c30 100644 --- a/n/es-2006/src/main.c +++ b/n/es-2006/src/main.c @@ -35,6 +35,7 @@ #include "sniff_rvb.h" /* RVB sensors analysis */ #include "timer_1.h" /* timer/counter 1 */ #include "others.h" /* define game color mode + jack + frontal sensor */ +#include "barillet.h" /* Statistics for RVB sensors */ @@ -103,7 +104,7 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) proto_send1b('c', others_selectcoul()); break; // /* contact */ -// case c ('t', 0 ): +// case c ('TTTTTTTTTTt', 0 ): // proto_send1b('t', others_contact()); // break; // @@ -111,7 +112,25 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) // case c ('j', 0 ): // proto_send1b('j', others_jack()); // break; + + /* deposer une balle dans le barillet */ + case c ('d', 0): + depose = 1; + break; + + /* extraire une balle */ + case c ('e', 0): + extraction = 1; + break; + + /* rotation du barillet */ + case c ('t', 1): + rotation = 1; + pos_a_aller = args[0]; + break; + + /* Unknown commands */ default: proto_send0 ('?'); @@ -138,6 +157,8 @@ main (void) sensor_rvb_init (); /* Init Color button init */ others_init(); + /* barillet init */ + barillet_init(); /* Enable interrupts */ sei (); diff --git a/n/es-2006/src/timer_1.c b/n/es-2006/src/timer_1.c index cbbe1e7..97b29fd 100644 --- a/n/es-2006/src/timer_1.c +++ b/n/es-2006/src/timer_1.c @@ -29,15 +29,15 @@ inline void timer1_init (void) { /* Initialisation of timer/counter 1 control register A : - * - pwm : TODO Fast PWM 10 bits. + * - pwm : TODO Complete it please ! */ TCCR1A = regv (COM1A1, COM1A0, COM1B1, COM1B0, COM1C1, COM1C0, WGM11, WGM10, - 0, 0, 0, 0, 0, 0, 1, 1 ); + 1, 0, 1, 0, 1, 0, 1, 1 ); /* Initialisation of timer/counter 1 control register B : * - shared : 1 for prescaling ; * - rvb : noise canceler, IC on falling edge ; - * - pwm : TODO Fast PWM 10 bits. + * - pwm : Fast PWM 10 bits. */ TCCR1B = regv (ICNC1, ICES1, 5, WGM13, WGM12, CS12, CS11, CS10, 1, 0, 0, 0, 1, 0, 0, 1 ); -- cgit v1.2.3