Utiliser les PIC 16F et 18F/Exercices/Le mode capture du module CCP (Capture Compare PWM)

Le mode capture du module CCP (Capture Compare PWM)
Image logo représentative de la faculté
Exercices no10
Leçon : Utiliser les PIC 16F et 18F
Chapitre du cours : Le mode capture du module CCP (Capture Compare PWM)

Exercices de niveau 15.

Exo préc. :Le mode comparaison du module CCP (Capture Compare PWM)
Exo suiv. :Le mode PWM du module CCP (Capture Compare PWM)
En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Le mode capture du module CCP (Capture Compare PWM)
Utiliser les PIC 16F et 18F/Exercices/Le mode capture du module CCP (Capture Compare PWM)
 », n'a pu être restituée correctement ci-dessus.




Exercice 1 : Utilisation du mode capture pour lire un clavier PS2

modifier

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

modifier

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.

 
Protocole PS2

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

modifier

É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.

Question 2

modifier

É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).

Question 3

modifier

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.

Remarque

modifier

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 :

unsigned short keydata, special, down; 
void main() { 
  CMCON = 0x07;     // Disable analog comparators (comment this for PIC18) 
  INTCON = 0;       // Disable all interrupts 
  Ps2_Init(&PORTA); // Init PS/2 Keyboard on PORTA 
  Delay_ms(100);    // Wait for keyboard to finish 
  do { 
    if (Ps2_Key_Read(&keydata, &special, &down)) { 
       if (down && (keydata == 16)) {// Backspace 
         // ...do something with a backspace... 
       } 
       else if (down && (keydata == 13)) {// Enter 
         Usart_Write(13); 
       } 
       else if (down && !special && keydata) { 
         Usart_Write(keydata); 
       } 
    } 
    Delay_ms(10);     // debounce 
  } while (1); 
}//~!

Exercice 2 (C18)

modifier

Idem à exercice 1 mais avec les PICs 18FXXXX.