# Utiliser les PIC 16F et 18F/Exercices/Le mode capture du module CCP (Capture Compare PWM)
## Exercice 1 : Utilisation du mode capture pour lire un clavier PS2

Remarque préliminaire : en toute rigueur, il serait préférable de réaliser cette capture avec une interruption. Mais l'interruption correspondante n'a pas encore été documentée.

### Présentation du protocole PS2

Le protocole PS2 complet est un mélange de protocole synchrone et asynchrone. Il a été présenté dans le chapitre : Interfaces VGA et PS/2 d'un autre projet.
Seuls les signaux ps2_clk et ps2_data vont nous intéresser. Comme c’est le clavier qui émet les données c’est à lui de fabriquer l'horloge. La fréquence d'horloge est comprise entre 10 kHz et 16 kHz et on va utiliser la partie capture non pas pour mesurer la fréquence de l'horloge (dans un premier temps en tout cas), mais pour détecter les fronts descendants de l'horloge grâce au bit CCP1IF du registre PIR1.
Matériellement les deux signaux intéressants ps2_clk et ps2_data sont reliés au PORTC :
* ps2_clk est sur le bit b2 de PORTC
* ps2_data est sur le bit b1 de PORTC

### Question 1

Écrire le sous-programme "void initKBD(void)" destiné à initialiser le fonctionnement du module CCP pour qu’il intercepte les fronts descendants de PS2_clk, si les données ps2_data sont sont sur le bit b1 du PORTC. Ne pas oublier de mettre les deux bits du PORTC en entrée.
Voici le sous-programme en Hitech C
Voici le même sous-programme en MikroC

### Question 2

Écrire le programme principal qui lit les informations à chaque fois qu'un front descendant arrive et construit le bit du scan-code après lecture pour le sortir sur le PORTB (positionné en sortie).
Voici la solution pour le compilateur HitechC
Voici la même solution pour le compilateur MikroC qui peut être essayée avec la carte easyPIC5

### Question 3

Utiliser maintenant complètement le mode capture pour calculer la fréquence moyenne de l'horloge ps2_clk si notre fréquence de quartz est 4 Mhz.
Un quartz 4 Mhz est encore assez rapide pour évaluer la fréquence de 10 kHz sans interruption mais à l'aide d'une capture (donc avec attente du positionnement du bit CCP1IF). Le programme donné ci-après ne fait qu'afficher trois valeurs de mesure. Une simulation me donne 95 (au lieu de 100) pour les trois mesures. Dans un cas réel il serait bon de faire une moyenne sans prendre la première mesure qui est n’importe quoi puisqu'elle dépend de quand arrive le premier front descendant d'horloge.

#### Remarque

Le compilateur MikroC possède une librairie de lecture du PS/2.
| Prototype | void Ps2_Init(unsigned short *port); |
| Description | Initializes port for work with PS/2 keyboard, with default pin settings. Port pin 0 is Data line, and port pin 1 is Clock line. You need to call either Ps2_Init or Ps2_Config before using other routines of PS/2 library. |
| Prototype | void Ps2_Config(char *port, char clock, char data); |
| Description | Initializes port for work with PS/2 keyboard, with custom pin settings. Parameters data and clock specify pins of port for Data line and Clock line, respectively. Data and clock need to be in range 0..7 and cannot point to the same pin. You need to call either Ps2_Init or Ps2_Config before using other routines of PS/2 library. |
| Prototype | char Ps2_Key_Read(char *value, char *special, char *pressed); |
| Description | The function retrieves information about key pressed. Parameter value holds the value of the key pressed. For characters, numerals, punctuation marks, and space, value will store the appropriate ASCII value. Routine “recognizes” the function of Shift and Caps Lock, and behaves appropriately. Parameter special is a flag for special function keys (F1, Enter, Esc, etc). If key pressed is one of these, special will be set to 1, otherwise 0. Parameter pressed is set to 1 if the key is pressed, and 0 if released. |
Voici un exemple trouvé dans sa documentation :

## Exercice 2 (C18)

Idem à exercice 1 mais avec les PICs 18FXXXX.
questions 1-2) Le programme suivant m'a donné un résultat correct (en simulation) avec une horloge a 20 Mhz (et même à 4 Mhz) et une PS2Clock à 10 kHz. Il n'y a donc pas de problème de rapidité car la construction du scancode n’est pas faite au fur et à mesure mais après la saisie des bits dans un tableau.
Question 3
Un quartz 4 Mhz est encore assez rapide pour évaluer la fréquence de 10 kHz sans interruption mais à l'aide d'une capture (donc avec attente du positionnement du bit CCP1IF). Le programme donné ci-après ne fait qu'afficher trois valeurs de mesure. Une simulation me donne 95 (au lieu de 100) pour les trois mesures. Dans un cas réel il serait bon de faire une moyenne sans prendre la première mesure qui est n’importe quoi puisqu'elle dépend de quand arrive le premier front descendant d'horloge.
| Le mode comparaison du module CCP (Capture Compare PWM) | Le mode PWM du module CCP (Capture Compare PWM) |