/******************************************************************** * Function: void ISR_CCP1(void) *******************************************************************/ void ISR_CCP3(void) // Interruption sur front montant sur RA2 { n_Mont = n_TMR1; if (!PulseOK) { n_TMR1 = 0; // On remet le compteur à zéro rise = n_Mont*65536 + ReadCapture3(); // Lit la valeur de CCP1 fall = n_Des*65536 + ReadCapture4(); // Lit la valeur de ECCP1 lowtime = rise - fall; // Largeur du front bas pulse_width = fall - lastrise; // Largeur du front haut => Presque inutile lastrise = ReadCapture3(); // Sauvegarde PulseOK = TRUE; // Indique qu'on a reçu un nouveu RF bit // printf("lowtime: %u us \r\n", lowtime); } }
void __ISR(_INPUT_CAPTURE_4_VECTOR) INT_IC4_Handler(void) { mIC4ClearIntFlag(); //Read captured timer values if(mIC4CaptureReady()) { IC4_CT_Rise = mIC4ReadCapture(); IC4_CT_Fall = mIC4ReadCapture(); } //Determine period if(IC4_CT_Rise > IC4_CT_Fall) period4 = (IC4_CT_Fall + PER_REG) - IC4_CT_Rise; else period4 = IC4_CT_Fall - IC4_CT_Rise; //Correct period if out of range if(period4 > ROLL_H - 3) period4 = ROLL_H; else if(period4 < ROLL_L + 3) period4 = ROLL_L; //Turn period into a percentage 0.0 thru 100.0% and //a Roll angle -ROLL_LIMIT to ROLL_LIMIT degrees if(zero_mode == 0) { if(period4 > rm + 5) { roll_pc = ((ROLL_H + period4 - (2.0 * rm)) / (ROLL_H - rm)) * 50.0; IC_ROLL = (PI * ((roll_pc - 50.0) / 100.0))/(90.0/ROLL_LIMIT); } else if(period4 < rm - 5) { roll_pc = ((period4 - ROLL_L) / (rm-ROLL_L)) * 50.0; IC_ROLL = (-1.0 * PI * ((50.0 - roll_pc) / 100.0))/(90.0/ROLL_LIMIT); } else { roll_pc = 50.0; IC_ROLL = 0.0; } } ReadCapture4(garbage); //clear any remaining capture values }