summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--n/es-2006/src/barillet.c233
-rw-r--r--n/es-2006/src/barillet.h15
-rw-r--r--n/es-2006/src/main.c28
3 files changed, 177 insertions, 99 deletions
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
// 1s 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 dclanch 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 ());