Index: branch/porte/Emb_App/SessionM32C_E8a_system.ini
===================================================================
--- branch/porte/Emb_App/SessionM32C_E8a_system.ini	(revision 371)
+++ branch/porte/Emb_App/SessionM32C_E8a_system.ini	(revision 372)
@@ -25,4 +25,4 @@
 [Target]
 M32C E8a SYSTEM=Renesas Communications
 [USER_DATA]
-RESET=ff0068
+RESET=ff0076
Index: branch/porte/Emb_App/programme_principal_etud.c
===================================================================
--- branch/porte/Emb_App/programme_principal_etud.c	(revision 371)
+++ branch/porte/Emb_App/programme_principal_etud.c	(revision 372)
@@ -118,35 +118,41 @@
 //'j'/106/06A : Récupération du résultat de dernier code envoyé. 0x77 si aucun code n'a été soumis. <0 si la réponse n'est pas
 //				disponible. 0xab avec a-> nombre de couleurs bien placées et b -> couleurs présentes mais mal placées.
 //'I'/73/Ox49 : Définition du nom du véhicule. Doit débuter par le caractère '#' et entraine le chargement de la configuration de piste
-//				correspondant au nom du véhicule si le nom se termine par '*'
+//				correspondant au nom du véhicule si le nom se termine par '*'
+
+// +-----------------------------------------------------+
+// |     				Constantes           		     |
+// +-----------------------------------------------------+
+const Vitesse_max=99, Vitesse_min=0, Vitesse_noir=12;
+const Kpt=1 , Kdt=0.1, Kdr=0.2, Kpr=1;											//Paramètre des PD de la tourelle et des roues
 
-/*-------------------------------------- Constante ----------------------------------------*/
-const Vitesse_max=99, Vitesse_min=0;
-
-/*-------------------------------------- Variables ----------------------------------------*/
+// +-----------------------------------------------------+
+// |     				Variables           		     |
+// +-----------------------------------------------------+
 //Variables pour l'asserivssement des roues, de la vitesse et du telemetre
-unsigned int Angle_T=0, Consigne_T=500;						//prend la valeur de l'angle au temps t-1 //Consigne de l'angle de la tourelle (consigne/10=>degrès)
+unsigned int Angle_T=0, Consigne_T=400, Consigne_T_noir=900;						//prend la valeur de l'angle au temps t-1 //Consigne de l'angle de la tourelle (consigne/10=>degrès)
 unsigned int valeur=0, Saut=0; 										//valeur transmise corrigé
 unsigned int Somme_Erreur=0, Erreur=0;			
 unsigned int ErreurRoues=0,Somme_ErreurRoues=0;
-int Kpt=1,	Kpr=1;											//Paramètre des PID tourelle et roues
-int Kdt=0.1,	Kdr=0.1;
-unsigned int Vitesse=40, vit=0, i=1, Distance;		
-unsigned int Angle_R=0, distance_bord=660;					//Angle des roues
+unsigned int vit=0, i=1, Distance;		
+unsigned int Angle_R=0, Vitesse_vert=40,Vitesse_bleu=35,Vitesse_rouge=30;					//Angle des roues
 //Variable de la fonction Capteur
-unsigned int Info_capteur;
+unsigned int Info_capteur, couleur_capteur, num_capteur;
 //Variable de la fonction Distance_bord
-unsigned int Bord_defaut=0, ecart=400;
+unsigned int Bord_defaut=0, ecart=400, distance_bord=790, distance_bord_noir=500;
 //Variable des fonctions IHM
-short Touche_clavier, Temps;
+short Touche_clavier, Temps=0;
 //char *Temps;
 //Variable de la fonction Circuit
-unsigned int Info_circuit, Etat_feu, Num_circuit, Depart_ok=0, Arret_urgence=0;
+unsigned int Info_circuit, Etat_feu, Num_circuit=0, Depart_ok=0, Arret_urgence=0;
 //Variable de la fonction Evenement
 unsigned int Lecture_eve;
 FLGPTN test;
 
-
+
+// +-----------------------------------------------------+
+// |     			Asservissement tourelle           	 |
+// +-----------------------------------------------------+
 void Asserv_T(){	
 	
 	//'T'/84/0x54 : Commande en vitesse de la tourelle portant le telemetre (en 1/10 de degre/secondes).
@@ -158,14 +164,15 @@
 			
 		demande.data.id='R'; 
 		demande.data.rtr=1;
+		
 	
-		snd_dtq (CanTx,demande.msg); // Interrogation du peripherique
-		Angle_T=periph[ADDR('R')].val; // contient la valeur de retour du simulateur.
+		snd_dtq (CanTx,demande.msg); 			// Interrogation du peripherique sur la position de la tourelle
+		Angle_T=periph[ADDR('R')].val; 			// contient la valeur de retour du simulateur de l'angle de la tourelle.
 		
 		comm.data.id='T'; 
 		comm.data.rtr=0; 
-		comm.data.val=valeur;
-		snd_dtq (CanTx,comm.msg);//Envoi de la commande
+		comm.data.val=valeur;					// Commande de l'angle de la tourelle 
+		snd_dtq (CanTx,comm.msg);				// Envoi de la commande		
 		
 		dly_tsk(100);
 		}
@@ -173,13 +180,28 @@
 
 void Asserv_T_hc(){
 	
-	Erreur=Consigne_T-Angle_T;
-	Somme_Erreur+=Erreur;
-	
+	switch(Num_circuit){			
+			case 1:
+				Erreur=Consigne_T-Angle_T;
+			break;
+			case 2:
+				Erreur=Consigne_T-Angle_T;
+			break;
+			case 3:
+				Erreur=Consigne_T-Angle_T;
+			break;
+			case 4:
+				 Erreur=Consigne_T_noir-Angle_T;
+			break;			
+		}
 	if(Angle_T!=Consigne_T)
-		valeur=Kpt*Erreur+Kdt*Somme_Erreur;//correction de l'angle par handler cyclique de la tourelle
+		valeur=Kpt*Erreur+Kdt*Somme_Erreur;					//correction de l'angle par handler cyclique de la tourelle
 	}
 
+// +-----------------------------------------------------+
+// |     			Asservissement Roues	           	 |
+// +-----------------------------------------------------+
+
 void Asserv_R(){
 	
 	//'D'/68/0x44 : Commande de l'angle des roues directrices (en 1/10 de degre).
@@ -187,7 +209,7 @@
 	CanFrame demande;
 	CanFrame reponse;
 	
-	dly_tsk(1500);
+	dly_tsk(1000);
 	while(1){
 		
 		comm.data.id='D'; //Commande de l'angle des roues
@@ -203,12 +225,32 @@
 	
 	ErreurRoues=distance_bord-Distance;
 	Somme_ErreurRoues+=ErreurRoues;
-	
-	if(Distance != distance_bord && Bord_defaut == 0)
-		Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);//correction de l'angle par handler cyclique des roues
+	switch(Num_circuit){
+			case 1:
+				if(Distance != distance_bord && Bord_defaut == 0){
+					Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);}				//correction de l'angle par handler cyclique des roues
+			break;
+			case 2:
+				if(Distance != distance_bord && Bord_defaut == 0){
+					Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);}				//correction de l'angle par handler cyclique des roues
+			break;
+			case 3:
+				if(Distance != distance_bord && Bord_defaut == 0 && num_capteur != 0x66F0){
+					Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);}				//correction de l'angle par handler cyclique des roues					
+			break;
+			case 4:
+				if(Distance != distance_bord_noir && Bord_defaut == 0){
+					Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);}				//correction de l'angle par handler cyclique des roues
+			break;
+			default : 
+				if(Distance != distance_bord && Bord_defaut == 0){
+				Angle_R=-1*(Kpr*ErreurRoues+Kdr*Somme_ErreurRoues);}
 	}
+}
 
-
+// +-----------------------------------------------------+
+// |     			Asservissement Vitesse           	 |
+// +-----------------------------------------------------+
 void Asserv_V(){
 	
 	//'V'/86/0x56 : Commande en vitesse des roues motrices du vehicule (en radian /secondes).
@@ -216,41 +258,79 @@
 	CanFrame demande;
 	CanFrame reponse;
 	
-	dly_tsk(3000);
+	dly_tsk(2500);
 	while(1){		
 	
 		comm.data.id='V'; 						//Commande de la vitesse des roues motrices
 		comm.data.rtr=0;
-	
-		if(Depart_ok == 1 && Arret_urgence == 0){		
-			if(Info_capteur == 0x560){				// Commande de vitesse pour les lignes droites (dernier capteur detecte = vert).
-				comm.data.val=Vitesse;	
-				snd_dtq (CanTx,comm.msg);			// Envoi de la commande de vitesse
-			}
-			else if(Info_capteur == 0x630 && Saut == 0){		//Accelération pour passer le saut
-				comm.data.val=Vitesse*1.66;	
+		
+		switch(Num_circuit){			
+			case 1:	
+				if(Depart_ok == 1 && Arret_urgence == 0){		
+					if(couleur_capteur == 0x560){				// Commande de vitesse pour les lignes droites (dernier capteur detecte = vert).
+						comm.data.val=Vitesse_vert;	
+						snd_dtq (CanTx,comm.msg);			// Envoi de la commande de vitesse
+					}
+					else{									// Ralentissement en cas de virage.
+						comm.data.val=Vitesse_vert/1.2;	
+						snd_dtq (CanTx,comm.msg);
+					}
+				}
+				else{
+					comm.data.val=0;	
+					snd_dtq (CanTx,comm.msg);
+				}
+			break;
+			case 2:	
+				if(Depart_ok == 1 && Arret_urgence == 0){		
+					if(couleur_capteur == 0x560){				// Commande de vitesse pour les lignes droites (dernier capteur detecte = vert).
+						comm.data.val=Vitesse_bleu;	
+						snd_dtq (CanTx,comm.msg);			// Envoi de la commande de vitesse
+					}
+					else{									// Ralentissement en cas de virage.
+						comm.data.val=Vitesse_bleu/1.3;	
+						snd_dtq (CanTx,comm.msg);
+					}
+				}
+				else{
+					comm.data.val=0;	
+					snd_dtq (CanTx,comm.msg);
+				}
+			break;
+			case 3 :
+				if(Depart_ok == 1 && Arret_urgence == 0){
+					if(couleur_capteur == 0x560){				// Commande de vitesse pour les lignes droites (dernier capteur detecte = vert).
+					comm.data.val=Vitesse_rouge;	
+					snd_dtq (CanTx,comm.msg);			// Envoi de la commande de vitesse
+					}
+					else if(couleur_capteur == 0x0766 && num_capteur == 0x66F0){				//Accelération pour passer le saut
+					comm.data.val=45;	
+					snd_dtq (CanTx,comm.msg);
+					}
+					else{									// Ralentissement en cas de virage.
+					comm.data.val=Vitesse_rouge/1.5;	
+					snd_dtq (CanTx,comm.msg);
+					}
+				}
+			break;
+			case 4 : 
+				if(Depart_ok == 1 && Arret_urgence == 0){
+					comm.data.val=Vitesse_noir;	
+					snd_dtq (CanTx,comm.msg);
+				}
+			break;					
+			default : 
+				comm.data.val=0;	
 				snd_dtq (CanTx,comm.msg);
-				Saut=1;
-			}
-			else if(Info_capteur == 0x630 && Saut == 1){		//Ralentissement pour la reception du saut
-				comm.data.val=Vitesse/2.3;	
-				snd_dtq (CanTx,comm.msg);
-			//	Saut=0;
-			}
-			else{									// Ralentissement en cas de virage et de détection de trou ou d'obstacle.
-				comm.data.val=Vitesse/1.55;	
-				snd_dtq (CanTx,comm.msg);
-			}
 		}
-		else{
-			comm.data.val=0;	
-			snd_dtq (CanTx,comm.msg);
-		}
 				
 	dly_tsk(10);
 	}
 }
 
+// +-----------------------------------------------------+
+// |     			Commande capteur		           	 |
+// +-----------------------------------------------------+
 void Capteur(){
 	
 	//'C'/67/0x43 : Informations sur le dernier capteur touche :
@@ -264,8 +344,10 @@
 		
 		demande.data.id='C';
 		demande.data.rtr=1;
-		snd_dtq (CanTx,demande.msg); 			// Interrogation du peripherique sur les donnees du dernier capteur touché.
-		Info_capteur=periph[ADDR('C')].val>>4; 		// contient la valeur de retour du simulateur sur le dernier capteur touché.
+		snd_dtq (CanTx,demande.msg); 				// Interrogation du peripherique sur les donnees du dernier capteur touché.
+		Info_capteur=periph[ADDR('C')].val; 		// contient la valeur de retour du simulateur sur le dernier capteur touché.
+		couleur_capteur=Info_capteur >> 4;
+		num_capteur=Info_capteur << 4;
 		
 		dly_tsk(100);
 	}
@@ -273,6 +355,11 @@
 	
 }
 
+
+// +-----------------------------------------------------+
+// |     			Gestion des troues		           	 |
+// +-----------------------------------------------------+
+
 void Distance_bord(){
 	
 	//'U'/85/0x55 : Distance mesuree par le telemetre (1/100 de metre).
@@ -288,17 +375,47 @@
 		snd_dtq (CanTx,demande.msg); // Interrogation du peripherique sur la distance mesure par le telemetre.
 		Distance=periph[ADDR('U')].val; // contient la valeur de retour du simulateur sur la distance mesuré par le telemetre.
 		
-		if(Distance > distance_bord+ecart  || Distance < distance_bord-ecart){
-			Bord_defaut=1;
+		switch(Num_circuit){
+			case 1:
+				if(Distance > distance_bord+ecart  || Distance < distance_bord-ecart){
+				Bord_defaut=1;
+				}
+				else{
+				Bord_defaut=0;
+				}
+			break;
+			case 2:
+				if(Distance > distance_bord+ecart  || Distance < distance_bord-ecart){
+				Bord_defaut=1;
+				}
+				else{
+				Bord_defaut=0;
+				}
+			break;
+			case 3:
+				if(Distance > distance_bord+ecart  || Distance < distance_bord-ecart){
+				Bord_defaut=1;
+				}
+				else{
+				Bord_defaut=0;
+				}
+			break;
+			case 4:
+				if(Distance > distance_bord_noir+ecart  || Distance < distance_bord_noir-ecart){
+				Bord_defaut=1;
+				}
+				else{
+				Bord_defaut=0;
+				}
+			break;
 		}
-		else{
-			Bord_defaut=0;
-		}		
-		dly_tsk(10);
+		dly_tsk(10);	
 	}
-	
 }
 
+// +-----------------------------------------------------+
+// |     			Commande IHM			           	 |
+// +-----------------------------------------------------+
 void Commande_clavier(){
 	
 	// Interface Homme Machine muni du clavier matricielle, de l'écran LCD,
@@ -315,7 +432,7 @@
 			}
 			else if(Touche_clavier == 42 || Touche_clavier == 35){
 				if(vit < 100 && vit > 0){
-					Vitesse = vit;
+					Vitesse_vert = vit;
 				}
 				vit = 0;
 				i = 1;			
@@ -375,6 +492,9 @@
 	
 }
 
+// +-----------------------------------------------------+
+// |     Gestion des informations de la piste		   	 |
+// +-----------------------------------------------------+
 void Circuit(){
 	
 	//'M'/77/0x7D : Mode de course :
@@ -415,7 +535,10 @@
 	}
 		
 }
-
+
+// +-----------------------------------------------------+
+// |  					   main		  				 	 |
+// +-----------------------------------------------------+
 void main()
 {
 	ports_mcu();
