Exercice long — table élévatrice : solution câblée puis solution programmée (4,5 points), dans l'esprit des sessions 2020–2025
Une table élévatrice de poste de chargement est positionnée à une hauteur choisie de 0 à 99 cm. Un codeur délivre, après mise en forme, une impulsion par centimètre de déplacement. La position courante est tenue par un circuit de comptage/décomptage à deux 74LS168 (unités, dizaines ; modulo 100) ; la consigne est affichée sur deux roues codeuses, SW2 (dizaines) et SW1 (unités), en BCD. Le contacteur KM1 fait monter la table, KM2 la fait descendre ; l'interrupteur MA met la carte en service. On admet qu'à la mise sous tension la table est en bas et .
B.1 — Solution câblée. Le synoptique ci-dessous résume la carte. Les deux 74LS85 (comparateur logique 4 bits ; U5 unités, U6 dizaines) comparent à . Le multiplexeur 74LS151 (8 vers 1) délivre l'horloge du compteur : son entrée de validation reçoit , ses entrées de sélection sont , , , et avec lorsque ( lorsque ).
Le document constructeur du 74LS168 (compteur/décompteur synchrone décimal) donne le chronogramme suivant ().
1. D'après ce chronogramme, compléter le tableau des modes, puis dire si le chargement est synchrone ou asynchrone.
| Mode | = | CLK | ||
|---|---|---|---|---|
| Chargement | … | … | … | … |
| Compte | … | … | … | … |
| Bloqué | … | … | … | … |
| Décompte | … | … | … | … |
2. Compléter les liaisons assurant : la désactivation du préchargement des deux 74LS168 ; leur mise en cascade synchrone ; la commande de et de , (unités) par le comparateur ; la mise en cascade des deux 74LS85.
3. Compléter le tableau des entrées de données du 74LS151, puis écrire l'équation de en fonction de MA, , et .
| … | … | … | … | … | … | … | … |
4. Écrire les équations de KM1 et KM2 en fonction de MA, et .
5. Compléter le tableau de fonctionnement (MA = 1).
| · | Compteur | Table | |||||
|---|---|---|---|---|---|---|---|
| … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … |
La consigne est et la table est à : quel contacteur est excité et combien d'impulsions le compteur reçoit-il avant l'arrêt ?
B.2 — Solution programmée. La même fonction est confiée à un microcontrôleur 16F877A : MA sur RB1, sur RB4 (interruption sur changement d'état de RB4 à RB7), KM1 sur RA0, KM2 sur RA1, roues codeuses sur le port D (SW2 sur les 4 bits de poids fort, SW1 sur les 4 bits de poids faible), afficheurs BCD de sur le port C.
// Déclaration des variables
sbit MA at RB1_bit;
sbit Cp at RB4_bit;
sbit KM1 at RA0_bit;
sbit KM2 at RA1_bit;
unsigned short Np, No, Diz, Uni;
void interrupt() {
if (Cp && KM1) Np = ……… ; // +1 cm
if (Cp && KM2) Np = ……… ; // -1 cm
INTCON = 0x88;
}
void main() {
ADCON1 = 0x06; // port A numérique
TRISA = ……… ; // RA0, RA1 sorties
TRISB = 0xFF;
TRISC = ……… ; // affichage de Np
TRISD = ……… ; // roues codeuses
Np = 0;
INTCON = 0x88;
while (1) {
Diz = PORTD / 16;
Uni = ……… ;
No = ……… ;
PORTC = 16*(Np/10) + Np%10;
KM1 = ……… ;
KM2 = ……… ;
}
}b. Justifier la valeur (bit 7 : GIE, bit 3 : RBIE). Pourquoi l'interruption teste-t-elle ?
c. Les roues codeuses affichent 46 et : calculer PORTD, Diz, Uni, No et la valeur écrite dans PORTC.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : lire, sur le chronogramme, les niveaux présents au front de CLK où chaque mode apparaît.
| Mode | = | CLK | ||
|---|---|---|---|---|
| Chargement | 0 | X | X | ↑ |
| Compte | 1 | 0 | 1 | ↑ |
| Bloqué | 1 | 1 | X | X |
| Décompte | 1 | 0 | 0 | ↑ |
passe à 0 à la graduation 2,4 mais les sorties ne prennent la valeur 3 qu'au front montant de CLK de la graduation 3 : le chargement est synchrone. Pendant ce chargement, le chronogramme montre et ; le 74LS168 fait primer sur la validation et le sens, d'où les X de cette ligne.
2. Idée : synchrone = une seule horloge ; les comparateurs se chaînent du poids faible vers le poids fort.
- des deux 74LS168 → +5 V (préchargement désactivé) ;
- CLK des deux circuits → ; des unités → et des dizaines ;
- des deux circuits → (comptage quand ) ; et des unités → (blocage quand ) ;
- U5 : entrées de cascade , , ; sorties de U5 → entrées de cascade de U6, qui délivre , , .
3. Idée : l'horloge ne doit passer que si la table doit bouger (une seule des deux sorties à 1) ; l'adresse est . Adresse 3 (, ) et adresse 5 (, ) : ; toutes les autres entrées à 0 ( et correspondent à une combinaison impossible).
| 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
autrement dit : l'horloge est coupée dès que la consigne est atteinte ou que la carte est hors service.
4. (monter tant que ) ; (descendre tant que ).
5.
| · | Compteur | Table | |||||
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 0 | compte | monte (KM1) | |
| 0 | 1 | 0 | X | 1 | bloqué | arrêt | |
| 0 | 0 | 1 | 0 | 0 | décompte | descend (KM2) |
Les entrées de validation sont actives au niveau bas : 0 valide, 1 bloque. Avec et : , KM2 est excité, le compteur décompte : impulsions, puis coupe et KM2.
void interrupt() {
if (Cp && KM1) Np = Np + 1;
if (Cp && KM2) Np = Np - 1;
INTCON = 0x88;
}
// dans main :
TRISA = 0xFC; // RA0, RA1 en sorties
TRISC = 0x00; // port C en sorties
TRISD = 0xFF; // port D en entrées
// dans la boucle :
Uni = PORTD - 16*Diz;
No = 10*Diz + Uni;
KM1 = MA && (Np < No);
KM2 = MA && (Np > No);6.b : GIE = 1 (interruptions autorisées) et RBIE = 1 (changement d'état de RB4 à RB7). Le changement d'état déclenche l'interruption sur les deux fronts de ; tester ne compte que le front montant, une seule fois par impulsion. Réécrire INTCON efface l'indicateur RBIF.
6.c PORTD ; (division entière), , . , soit : les afficheurs BCD montrent 52.