IUP SI 1 Examen Architecture des calculateurs 26 Avril 2004 Durée 2h. Documents autorisés. Correction 1 Génération d’un signal avec GPT1 Les registres de l’unité GPT1 du C167 sont initialisés ainsi: T2CON=0x25; T3CON=0x2C0; T4CON=0x26; T2=20000; T3=10000; T4=10000; DP3=0x08; 1. Déduire de ces initialisations le mode de fonctionnement de chacun des temporisateurs. T2 est utilisé en rechargement de T3 sur fronts montants de T3OTL T3 est en timer, résolution 400ns, décompteur, sortie T3OUT activée. T4 est utilisé en rechargement de T3 sur fronts descendants de T3OTL 2. Dessiner le chronogramme (évolution en fonction du temps) de la valeur du registre T3 et de celle du bit T3OTL sur un horizon d’environ 30 millisecondes. T3 T2=20000 T4=10000 0 12ms (400ns x 30000) T3OTL 3. Donner la période T du signal présent sur la broche P3.3 ainsi que la valeur de son rapport cyclique. Période T=30000x400ns=12ms, Rapport cyclique:2/3 4. Déterminer une expression générale permettant de calculer T en fonction des valeurs contenues dans T2 et T4 et de la résolution de l’horloge tr . T = (T 2 + T 4)tr 5. Même question pour le rapport cyclique R. T2 R= T2 + T4 6. En déduire les valeurs d’initialisations de T2 et T4 en fonction de T, tr et R. On déduit des deux expressions précédentes: T 2 + T 4 = tTr et T 2 + T 4 = TR2 d’ou: T 2 = R tTr et T 4 = (1 − R) tTr IUP SI 1 2 Examen Architecture des calculateurs 26 Avril 2004 Communication série L’application proposée consiste à traiter des requêtes reçues par l’intermédiaire de la ligne série. Une requête consiste en une demande d’acquisition d’un signal sur une entrée analogique. Elle est simplement constituée d’un nombre indiquant le numéro du canal sur lequel doit se faire l’acquisition. La réponse à la requête est la valeur exprimée en milli-volts (sous la forme d’un entier sur 16 bits) de la tension sur la broche correspondante. Elle est renvoyée par le micro-contrôleur sur la ligne série. La communication se fait en asynchrone sur 8 bits sans parité avec 2 bits de stop à 9600 bauds. Les erreurs de transmission ne sont pas traitées. On suppose que les fonctions suivantes sont fournies et accessibles en incluant dans le programme la directive de compilation: #include <com.h> – Fonction d’initialisation de la liaison série (hors registres d’interruptions). void init_ASC0(); – Fonction qui renvoie la valeur en mV sur l’entrée canal. int mesure(int canal); – Fonction qui envoie sur la ligne série l’entier valeur. void emission(int valeur); 1. Ecrire un programme utilisant ces fonctions et permettant de répondre aux requêtes reçues (Ces requêtes peuvent arriver n’importe quand). #include<c167.h> #include<gnutrap.h> #include<com.h> TRAP_noMD()x2B,reception); void reception() { int V,canal; canal=S0RBUF; V=mesure(canal); emission(V); } void main() { init_ASC0(); S0RIC=0x4C; // IT niveau 3 SET_SFRBIT(IEN); while(1); } 2. Ecrire la fonction d’initialisation de l’unité série ASC0: init ASC0. void init_ASC0() { S0CON=0x8019; // S0R=1, S0BRS=0, S0REN=1, S0STP=1, S0M=1 S0BG=65; SET_SFRBIT(DP3.10); SET_SFRBIT(P3.10); } IUP SI 1 Examen Architecture des calculateurs 26 Avril 2004 3. Ecrire la fonction mesure. int mesure(int canal) { int M; ADCON=canal; SET_SFRBIT(ADST); WAIT_UNTIL_BIT_SET(ADCIR); CLR_SFRBIT(ADCIR); M=(ADDAT & 0x3F)*5./1024.; // conversion en mV return M; } 4. Ecrire la fonction emission sachant que l’on envoie d’abord les bits de poids faible de l’entier. void emission() { S0TBUF=valeur & 0x00FF; WAIT_UNTIL_BIT_SET(S0TBIR); CLR_SFRBIT(S0TBIR); S0TBUF=(valeur >> 8) & 0x00FF; WAIT_UNTIL_BIT_SET(S0TBIR); CLR_SFRBIT(S0TBIR); } 3 Mesure de période On utilise l’unité CAPCOM1 en mode capture pour mesurer la période d’un signal TTL. Le signal est connecté à la broche CC4IO du C167 et le timer T1 est utilisé sans rechargement (T1REL=0). La mesure de la période se fait entre deux fronts descendants du signal. Après la capture permettant de déterminer la période, T1 est réinitialisé à 0 pour la capture suivante. 3.1 Initialisations 1. On choisit la résolution de T1 permettant d’obtenir la meilleure précision. Quelle est cette résolution? et quelle est la période maximale que l’on peut mesurer sans débordement de T1? Résolution min: 400ns Période max: 26,2ms 2. Quelle est la période minimale (et donc la fréquence maximale) mesurable sachant que l’on veut une précision meilleure que 1%? Période min=100 x 400ns=40 µs Fréquence max=1/Période min=25 kHz 3. Quels sont les registres à programmer pour réaliser la capture sachant que l’on veut générer une interruption de niveau 5 (groupe 0) sur chaque front descendant du signal à mesurer? Quelles sont les initialisations nécessaires de ces registres? CCM1=0x0A CC4IC=0x54 T01CON=0x4000 (T1R=1) 3.2 Mesure On suppose que l’interruption provoquée par un front descendant du signal à mesurer correspond à la fois à la fin d’une période (et donc à sa mesure) et au début d’une nouvelle période. IUP SI 1 Examen Architecture des calculateurs 26 Avril 2004 Donner le code de la fonction d’interruption correspondante. Le résultat (fréquence du signal) exprimé en Hertz sera stocké dans la variable globale float FREQ. void mesure() { FREQ=2.5E6/CC4; T1=0; } 4 Signal PWM On souhaite générer un signal périodique, dont une période est représentée sur la figure suivante, en utilisant l’unité PWM du C167. 84ms 2ms 100ms 1. Quel est le mode de fonctionnement de PWM qui permet de générer un signal de ce type? Sur quel bit de quel port peut-on récupérer le signal? Il faut utiliser les canaux 0 et 1 en mode rafale. La sortie se fait sur POUT0 (P7.0). On choisit une résoultion de 3, 2µs 2. Donner la programmation des registres de contrôle PWMCON0 et PWMCON1 de l’unité PWM permettant de générer ce signal. PWCON0=0x0013 (PT0=1, PT1=0, PTR0=1, PTR1=1) PWMCON1=0x1001 (PEN0=1, PM0=PM1=0, PB01=1) 3. Déterminer les valeurs à donner aux différents registres PPx et PWx utilisés. Justifier vos réponses. P P 0 = 100ms 3,2µs − 1 = 31249 (Période=100ms) 2ms − 1 = 39999 (Période=2ms) P P 1 = 3,2µs 84 P W 0 = 100 (P P 0 + 1) = 26250 (Rapport cyclique=0,16) P W 1 = P P21+1 = 20000 (Rapport cyclique=0,5)