summaryrefslogtreecommitdiff
path: root/n/es-2006/src
diff options
context:
space:
mode:
authorlambert2006-05-14 07:23:06 +0000
committerlambert2006-05-14 07:23:06 +0000
commit6a74406e0532da33502c585774aa0ed38ae4aae1 (patch)
tree0f07335f04a56a8082b44915cb442375a7bd5720 /n/es-2006/src
parent74a5ffa867fbdc2db1f9aae873d1dc4955ff3e6a (diff)
1er comit de la partie barillet pour test
J'espere qu'on va rien cramer :)
Diffstat (limited to 'n/es-2006/src')
-rw-r--r--n/es-2006/src/barillet.c408
-rw-r--r--n/es-2006/src/barillet.h23
-rw-r--r--n/es-2006/src/main.c23
-rw-r--r--n/es-2006/src/timer_1.c6
4 files changed, 326 insertions, 134 deletions
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 );