Table of Contents

Exercice 1

Sujet:

Sélection de commande du moteur E.G.

Objectifs :

Cahier des charges :

L'état de fonctionnement du moteur “Essuie Glace” dépend de l'état du commodo Essuie Glace avec le cahier des charges suivant:

Informations utiles

Acquisition des entrées "Commodo Essuie Glace"

La technique d'acquisition des entrées binaires et de l'entrée analogique, par réseau CAN, du module “Commodo E.G” est décrite dans le TP exemple n°1.

Commande du moteur Essuie Glace

La technique de commande du moteur Essuie Glace est décrite dans le TP exemple n°2.

Déclaration et utilisation de variables binaires

Si on souhaite déclarer des variables binaires, il est possible d'utiliser la structure de données de type “union” de label “byte_bits” déclarée dans le fichier “Structures_Données.h”

/* 	Union pour accéder à un octet (BYTE) soit en direct, soit en individualisant les 8 bits 
//**********************************************************************************************/
	union byte_bits
	{	struct 
		 {	unsigned char b7:1;
			unsigned char b6:1;
			unsigned char b5:1;
			unsigned char b4:1;
			unsigned char b3:1;
			unsigned char b2:1;
			unsigned char b1:1;
			unsigned char b0:1;
		}bit;
		BYTE valeur;
	};

Utilisation:

/* Déclaration des variables*/
// Pour les variables binaires 
union byte_bits Indicateurs; // Structures de bits
#define User_Bit1 Indicateurs.bit.b0  //  déclaration variable binaire
#define User_Bit2 Indicateurs.bit.b1  // 
// Pour initialiser tous les 8 bits de l'ensemble "Indicateurs"
Indicateurs.valeur=0x00;  // tous les bits sont initialisés à 0
// Pour affecter une valeur à une variable binaire 
User_Bit1=1; 
User_Bit0=0;
// Pour tester la valeur d'une variable binaire 
if(User_Bit1==1)    // Autre solution  "if(User_Bit1)"   car vrai si ≠ 0
	{ // Actions à faire si valeur = 1}
else 	{ // Actions à faire si valeur = 0}
if(User_Bit2==0)    	
	{ // Actions à faire si valeur = 0}

Réalisation d'une base de temps

Le micro contrôleur implanté sur la carte processeur EID210 intégre un bloc fonctionnel (noté Time Processor Unit (TPU) permettant la réalisation de fonctions temporelles. L'une des nombreuses fonctions du TPU est la génération d'une interruption périodique. Exemple d'application: Soit la génération d'une temporisation égale à 1 S, comme le montre les signaux ci-desous.

Solution: Si on envisage une base de temps élémentaire égale à 1mS, la solution comportera les parties de programmes suivantes:

/* Déclaration des variables*/
// Pour les variables binaires 
union byte_bits Indicateurs; // Structures de bits
#define Demande_Tempo Indicateurs.bit.b0  //  déclaration variables 
#define Reponse_Tempo Indicateurs.bit.b1  //  pour temporisation
#define Tempo_En_Cours Indicateurs.bit.b2
// Pour le compteur de passage dans la fonction d'interruption
int CPTR_mS;	/* déclaration des variables et compteurs de millisecondes */
/* FONCTION d'interruption pour temporisation  (base de temps: toutes les 10 mS)
=============================================================================*/
void irq_bt()   
{
	 if (Tempo_En_Cours==1)
		{ CPTR_mS++;
                 if(CPTR_mS ==100) Reponse_Tempo=1,Tempo_En_Cours=0,CPTR_mS=0;
		}
} // Fin de la définition de la fonction d'interruption pour la temporisation
/*==============================*/
/*      Fonction principale     */
/*==============================*/
main()
{
/*   Initialisations *
*********************/
// Pour base de temps
SetVect(96,&irq_bt);	     	// mise en place de l'autovecteur 
PITR = 0x0048;			// Une interruption toutes les 10 millisecondes 
PICR = 0x0760; 		//  96 = 60H
// Pour la temporisation
CPTR_mS=0;			// initialisation compteurs millisecondes
Demande_Tempo=0;
Reponse_Tempo=0;
Tempo_En_Cours=0;
/* Boucle principale *
**********************/    
	do
	{  // A l'endroit où l'on souhaite démarrer la tempo
		Demande_Tempo=1;
		Tempo_En_Cours=1;
	   // … Pour tester si fin tempo
	   if(Reponse_Tempo==1)
		{ Reponse_Tempo=0;
		  // Actions à faire à la fin de la temporisation}
	   // Pour réinitialisation
		Demande_Tempo=0;if(Demande_Tempo==0)Reponse_Tempo=0,Tempo_En_Cours=0,CPTR_mS=0;
 
    	}while(1);  	/*  Fin de la boucle principale */
} /* Fin de la fonction principale */