Les Secrets du Compteur Sequenceur Programmable 8254

1. Generalites

Le fonctionnement est identique avec un 80286 ou 80386, sur un PC/AT, meme si le circuit 8254 n'existe pas, car aujourd'hui, il est souvent noye dans un gros circuit integre qui realise la meme fonction.

Plusieurs applications necessitent des comptages ou des temporisations. Afin de liberer le microprocesseur de cette tache subalterne, un circuit specialise, le 8254, assure plusieurs de ces fonctions ; au lieu de construire des boucles de temporisation, l'utilisateur specifie ses desirs en programmant le 8254.

Trois fonctions sont realisees :

  • horloge temps reel (genere une demande d'interruption IRQ0) (voir INT08H).
  • horloge de rafraichissement des memoires dynamiques.
  • generateur BF pour le haut-parleur interne.

    Le champ d'adresses E/S de ce circuit est 0040H a 005FH.

    2. Horloge temps reel

    Cette horloge (compteur No 0) genere un signal de demande d'interruption IRQ0 (INT08H) vers le controleur d'interruption 8259. Cette interruption est utilisee pour creer une horloge (heures/minutes/secondes) ou pour generer des temporisations. Pour respecter la compatibilite du standard, cette horloge est programmee a 18,2 Hz (54,9 ms).

    DONNEES TIMER (zone de donnees du BIOS)

    00046CH = Compteur horloge systeme (poids faibles).
    00046EH = Compteur horloge systeme (poids forts).
             1 seconde = 12H. 
             1 minute = 444H (1092,39).
             1 heure = 10007H (65.543,33).
             1 jour = 1800B0H (1.573.040).
    

    Cette horloge est decrementee par INT08H avec une periode de 54,9 ms.

    000470H = Drapeau depassement 24 heures (initialise a 0 par le BIOS).
    

    3. Horloge de rafraichissement des memoires dynamiques

    Les memoires vives dynamiques necessitent un rafraichissement periodique qui ne peut pas depasser quelques milli-secondes (4 ms).

    Le rafraichissement doit donc intervenir toutes les 15 micro.s environ.
    (15 micro.s x 256 adresses de rafraichissement < 4 ms).

    Le sequencement du rafraichissement est delivre par le compteur No 1 du 8254 : sortie OUT1. Ce signal, provoque une demande d'acces aux bus CPU (HOLDR), comme une procedure d'acces direct memoire classique ; cette demande est filtree pour assurer l'arbitrage entre les demandes de DMA et le rafraichissement ; le rafraichissement est prioritaire sur une procedure DMA.

    Une fois la demande DMA autorisee par le 80286, un signal CPUHOLDA est genere pour signaler la liberation des bus ; puis les signaux REFRESH* et XMEMRD* sont generes pour le raffraichissement.

    A chaque periode de l'horloge de rafraichissement (REFRESH), un compteur 8 bits (interne au controleur DMA) est incremente de facon a balayer les 256 adresses colonnes de rafraichissement ; seul les bits A0 a A7 sont generes pour le rafraichissement des memoires dynamiques. Toutefois ce compteur n'est pas utilise par tous les boitiers memoire car certains boitiers disposent de leur propre compteur de rafraichissement.
    La commande de rafraichissement de la DRAM sur la carte mere est realisee par des cycles "CAS avant RAS" au niveau du controleur memoire, alors que sur les cartes extension elle est realisee par les signaux REFRESH et XMEMRD*.

    Le signal REFDET (de periode 30micro.s) sur le port E/S 00061H est utilise par les auto-tests pour verifier le fonctionnement du circuit de rafraichissement, et par les procedures du BIOS pour la generation de temporisation multiples de 15micro.s.

    La duree d'un cycle de rafraichissement est de 5 periodes de l'horloge systeme (Tc = 83ns a 12MHz) a partir de l'acquittement de la demande du bus, soit un temps d'occupation des bus de :

  • 2,6% a 12 MHz
  • 4% a 8 MHz

    Attention : Une modification de la programmation de ce compteur peut entrainer la perte des informations contenues dans la memoire RAM.

    4. Generateur BF

    Cette fonction particuliere permet de generer un signal sonore sur le haut-parleur interne. Elle utilise le compteur No2 du 8254.

    Il existe deux moyens de controler les sons emis par le haut-parleur :

  • par le signal SPKDATA du port 0061H :
    Dans ce cas, il faut bloquer le compteur No2 du 8254 en positionnant a 0 le bit b0 (GATESPK) du port d'entree/sortie 0061H. Le son est alors produit par les variations du signal SPKDATA : b1 du port E/S 0061H (le bit b0 restant toujours a 0).
  • par le compteur-sequenceur 8254 :
    C'est le compteur No2 du 8254 qui produit le son. Il faut programmer le 8254 de la facon suivante :
    • ecrire la valeur B6H a l'adresse E/S 0043H pour charger le registre de commande de ce compteur (mode 3 = generateur de signaux rectangulaires, registre compteur 16 bits charge dans l'ordre poids faibles puis poids forts)
    • charger le registre compteur par deux ecritures successives a l'adresse E/S 0042H) : Ce compteur divise la frequence de base 1,19 MHz.
    • utiliser le bit b0 (GATESPK) du port E/S 0061H pour moduler le signal genere par le 8254. Il faut que ce bit soit a 1 pour que le signal du 8254 soit transmis au haut-parleur.

    5. Description du 8254

    5.1. Generalites

    Le 8254 comprend 3 compteurs-sequenceurs 16 bits independants.

    Six registres internes assurent le controle du fonctionnement de ces 3 compteurs :

  • 3 registres compteurs sur 16 bits
  • 3 registres de commande 8 bits
    |-------|-------------------------|---------|
    |Adresse|         Registre        |  Mode   |
    |  E/S  |                         | d'acces |
    |-------|-------------------------|---------|
    | 0040H |Registre compteur No0    |         |
    |-------|-------------------------|Ecriture |
    | 0041H |Registre compteur No1    |  (ou    |
    |-------|-------------------------|Lecture) |
    | 0042H |Registre compteur No2    |         |
    |-------|-------------------------|---------|
    |       |                         |Ecriture |
    | 0043H |Registre commande No0,1,2|  (ou    |
    |       |                         | lecture)|
    |-------|-------------------------|---------|
    

    Pour chaque compteur, le registre de commande doit etre ecrit avant le chargement du registre compteur.

    5.2. Registres internes

    Registre compteur

    Chaque compteur est en realite un decompteur. En fonctionnement, il est decremente a chaque periode de l'horloge specifique au compteur. Dans cette application, les 3 entrees d'horloge CLK0, 1, 2 sont communes : la frequence de l'horloge de reference est de 1,193 MHz (14,318 MHz/12).

    Chaque registre compteur est charge sur 16 bits par la valeur de la division de l'horloge de reference ; ce registre est lu ou ecrit en une ou deux operations : le mode d'acces est donne par les bits RW1 et RW0 du registre de commande.

    
    |------------------------------------------------|
    |            REGISTRE COMPTEUR DU 8254           |
    |--|--|--|--|--|--|--|--||--|--|--|--|--|--|--|--|
    |b7|b6|b5|b4|b3|b2|b1|b0||b7|b6|b5|b4|b3|b2|b1|b0|
    |--|--|--|--|--|--|--|--||--|--|--|--|--|--|--|--|
    |  |  |  |  |  |  |  |  ||  |  |  |  |  |  |  |  |
    |--|--|--|--|--|--|--|--||--|--|--|--|--|--|--|--|
    |-----------|-----------||----------|-----------|
           Poids forts             Poids faibles
    

    Lecture d'un compteur

    Trois methodes de lecture sont possibles :

  • la premiere consiste a lire au vol le port a l'adresse du registre compteur. Toutefois il faut inhiber le compteur avant cette lecture par l'intermediaire de la gachette pour eviter une lecture erronee.
  • la seconde utilise l'option "memorisation pour lecture" en positionnant les bits RW0 et RW1 du registre de commande a 0 (les bits SC1 et SC0 de ce registre specifient le No du compteur ; les autres bits sont non significatifs). La valeur courante du compteur est copiee dans le port de lecture du compteur specifie ; cette valeur est maintenue jusqu'a ce qu'une lecture ou une ecriture du compteur soit effectuee. Si un compteur est memorise, toute nouvelle memorisation ulterieure est inactive tant que le port correspondant n'a pas ete lu ou reprogramme. Si un port est programme avec un compteur de 16 bits, deux octets doivent etre lus.
    
    |-------------------------------------------------------|
    |REGISTRE DE COMMANDE memorisation pour lecture compteur|
    |------|------|------|------|------|------|------|------|
    |  b7  |  b6  |  b5  |  b4  |  b3  |  b2  |  b1  |  b0  |
    |------|------|------|------|------|------|------|------|
    | SC1  | SC0  |  0   |   0  |  x   |   x  |   x  |   x  |
    |------|------|------|------|------|------|------|------|
    |------|------|
    No du compteur
    
  • la troisieme methode consiste a utiliser l'option "lecture compteur et etat" en positionnant les bits SC1 et SC0 a 1. Cette methode permet la memorisation multiple des compteurs.
    
    |-------------------------------------------------------|
    |  REGISTRE DE COMMANDE pour lecture compteur et etat   |
    |------|------|------|------|------|------|------|------|
    |  b7  |  b6  |  b5  |  b4  |  b3  |  b2  |  b1  |  b0  |
    |------|------|------|------|------|------|------|------|
    |  1   |  1   |COUNT |STATUS| CTN2 | CTN1 | CTN0 |  0   |
    |------|------|------|------|------|------|------|------|
                                |----------|---------|
                                 bits actifs a 1 pour
                                 les compteurs No2, 1, 0 
                                 respectivement
    
  • COUNT : La commande de memorisation de la valeur courante du compteur est realisee en positionnant le bit COUNT a 0 ; la lecture des compteurs est effectuee comme dans la methode precedente.
  • STATUS : La commande de memorisation de l'etat des compteurs est realisee en positionnant le bit STATUS a 0 ; la lecture de l'etat des compteurs est effectuee par une simple lecture du compteur suivie eventuellement par la lecture de la valeur du compteur.

    L'octet d'etat a le format suivant :

    |-------------------------------------------------------|
    |            REGISTRE D'ETAT DU COMPTEUR                |
    |------|------|------|------|------|------|------|------|
    |  b7  |  b6  |  b5  |  b4  |  b3  |  b2  |  b1  |  b0  |
    |------|------|------|------|------|------|------|------|
    |OUTPUT| NULL | RW1  | RW0  |  M2  |  M1  |  M0  | BCD  |
    |      |COUNT |      |      |      |      |      |      |
    |------|------|------|------|------|------|------|------|
    
  • OUTPUT : etat du signal OUT de la sortie du compteur.
  • NULL COUNT : a l'etat 0, indique que la derniere valeur (ou commande) chargee dans un registre du compteur a bien ete prise en compte par l'element de comptage.
  • RW1 RW0 : Mode d'acces au registre compteur.
  • M2 a M0 : Mode de fonctionnement du compteur.
  • BCD : Mode de decomptage.

    Registre de commande

    Le registre de commande specifie le mode de fonctionnement et le mode d'acces du compteur : il doit etre programme pour initialiser chaque compteur.

    |-------------------------------|
    |     REGISTRE DE COMMANDE      |
    |---|---|---|---|---|---|---|---|
    |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    |---|---|---|---|---|---|---|---|
    |SC1|SC0|RW1|RW0|M2 |M1 |M0 |BCD|
    |---|---|---|---|---|---|---|---|
    |---|--||---|---||----|----||-|-|              | Mode de decomptage
        |       |         |       |----------------| -0 = binaire 16 bits
        |       |         |                        | -1 = BCD 4 decades
        |       |         |-----------------------|--------------|
        |       |    |---------------------------||   Mode de    |
        ||-----||----|     Mode d'acces          ||fonctionnement|
        || RW0 | RW1 |   au registre compteur    ||  du compteur |
        ||-----|-----|---------------------------||----|----|----|
        ||  0  |  0  |Memorisation pour lecture  || M2 | M1 | M0 |
        ||-----|-----|---------------------------||----|----|----|------|
        ||  1  |  0  |Poids forts                ||  0 |  0 |  0 |Mode 0|
        ||-----|-----|---------------------------||----|----|----|------|
        ||  0  |  1  |Poids faibles              ||  0 |  0 |  1 |Mode 1|
        ||-----|-----|---------------------------||----|----|----|------|
        ||  1  |  1  |Poids faibles puis forts   ||  x |  1 |  0 |Mode 2|
        ||-----|-----|---------------------------||----|----|----|------|
    |---|----------------------------------------||  x |  1 |  1 |Mode 3|
    |       Selection numero du compteur         ||----|----|----|------|
    |-------|-------|----------------------------||  1 |  0 |  0 |Mode 4|
    |  SC0  |  SC1  | Compteur No                ||----|----|----|------|
    |-------|-------|----------------------------||  1 |  0 |  1 |Mode 5|
    |   0   |   0   |     0                      ||----|----|----|------|
    |-------|-------|----------------------------|
    |   1   |   0   |     1                      |
    |-------|-------|----------------------------|
    |   0   |   1   |     2                      |
    |-------|-------|----------------------------|
    |   1   |   1   | Lecture compteur et etat   |
    |-------|-------|----------------------------|
    
    Mode 0 :

    Monostable un coup declenche par le chargement du registre compteur. La sortie est a l'etat bas des que le registre de commande est charge et jusqu'a la fin du decomptage ou elle passe a l'etat haut. Elle reste a l'etat haut tant que le registre compteur n'est pas charge. L'entree GATE a l'etat 0 invalide le decomptage. Recharger le registre compteur pendant le decomptage provoque :

  • l'arret du decomptage si 1 seul octet est charge
  • un nouveau decomptage si les 16 bits sont charges
    Mode 1 :

    Monostable un coup, declenche par un front montant sur l'entree GATE. Il est redeclenchable pendant le decomptage. La sortie a l'etat bas pendant le decomptage passe a l'etat haut a la fin. Si le registre compteur est recharge pendant le decomptage, le fonctionnement n'est pas modifie, sauf si une impulsion est appliquee sur l'entree GATE : dans ce cas le compteur redemarre avec la nouvelle valeur.

    Mode 2 :

    Generateur d'impulsion. La sortie est a l'etat haut des le chargement du registre compteur, elle reste a l'etat haut tant que l'entree GATE est mise a zero. Le generateur demarre ou redemarre sur un front montant de l'entree GATE. Si le registre compteur est recharge pendant une periode, celle-ci n'est pas affectee : seules les periodes suivantes seront modifiees.

    -|--------------------------|  |----------------------|  |--
     |                          |  |                      |  |  
    -|                          |--|                      |--|  
     <--N periodes d'horloge -->1xT<-------   NxT  ------->1xT<-
     ^
    Depart
    
    Mode 3 :

    Generateur de signaux rectangulaire : similaire au mode 2 sauf que la sortie reste a l'etat haut tant que la moitie du comptage n'a pas ete depassee, elle revient a l'etat bas ensuite jusqu'a la periode de comptage suivante.

    Mode 4 :

    Monostable retriggerable declenche par le chargement du registre compteur. Des que ce mode est selectionne, la sortie passe a l'etat 1. Le decomptage s'arrete pendant un etat bas sur l'entree GATE. La sortie passe a l'etat bas pendant une periode d'horloge a la fin du decomptage.

    Mode 5 :

    Declenchement par front : identique au mode 4 mais le demarrage du compteur est realise a chaque front montant sur l'entree GATE.

    5.3. Signaux d'entrees-sorties du 8254

                    |------| |------|
                  D7|1     |-|    24|VCC
                  D6|2            23|WR*
                  D5|3    8254    22|RD*
                  D4|4            21|CS*
                  D3|5            20|A1
                  D2|6            19|A0
                  D1|7            18|CLK2
                  D0|8            17|OUT2
                CLK0|9            16|GATE2
                OUT0|10           15|CLK1
               GATE0|11           14|GATE1
                 GND|12           13|OUT1
                    |---------------|
    
               Fig.6. - Brochage du 8254
    
  • D0 a D7 : Bus de donnees bidirectionnel 8 bits.
  • RD* : Entree commande de lecture.
  • WR* : Entree commande d'ecriture.
  • A0, A1 : Entrees de selection d'adresses des registres internes.
  • CS* : Entree selection du circuit (decodage d'adresses).
  • GATE0 a GATE2 : Entree de commande (gachette) pour chaque compteur respectivement.
  • CLK0 a CLK2 : Entree de l'horloge de chaque compteur respectivement.
  • OUT0 a OUT2 : Sortie de chaque compteur respectivement.

    Description de ports d'Entrees/Sorties divers (rappel)

    Port E/S 0061H

    |---------------------------------------------------------------|
    |                  Port E/S 0061H en lecture                    |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |   b7  |   b6  |   b5  |   b4  |   b3  |   b2  |   b1  |   b0  |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |  PCHK |  BQ1  |  OUT2 | REFDET|   Q3  |   Q2  |SPKDATA|GATESPK|
    |-------|-------|-------|-------|-------|-------|-------|-------|
    
  • PCHK : A 1, ce bit indique une erreur de parite memoire interne. Il est remis a 0 en positionnant ENPCHK* a 0.
  • BQ1 : A 1, ce bit indique une erreur de parite memoire externe. Il est remis a 0 en positionnant ENIOCH* a 0.
  • OUT2 : Sortie compteur/sequenceur No2 du 8254 (generateur BF) REFDET : Horloge de rafraichissement (divisee par 2) des memoires DRAM (periode de 30 micro.s).
  • Q3 : lecture bit ENIOCHK*.
  • Q2 : lecture bit ENPCHK*.
  • SPKDATA : lecture bit SPKDATA du port en ecriture.
  • GATESPK : lecture bit GATESPK du port en ecriture.
    |---------------------------------------------------------------|
    |                  Port E/S 0061H en ecriture                   |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |   b7  |   b6  |   b5  |   b4  |   b3  |   b2  |   b1  |   b0  |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |   x   |   x   |   x   |   x   |ENIOCH*|ENPCHK*|SPKDATA|GATESPK|
    |-------|-------|-------|-------|-------|-------|-------|-------|
    
  • ENIOCH* : Bit de validation du signal de detection d'erreur parite memoire externe (0=valide,1=inhibe). A 0, ce signal remet a zero la bascule de detection BQ1.
  • ENPCHK* : Bit de validation du signal de detection d'erreur parite memoire interne (0=valide,1=inhibe). A 0, ce signal remet a zero la bascule de detection PCHK.
  • SPKDATA : A 1, ce bit valide la sortie BF vers le Haut-Parleur.
  • GATESPK : A 1, ce bit valide le fonctionnement du compteur No2 du 8254 (generateur BF) pour moduler le signal BF genere vers le Haut-Parleur.

    Port E/S (ecriture en 0070H)

    |---------------------------------------------------------------|
    |                  Port E/S 0070H en ecriture                   |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |   b7  |   b6  |   b5  |   b4  |   b3  |   b2  |   b1  |   b0  |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    | ENMI* |   X   | Numero du registre interne memoire CMOS 146818|
    |-------|-------|-----------------------------------------------|
    
  • ENMI* : Bit de validation du signal NMI (0=valide,1=inhibe). Si ce bit est valide, une erreur de parite memoire interne (PCHK) ou externe (IOPCHK) genere un NMI.
    
                |----------|
                |  bit de  |
    PCHK >------|validation|---|           
                |  ENPCHK* |   |           |----------|  
                |----------|   |-          |  bit de  |  
                                  OU >---->|validation|-->  NMI
                |----------|   |-          |   ENMI*  |
                |  bit de  |   |           |----------|
    IOPCHK >----|validation|---|           
                |  ENIOCH* |
                |----------|