salut

j'ais pas compris l'utilisation du CCP1 pour calculer le temps entre l'envoi du signal et la reception dans ce exemple on veux afficher la distance entre le capteur et un
obstacle
Capteur Ultrason HC-SR04 sur PIC16F877A

Code:
/*
 * Project name:
     Test du HC-SR04
 * Test configuration:
     MCU:             PIC16F877A
     Oscillator:      HS, 12.0000 MHz
     Ext. Modules:    Character LCD 2x16
                      HC-SR04
     SW:              mikroC PRO for PIC
*/
// LCD connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB6_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD connections


char txt1[] = "Test du capteur";
char txt2[] = "HC-SR04";
char txt3[] = "Distance :";
char txt4[7];
unsigned long Cumul;
unsigned tWord,tOld, tNew;
char th,tl;
char edge = 0;
char capture = 0;
float temps = 0;
float distance = 0;
float distance2 = 0;


void interrupt() {

  if(PIR1.CCP1IF){                 //Si PIR1.CCP1IF égal à 1
    if(!edge){                     //Si edge égal à 0
      CCP1CON = 0x04;              // Mode de capture a chaque front descendant
      tOld = 256*CCPR1H + CCPR1L;      //garde la valeur de départ
      edge = 1;                        //edge prend la valeur 1
    }else{
      tNew =256*CCPR1H + CCPR1L;     //garde la valeur de fin
      capture = 1;                   //indicateur capture términée
      edge = 0;                      //edge prend la valeur 0
    }
    PIR1.CCP1IF = 0;               //remise à 0 du flag (PIR1.CCP1IF)
  }

}


void main() {

  char i;
  TRISB = 0;       // PORTB en sortie
  PORTB = 0;       // Initialisation du PORTB
  TRISA = 0;       // PortA en sortie
  PORTA = 0x00;    // Initialisation du PORTA
  TRISC = 0;       // PortC en sortie
  CCP1CON = 0x05;           // Mode de capture a chaque front montant
  TRISC.F2 = 1;             // RC2 en entré
  T1CON = 0x21;             // timer1 ON, internal clock Fosc/4, prescaler 1:4
  INTCON.GIE = 1;
  INTCON.PEIE =1;
  PIE1.CCP1IE = 1;           // active la capture par interruption
  PIR1.CCP1IF = 0;           //remise à 0 du flag (PIR1.CCP1IF)

  Lcd_Init();                        // Initialisation du LCD

  Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Desactivation du curseur
  Lcd_Out(1,2,txt1);                 // Ecrire text 1
  Lcd_Out(2,6,txt2);                 // Ecrire text 2
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD

  PORTA = 0x01;                      //    Envoi une impulsion
  Delay_us(10);                      //    de 10 microsecondes
  PORTA = 0x00;                      //    dans la broche RA1

  while(1)
  {
    if(capture){
    PIE1.CCP1IE = 0;                //desactive  la capture par interruption
    capture = 0;                    // Capture prend la valeur 0
    tWord = ~tOld + tNew+1;           //Calculer la longueur de l'impulsion de front montant à front montant
    CCP1CON = 0x05;                   // Mode de capture a chaque front montant
    
    // tword contiennent longueur d'impulsion en micro seconde
  
    temps =((float)tWord*4)/3;
    distance = ((float)temps*17)/1000;       //calcul de la distance en cm
    floatToStr(distance,txt4);
  
    Delay_ms(70);
    PIR1.CCP1IF = 0;                 //remise à 0 du flag (PIR1.CCP1IF)
    PIE1.CCP1IE = 1;                 // enable interrupt
    
    if(distance !=distance2){
      Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Desactivation du curseur
      Lcd_Out(1,1,txt3);                 // Ecrire text 3
      Lcd_Out(2,8,txt4);                 // Afficher distance
    }
    
    distance2 = distance;
    PORTA = 0x01;                      //    Envoi une impulsion
    Delay_us(10);                      //    de 10 microsecondes
    PORTA = 0x00;                      //    dans la broche RA1
    }
  }
}
merci beaucoup