Sélection de commande du moteur E.G.
L'état de fonctionnement du moteur “Essuie Glace” dépend de l'état du commodo Essuie Glace avec le cahier des charges suivant:
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.
La technique de commande du moteur Essuie Glace est décrite dans le TP exemple n°2.
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 … }
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 */