This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| fr:supervisors:solutions:didalab:exercice1 [2010/05/27 20:26] – sdeniaud | fr:supervisors:solutions:didalab:exercice1 [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 6: | Line 6: | ||
| ==== Fonction principale ==== | ==== Fonction principale ==== | ||
| - | {{: | + | {{: |
| Line 15: | Line 15: | ||
| ===== Programme ===== | ===== Programme ===== | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | / | ||
| + | * TPs sur EID210 / Réseau CAN - VMD (Véhicule Multiplexé Didactique) | ||
| + | ************************************************************************************************* | ||
| + | * | ||
| + | ************************************************************************************************* | ||
| + | * TP Exercice | ||
| + | *------------------------------------------------------------------------------------------------ | ||
| + | * | ||
| + | * ********************* | ||
| + | * On souhaite que l' | ||
| + | * - Si Position 1 Moteur en marche à faible vitesse | ||
| + | * - Si Position 2 Moteur en marche à grande vitesse | ||
| + | * - Si Position 3 Moteur en marche à vitesse ajustable par l' | ||
| + | * - Si Position 4 Moteur en marche périodique avec dans l' | ||
| + | | ||
| + | * NOM du FICHIER : TP_Exercice 1.C | ||
| + | * ***************** | ||
| + | *************************************************************************************************/ | ||
| + | // Fichiers à inclure | ||
| + | // | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // Variables globales | ||
| + | // | ||
| + | union byte_bits Indicateurs; | ||
| + | #define I_Affiche Indicateurs.bit.b0 | ||
| + | #define I_Fin_Tempo Indicateurs.bit.b1 | ||
| + | #define I_Active_Tempo Indicateurs.bit.b2 | ||
| + | #define I_Etat_Moteur Indicateurs.bit.b3 | ||
| + | unsigned int Compteur_Passage_Irq; | ||
| + | |||
| + | // Fonction d' | ||
| + | // | ||
| + | void irq_bt() | ||
| + | // Fonction exécutée toute les 10 mS | ||
| + | {if(I_Active_Tempo) // Si mode intermittent actif | ||
| + | {Compteur_Passage_Irq++; | ||
| + | if(Compteur_Passage_Irq==400) | ||
| + | {Compteur_Passage_Irq=0; | ||
| + | I_Fin_Tempo=1; | ||
| + | } | ||
| + | } | ||
| + | } // Fin de la fonction d' | ||
| + | |||
| + | // | ||
| + | // FONCTION PRINCIPALE | ||
| + | // | ||
| + | main() | ||
| + | {// Définition de variables locales | ||
| + | int Compteur_Passage; | ||
| + | unsigned char Commodo_EG_Mem; | ||
| + | unsigned int Cptr_TimeOut; | ||
| + | unsigned char AN0H; // Pour mémoriser les 8 biits de poids forts du résultat de conversion A->N | ||
| + | unsigned char Val_Vitesse, | ||
| + | |||
| + | Trame Trame_Recue; | ||
| + | Trame T_IRM_Commodo_EG; | ||
| + | // IRM -> Information Request Message -> Trame interrogative | ||
| + | Trame T_IM_Commodo_EG; | ||
| + | // IM -> Information Message -> Trame de commande | ||
| + | Trame T_IM_Asservissement; | ||
| + | // IM -> Information Message -> Trame de commande | ||
| + | // Initialisations | ||
| + | // | ||
| + | |||
| + | /* Initialisation DU SJA1000 de la carte PC104 */ | ||
| + | Init_Aton_CAN(); | ||
| + | // Pour initialiser les liaisons en entrées | ||
| + | T_IM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IM_Commodo_EG.trame_info.champ.dlc=0x03; | ||
| + | T_IM_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IM_Commodo_EG; | ||
| + | T_IM_Commodo_EG.data[0]=0x1F; | ||
| + | // | ||
| + | T_IM_Commodo_EG.data[1]=0x7F; | ||
| + | //-> Tous les bits concernés sauf GP0 (voir doc page 16) | ||
| + | T_IM_Commodo_EG.data[2]=0x7F; | ||
| + | // Envoi trame pour définir de la direction des entrées sorties | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==2000) | ||
| + | { clsscr(); | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(Lire_Trame(& | ||
| + | for(Cptr_TimeOut=0; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==2000) | ||
| + | { gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | } | ||
| + | } | ||
| + | // Pour activer les conversions Ana -> Num | ||
| + | T_IM_Commodo_EG.data[0]=0x2A; | ||
| + | T_IM_Commodo_EG.data[1]=0xF0; | ||
| + | T_IM_Commodo_EG.data[2]=0x80; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir le mode de conversion | ||
| + | T_IM_Commodo_EG.data[0]=0x2B; | ||
| + | T_IM_Commodo_EG.data[1]=0xFF; | ||
| + | T_IM_Commodo_EG.data[2]=0x0C; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour initialiser le module " | ||
| + | // Trame de type " | ||
| + | T_IM_Asservissement.trame_info.registre=0x00; | ||
| + | T_IM_Asservissement.trame_info.champ.extend=1; | ||
| + | T_IM_Asservissement.trame_info.champ.dlc=0x03; | ||
| + | T_IM_Asservissement.trame_info.champ.rtr=0; | ||
| + | T_IM_Asservissement.ident.extend.identificateur.ident=Ident_T_IM_Asservissement; | ||
| + | // Pour définir des Entrées/ | ||
| + | T_IM_Asservissement.data[0]=0x1F; | ||
| + | T_IM_Asservissement.data[1]=0xEF; | ||
| + | T_IM_Asservissement.data[2]=0xE3; | ||
| + | // GP7=fs Entrée; GP6=fcg Entree; GP5=fcd Entrée; | ||
| + | // GP3=PWM2 Sortie; GP2=PWM1 Sortie; GP1=AN1 Entrée; GP0=AN0 Entrée; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour mettre à 0 les sorties | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x1C; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir sortie GP2 en PWM1 | ||
| + | T_IM_Asservissement.data[0]=0x21; | ||
| + | T_IM_Asservissement.data[1]=0xB3; | ||
| + | T_IM_Asservissement.data[2]=0x80; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir fréquence signal sortie PWM1 | ||
| + | T_IM_Asservissement.data[0]=0x23; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0xFF; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | |||
| + | // Pour trame interrogative envoyée au commodo Essuie-Glace | ||
| + | // Définir données d' | ||
| + | T_IRM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.dlc=0x08; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.rtr=1; | ||
| + | T_IRM_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IRM8_Commodo_EG; | ||
| + | // Voir définitions dans fichier CAN_VMD.h | ||
| + | // Une première acquisition pour initialiser les grandeurs mise en mémoire | ||
| + | Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | Commodo_EG.valeur=Trame_Recue.data[1]& | ||
| + | Commodo_EG_Mem=Commodo_EG.valeur; | ||
| + | Val_Vitesse=Trame_Recue.data[2]; | ||
| + | Val_Vitesse_Mem=Val_Vitesse; | ||
| + | // Pour les indicateurs binaires | ||
| + | Indicateurs.valeur=0; | ||
| + | |||
| + | // Les initialisations se sont bien passée | ||
| + | // On peut afficher le titre du TP | ||
| + | clsscr(); | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | // Pour initialiser la base de temps et temporisations | ||
| + | SetVect(96,& | ||
| + | PITR = 0x0048; // Une interruption toutes les 10 millisecondes | ||
| + | PICR = 0x0760; // 96 = 60H | ||
| + | |||
| + | // Boucle principale | ||
| + | // | ||
| + | do | ||
| + | { Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | // On attend la réponse | ||
| + | | ||
| + | if (Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM8_Commodo_EG) | ||
| + | { | ||
| + | Commodo_EG.valeur=Trame_Recue.data[1]& | ||
| + | if(Commodo_EG.valeur!=Commodo_EG_Mem) | ||
| + | {// S'il y a eu changement d'une des entrées binaires, on commande le moteur | ||
| + | if(Commodo_EG.bit.GP4==0) // On test GP4 (BP1) du commodo EG | ||
| + | { // BP1 est actionné | ||
| + | I_Active_Tempo=0; | ||
| + | | ||
| + | printf(" | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | // | ||
| + | if(Commodo_EG.bit.GP5==0) // On test GP5 (BP2) du commodo EG | ||
| + | { // BP2 est actionné | ||
| + | I_Active_Tempo=0; | ||
| + | | ||
| + | printf(" | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | //else { | ||
| + | if(Commodo_EG.bit.GP6==0) // On test GP6 (BP3) du commodo EG | ||
| + | { // BP3 est actionné | ||
| + | I_Active_Tempo=0; | ||
| + | | ||
| + | printf(" | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | //else { | ||
| + | if(Commodo_EG.bit.GP7==0) // On test GP6 (BP3) du commodo EG | ||
| + | { // BP3 est actionné | ||
| + | I_Active_Tempo=1; | ||
| + | | ||
| + | printf(" | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | // ni BP1 ni BP2 ni BP3 ni BP4 actionné | ||
| + | if(Commodo_EG.valeur==0xF0) | ||
| + | {I_Active_Tempo=0; | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | } | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | }// Fin si changement d'une des entrées binaires | ||
| + | // Pour l' | ||
| + | Val_Vitesse=Trame_Recue.data[2]; | ||
| + | if(Val_Vitesse!=Val_Vitesse_Mem) | ||
| + | { gotoxy(2, | ||
| + | printf(" | ||
| + | if((Commodo_EG.bit.GP6==0)||(Commodo_EG.bit.GP7==0)) | ||
| + | | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=Val_Vitesse; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | } | ||
| + | // Mise en mémoire des valeurs acquises | ||
| + | Commodo_EG_Mem = Commodo_EG.valeur; | ||
| + | Val_Vitesse_Mem=Val_Vitesse; | ||
| + | } // Fin si identificateur correct | ||
| + | // Pour mode périodique | ||
| + | if(I_Active_Tempo==1) | ||
| + | {if(I_Fin_Tempo==1) | ||
| + | {I_Fin_Tempo=0; | ||
| + | if(I_Etat_Moteur==1) | ||
| + | {I_Etat_Moteur=0; | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | else | ||
| + | {I_Etat_Moteur=1; | ||
| + | | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | }while(1);// | ||
| + | }// FIN fonction principale | ||
| + | |||
| + | |||
| + | |||
| + | </ | ||