This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| fr:examples:can:wiper:tp1 [2010/03/11 08:44] – sdeniaud | fr:examples:can:wiper:tp1 [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== TP1 - Exemple 1 ====== | ||
| + | |||
| + | ===== Sujet ===== | ||
| + | |||
| + | **Acquérir l' | ||
| + | ** | ||
| + | ==== Objectifs ==== | ||
| + | |||
| + | * Définir les trames de commande qui permettent d' | ||
| + | * Définir, puis envoyer une trame interrogative à un module d' | ||
| + | * Tester si une trame a été reçue | ||
| + | * Extraire d'une trame réponse les informations attendues | ||
| + | * Visualiser sur l' | ||
| + | * Visualiser sur l' | ||
| + | |||
| + | ==== Cahier des charges ==== | ||
| + | |||
| + | A intervalles de temps réguliers, on interroge le module sur lequel est connecté le commodo Essuie-Glace afin de connaître son état. | ||
| + | * L' | ||
| + | * Les trames reçues ou envoyées sur le bus CAN sont affichées | ||
| + | * La temporisation est de type // | ||
| + | * Les différentes commandes imposées par la position de la manette commodo seront affichées individuellement | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | ===== Eléments de solution ===== | ||
| + | |||
| + | ==== Analyse ==== | ||
| + | |||
| + | Avant de pouvoir lire l' | ||
| + | Cette configuration a pour but de définir en entrée les 8 bits du port (GP0 à GP7). Pour configurer un bit du port en entrée, il faut écrire un " | ||
| + | Dans ce cas, la trame envoyée par le contrôleur CAN (Circuit SJA1000 sur carte CAN_PC104) sera vue par le récepteur (circuit MCP25050 sur module) comme une '' | ||
| + | |||
| + | === Configuration des liaisons en entrées === | ||
| + | |||
| + | **Définition de la trame de commande ('' | ||
| + | * Définition de variables structurées sous le modèle '' | ||
| + | '' | ||
| + | * Définition des éléments d' | ||
| + | |||
| + | <code c> | ||
| + | T_IM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | 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; | ||
| + | </ | ||
| + | |||
| + | Rem : '' | ||
| + | * Définition des paramètres associés à la trame de commande | ||
| + | Il faut initialiser le registre GPDDR (Data Direction Register) en écrivant un 1 si bit d' | ||
| + | |||
| + | <code c> | ||
| + | T_IM_Commodo_EG.data[0]=0x1F; | ||
| + | T_IM_Commodo_EG.data[1]=0x7F; | ||
| + | T_IM_Commodo_EG.data[2]=0x7F; | ||
| + | </ | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type '' | ||
| + | L' | ||
| + | |||
| + | === Activation de la conversion Analogique -> Numérique === | ||
| + | |||
| + | |||
| + | Définition des trois octets de données associées pour : | ||
| + | * activer et configurer la conversion Analogique vers Numérique | ||
| + | D' | ||
| + | Il faut initialiser le registre ADCON0, | ||
| + | <code c> | ||
| + | T_IM_ Commodo_EG.data[0]=0x2A; | ||
| + | T_IM_ Commodo_EG.data[1]=0xF0; | ||
| + | T_IM_ Commodo_EG nt.data[2]=0x80; | ||
| + | </ | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type '' | ||
| + | |||
| + | Il faut aussi initialiser le registre ADCON1 : | ||
| + | <code c> | ||
| + | T_IM_ Commodo_EG.data[0]=0x2B; | ||
| + | T_IM_ Commodo_EG.data[1]=0xFF; | ||
| + | T_IM_ Commodo_EG.data[2]=0xO3; | ||
| + | b7=ADCS1=0; | ||
| + | b5=VCFG1=0; | ||
| + | PCFG3: | ||
| + | </ | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type '' | ||
| + | |||
| + | |||
| + | === Acquisition de l' | ||
| + | |||
| + | |||
| + | A intervalles de temps réguliers, on interroge le module 8 entrées sur lequel est connecté le commodo Essuie-Glace. Dans la réponse on attend également le résultat de conversion de l' | ||
| + | |||
| + | ** Définition de la trame interrogative qui sera envoyée | ||
| + | |||
| + | |||
| + | Dans ce cas, la trame envoyée par le contrôleur CAN (Circuit SJA1000 sur carte CAN_PC104) sera vue par le récepteur (circuit MCP25050 sur module) comme un '' | ||
| + | |||
| + | * Définition de variables structurées sous le modèle '' | ||
| + | '' | ||
| + | Rem : La variable structurée | ||
| + | |||
| + | * Accès et définition des différents éléments de la variable structurée '' | ||
| + | <code c> | ||
| + | T_IRM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.rtr=0x01; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.dlc=0x08; | ||
| + | T_IRM_Commodo_EG.ident.extend.identificateur.ident= Ident_T_IRM8_Commodo_EG; | ||
| + | </ | ||
| + | |||
| + | Des labels définissant les différents identificateurs ont été déclarés dans le fichier '' | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type '' | ||
| + | |||
| + | **Trame reçue en réponse à l' | ||
| + | |||
| + | |||
| + | D' | ||
| + | Vu du module (du MCP25050), la réponse à un '' | ||
| + | La trame réponse, suite à l'IRM, comportera en données associées 8 octets ({{: | ||
| + | * octet de rang 0 (data[0])→ valeur IOINTFL | ||
| + | * octet de rang 1 (data[1])→ valeur GPIO → Valeur des entrées logiques | ||
| + | * octet de rang 2 (data[2])→ valeur AN0H → 8 bits MSB conversion entrée anologique 0 | ||
| + | * octet de rang 3 (data[3])→ valeur AN1H → 8 bits MSB conversion entrée anologique 1 | ||
| + | * octet de rang 4 (data[4])→ valeur AN10H → 2 fois 2 bits LSB conversion entrées ana. 1 et 0 | ||
| + | Les 3 autres octets ne sont pas utiles dans notre application. | ||
| + | Le résultat de conversion est sur 10bits : | ||
| + | * pour résultat AN0 | ||
| + | {{ : | ||
| + | |||
| + | ==== Organigramme ==== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ==== Programme en C ==== | ||
| + | |||
| + | <code c> | ||
| + | / | ||
| + | * TPs sur EID210 / Réseau CAN - VMD (Véhicule Multiplexé Didactique) | ||
| + | ************************************************************************************************* | ||
| + | * | ||
| + | ************************************************************************************************* | ||
| + | * TP Exemple n°1: Acquérir l' | ||
| + | * du commodo Essuie-Glace | ||
| + | * Afficher séparément les états de ces entrées binaires | ||
| + | * | ||
| + | *------------------------------------------------------------------------------------------------ | ||
| + | * | ||
| + | * ********************* | ||
| + | * On souhaite qu'à intervalles de temps réguliers on interroge le module 8 entrées sur lequel | ||
| + | * est relié le commodo de commande Essuie-Glace | ||
| + | * -> Les trames reçues et envoyées sur le bus CAN sont affichées | ||
| + | * -> Les états des entrées binaires et de l' | ||
| + | * -> La temporisation est de type logiciel | ||
| + | * (comptage du nombre de passages dans la boucle principale) | ||
| + | *---------------------------------------------------------------------------------------------- | ||
| + | * NOM du FICHIER : TP_Exemple 2.C | ||
| + | * ***************** | ||
| + | *************************************************************************************************/ | ||
| + | // Fichiers à inclure | ||
| + | // | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | // | ||
| + | // FONCTION PRINCIPALE | ||
| + | // | ||
| + | main() | ||
| + | {// Définition de variables locales | ||
| + | int Compteur_Passage; | ||
| + | unsigned short S_Temp, | ||
| + | unsigned int Cptr_TimeOut; | ||
| + | unsigned char AN0H, | ||
| + | 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 | ||
| + | |||
| + | // Initialisations | ||
| + | // | ||
| + | clsscr(); | ||
| + | /* Initialisation DU SJA1000 de la carte PC104 */ | ||
| + | Init_Aton_CAN(); | ||
| + | // Pour initialiser les liaison en entrées du noeud " | ||
| + | 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) | ||
| + | { 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); | ||
| + | } | ||
| + | } | ||
| + | clsscr(); | ||
| + | // Pour afficher le titre du TP | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | // 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 trame interrogative envoyée au commodo EG -> ' | ||
| + | // 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 | ||
| + | Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | // Initialiser les variables diverses | ||
| + | Compteur_Passage=0; | ||
| + | // Boucle principale | ||
| + | // | ||
| + | do | ||
| + | { // On teste si une trame a été reçue | ||
| + | if (1==Lire_Trame(& | ||
| + | {gotoxy(4, | ||
| + | printf(" | ||
| + | Affiche_Trame(Trame_Recue); | ||
| + | if (Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM8_Commodo_EG) | ||
| + | { // On a reçu l' | ||
| + | Commodo_EG.valeur=~Trame_Recue.data[1]; | ||
| + | AN0H =Trame_Recue.data[2]; | ||
| + | AN10L =Trame_Recue.data[4]; | ||
| + | // Traiter les données et reconstituer le résultat de conversion sur 10 bits | ||
| + | Valeur_ANA=(unsigned short)(AN0H); | ||
| + | Valeur_ANA=Valeur_ANA<< | ||
| + | S_Temp=(unsigned short)(AN10L& | ||
| + | Valeur_ANA=Valeur_ANA|(S_Temp>> | ||
| + | // On affiche les résultats | ||
| + | gotoxy(4, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | } | ||
| + | } | ||
| + | Compteur_Passage++; | ||
| + | if (Compteur_Passage==50000) | ||
| + | | ||
| + | gotoxy(4, | ||
| + | printf(" | ||
| + | Affiche_Trame(T_IRM_Commodo_EG); | ||
| + | Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | } | ||
| + | }while(1); | ||
| + | } | ||
| + | // FIN fonction principale | ||
| + | </ | ||
| + | |||
| + | |||