summaryrefslogtreecommitdiff
path: root/n
diff options
context:
space:
mode:
authorlambert2006-05-20 19:05:54 +0000
committerlambert2006-05-20 19:05:54 +0000
commit9649abd1d9917217b27f437c7aec641a2c78393a (patch)
treecbceeea89038804d4e38cb2514e7c6a15648cd00 /n
parenta187da0b35fdea10d5028edf35179d45c49278cb (diff)
ES (Barillet) :
- ajout des modifications (changement dans la gestion de la machine à états, ...).
Diffstat (limited to 'n')
-rw-r--r--n/es-2006/src/barillet.c382
-rw-r--r--n/es-2006/src/barillet.h20
-rw-r--r--n/es-2006/src/main.c7
3 files changed, 209 insertions, 200 deletions
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
- // 1s 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 galre. Voir meme une fonction inline qui
- // appelle que le utils_delay_ms, enfin on verra aprs.
- // 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 dclanch 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 */