Bonjour,
J'ai écrit un programme qui produit un signal PWM (1.2 ms d'impulsion pour 20 ms de période) en utilisant le module compare du module CCP d'un pic 16F877 - quartz de 8Mhz.
J'ai bien un signal à impulsion sur l'oscillo, mais les valeurs de temps sont fausses.
J'utilise le timer1 sur 16bits, pré diviseur de 8. Donc avec un quartz de 8Mhz ça donne :
1/(8000000/4/8) = 4µs par cycle.
comptant de 0 à 65536, pour 1.2 ms j'aurais 300 cycles.
et pour 18.8ms (le temps de latence) 4700 cycles.
Pourtant à l'oscillo, j'ai 0.8ms d'impulsion pour 10ms de temps de latence.
Voici le programme en C, compilateur MikroC :
Merci d'avance pour votre aideCode:void interrupt () { if (PIR1.CCP1IF == 1) //Si Valeur d'égalité atteinte { PORTC.F2 = 0; PIR1.CCP1IF = 0; //Flag remis à 0 par soft TMR1H = 0xDC; TMR1L = 0xD8; PORTB.F3 = 1; PORTB.F4 = 0; } if (PIR1.TMR1IF == 1) //Si débordement du Timer1 { PORTC.F2 = 1; TMR1H = 0x00; //Init. Timer1 TMR1L = 0x00; PIR1.TMR1IF =0; PORTB.F3 = 0; PORTB.F4 = 1; } } void main() { TRISC = 0; PORTC = 0; //Port C en sortie TRISB = 0; PORTB = 0; T1CON = 0b00110001; //prédiv timer1 de 8 //Timer1 en service INTCON=0b11000000; // GIE = 1 & PEIE = 1 //Autorise toutes les It PIE1.TMR1IE=1; // Autorisation intérruption TIMER 1 PIR1.TMR1IF = 0; // clear TMR1IF CCP1CON = 0b00001010; //module CCP en mode compare //Interruption à l'égalité //Flag CCP1IF = 1 à l'égalité CCPR1H = 0b00000010; CCPR1L = 0b01011000; //valeur d'égalité = 1.2ms PIR1.CCP1IF = 0; PIE1.CCP1IE = 1; //Autorise les IT du mode compare TMR1H = 0; //Init. Timer1 TMR1L = 0; PORTC.F2 = 1; while(1) { PORTB.F1 = 1; } }
-----