bonjour,
j'utilise le dsPIC33fj256gp710, je dois réaliser un programme avec le mode capture pour pouvoir lire une fréquence. le problème est que mon programme ne passe pas la boucle de capture et je ne comprends pas pourquoi. pouvez vous m'aider à trouver l'erreur svp?
voici le code utilisé:
//cette fonction fonctionne
void Frequency(uint32 frequency )
{
uint32 periode;
if (frequency >= 200)
{
T1CONbits.TCKPS=1;
periode= (0.5* 10000000) / frequency ;
PR1= periode / (4* 0.25 * T1CONbits.TCKPS);
PR1=PR1/2;
}
if (frequency < 200)
{
T1CONbits.TCKPS=2;
periode= (0.5* 10000000) / frequency ;
PR1= periode / (4* 0.25 * T1CONbits.TCKPS);
PR1=PR1/8;
}
if (frequency <= 50)
{
T1CONbits.TCKPS=3;
PR1= (77000/frequency);
}
}
// initialisation du timer 2 qui me sert dans la capture
void Init_timer2( void )
{
TMR2 = 0; // clear timer1 register
PR2 = TMR2_PERIOD; // set period1 register
T2CONbits.TCS = 0; // set internal clock source
T2CONbits.TCKPS = 0; // set prescaller div by 1
IFS0bits.T2IF = 0; // clear interrupt flag
IEC0bits.T2IE = 1; // enable interrupts
SRbits.IPL = 3; // enable CPU priority levels 4-7
T2CONbits.TON = 1; // start the timer
}
// initialisation de la capture
void init_capture ()
{
IC1CONbits.ICM = 0b00; // Disable Input Capture 1 module
IC1CONbits.ICTMR = 1;
IC1CONbits.ICI = 0b11; // Interrupt on every second capture event
IC1CONbits.ICM = 0b011;
IC1CONbits.ICBNE = 0;
IC1CONbits.ICOV = 0;
IC1CONbits.ICSIDL = 0;
IPC0bits.IC1IP = 1; // Setup IC1 interrupt priority level
IFS0bits.IC1IF = 0; // Clear IC1 Interrupt Status Flag
IEC0bits.IC1IE = 1;
}
unsigned int timePeriod= 0;
void __attribute__((__interrupt__, no_auto_psv)) _T2Interrupt(void)
{
IFS0bits.T2IF = 0;
}
// aparament le pb se trouve dans cette boucle car le compilateur MPLab ne passe pas dedans
void __attribute__((__interrupt__, no_auto_psv)) _IC1Interrupt(void)
{
unsigned int t1,t2,frequence;
t1=IC1BUF;
t2=IC1BUF;
IFS0bits.IC1IF=0;
timePeriod = t2-t1;
frequence= 1 / timePeriod;
}
int main(void)
{
int frequence;
// Effacer toutes les interruptions
clearIntrflags();
// Initialiser le timer1
Init_timer();
Init_timer2();
init_capture ();
je vous remercie de l'aide que vous pourrez m'apporter
-----