LA PROGRAMMATION DU PIT (8254)

Le PIT (Programmable Interval Timer) permet de generer une interruption à intervale regulier. Le PIT possede 3 compteurs (de 16 bit)independant les uns des autres , chacun est utilise pour une tache specifique :

Le compteur 0 est utilise pour faire fonctionner le timer systeme

Le compteur 1 est utilise pour envoye un signal periodique au DMA, pour rafraichir la memoire (pour les vieux PC).

Le compteur 2 est utilise pour creer des sons pour le speaker du PC (speaker=haut-parleur).

Le principe de fonctionnement est simple : Chaque compteur est décrémenté de 1 à une frequence de 1.193.181 Hz ($1234DD).C'est à dire qu'il est décrémenté de 1 toute les 838,1 nS (nano second )= 1/1193181 . (1 ns = 10^-9 seconde) Et des qu'un compteur arrive à 0 , il genere une interruption. Le vecteur d'interruption se trouve à l'adresse : 20H (c'est valable uniquement pour le compteur 0 ,le compteur 2 est relié au speaker)


LES PORTS DU PIT :

40H R/W : PIT COMPTEUR 0 (compteur system) ,valeur par defaut =0
41H R/W : PIT COMPTEUR 1 (ram refresh)
42H R/W : PIT COMPTEUR 2 (speaker)


43H R/W : PIT CONTROL REGISTER
Une ecriture dans ce registre doit être suivit d'une ecriture
dans le compteur (selectionner).

Bit 7-6 = Selectionne le compteur
00 : COMPTEUR 0
01 : COMPTEUR 1
10 : COMPTEUR 2
11 : MODE DE LECTURE INVERSE (READ BACK COMMAND)
(les autre bit ont alors une autre signification)

Bit 5-4 = 00 : COMPTEUR LATCH (alors bit 3-0 = sans signification)
01 : LECTURE/ECRITURE DE L'OCTET DE POID FAIBLE
10 : LECTURE/ECRITURE DE L'OCTET DE POID FORT
11 : LECTURE/ECRITURE :
D'ABORD DANS L'OCTET DE POID FAIBLE
PUIS DANS L'OCTET DE POID FORT
(du compteur selectionner)

Bit 3-1 = 000 : MODE 0 : Interrupt on terminal count
001 : MODE 1 : Hardware retriggable one shot
x10 : MODE 2 : Rate generator
x11 : MODE 3 : Square wave generator
100 : MODE 4 : Software triggered strobe
101 : MODE 5 : Hardware triggered strobe

Bit 0 = 0 : COMPTEUR BINAIRE (16 bit) (0000 à FFFF)
= 1 : COMPTEUR BCD (4 chiffre BCD) (0000 à 9999)

MODE 0 : Interrupt on terminal count :

Une fois que le compteur est chargé avec une valeur , Il est decompter et arriver à 0 ,il genere une unique interruption . Quand on charge le compteur avec une valeur pendant le decompte ou apres,le compteur repart avec la nouvelle valeur.

MODE 2 : Rate generator :

C'est presque pareil que le mode 0 ,sauf qu'ici le compteur quand il a atteint 0 ,il genere une interruption et repart avec la valeur charger au depart et continue le cycle indefiniment.

MODE 3 : Square wave generator :

C'est pareil que le mode 2 (en realité ,il y a des petites différences que je ne saurais expliqué ). Sachez que c'est ce mode qui est le plus utilisé .

Je pense que les modes 1,4,5 ne servent pas dans la programmation PC (?)

Pour lire un compteur,il exite 3 façon :

- Soit lire directement le compteur , sur le port correspondant (2 octet ,LO puis HI). Il faut obligatoirement stopper l'horloge pendant la lecture sinon le compteur risque de continuer avec une fausse valeur. (je ne sais pas comment arreter l'horloge ,c'est peut être impossible sur PC ??)

- Soit utiliser le compteur latch : Apres avoir ecrit la commande latch dans le registre de control,la valeur du compteur est maintenu jusqu'a sa lecture (2 octet,LO puis HI) au port correspondant au compteur selectionner. Il n'est pas possible d'envoyer une autre commande latch si le compteur n'a pas était lu auparavent .

- Soit utiliser la commande read back :

Bit 7-6 = 11 : Indique que c'est la commande read back

Bit 5 = 0 : lire le compteur selectionner
= 1 : pas selectionner

Bit 4 = 0 : lire l'octet d'etat du compteur selectioner
= 1 : pas selectionner

Bit 3 = 1 : Selectionne compteur 2
= 0 : pas selectionner
Bit 2 = 1 : Selectionne compteur 1
= 0 : pas selectionner
Bit 1 = 1 : Selectionne compteur 0
= 0 : pas selectionner

Bit 0 = 0 : Reserve

Il est possible de selectionner plusieurs compteurs en même temps. (Il faudra lire les compteurs sur chaque port correspondant) Si la lecture de l'octet d'etat et du compteur (bit 5 et 4) sont selectionner en même temps ,le premier octet qui sera lu (sur le port) sera celui de l' octet d'etat suivit des 2 octets du compteur (LO puis HI). Il n'est pas possible d'envoyer d'autre command read back ,tant que l'octet d'etat ou (et) le compteur n'ont pas etait lu.

STRUCTURE DE L'OCTET D'ETAT :

Bit 7 : Etat du signal de sortir
= 0 : Etat bas
= 1 : Etat haut

Bit 6 = 0 : Le compteur peut être lu
1 : Le compteur ne être lu.

Bit 5-4 = 00 : COMPTEUR LATCH (alors bit 3-0 = sans signification)
01 : LECTURE/ECRITURE DE L'OCTET DE POID FAIBLE
10 : LECTURE/ECRITURE DE L'OCTET DE POID FORT
11 : LECTURE/ECRITURE :
D'ABORD DANS L'OCTET DE POID FAIBLE
PUIS DANS L'OCTET DE POID FORT
(du compteur selectionner)

Bit 3-1 = 000 : MODE 0 : Interrupt on terminal count
001 : MODE 1 : Hardware retriggable one shot
x10 : MODE 2 : Rate generator
x11 : MODE 3 : Square wave generator
100 : MODE 4 : Software triggered strobe
101 : MODE 5 : Hardware triggered strobe

Bit 0 = 0 : COMPTEUR BINAIRE (16 bit) (0000 à FFFF)
= 1 : COMPTEUR BCD (4 chiffre BCD) (0000 à 9999)


LE SPEAKER :

Le speaker ne connait que 2 etats :

1 : la membrane du haut parleur avance 0 : la membrane du haut parleur recule

C'est en faisant vibrer cette membrane qu'on peut créer des son. L'oreille humaine peut entendre des sons avec frequence situées entre 20 Hz et 20 KHz ,le Hertz (Hz) etant le nombre de vibration pas second .

Le speaker est relié au compteur 2 du PIT ,il y a 2 bit qui permettent de connecter ou deconnecter le speaker . Ces 2 bits se trouvent au port 61h (bit 0 et 1). Il faut les mettre à 1 pour connecter le speaker et les mettre à 0 pour deconecter le speaker .

Programme d'exemple (assembleur 80x86)

Directives de compilation