bonjour tout le monde.
Je cherche a commander un servomoteur a partir d'un pic18f4620.
Je n'ai pas de quartz donc la frequence d'oscillation est de 1Mhz.donc une incrementation tous les 4µs
Le lien entre le servo et le pic s'effectue par le pin RC2/CCP1 : je n'utilise pas le mode pwm car il semble qu'il est difficile d'obtenir une periode de 20ms
J'utilise donc le mode compare du pin ccp1 ainsi que le timer1 :
a chaque interruption du timer1 je genere un creneau de 20ms en sortie.
a chaque fois que timer1 prend la valeur de ccp1 que j'ai reglé (1ms ; 1,5ms ou 2ms en fonction de la position voulue) la sortie passe a 0.
Voici le code en C (le plus detaille possible...) malheureusement ca ne marche pas et je ne comprends pas pourquoi. est ce que quelqu'un pourrait me sauver la vie et trouver ce qu'il manque ou ce qui ne va pas?
/****************************** ****************************** ****************/
/* I N C L U D Es */
/****************************** ****************************** ****************/
#include <p18f4620.h>
/****************************** ****************************** ****************/
/* C O N F I G U R A T I O N */
/****************************** ****************************** ****************/
#pragma config OSC = INTIO67
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config BOREN = ON
#pragma config PBADEN = OFF
#pragma config LVP = OFF
#pragma config XINST = OFF
/****************************** ****************************** ****************/
/* P R O T O T Y P E S D E F O N C T I O N S */
/****************************** ****************************** ****************/
void Traiter_ItHaute (void);
void Init_compare(void);
void Config_Rapport_cyclique(unsign ed int iRap_Cyc);
/****************************** ****************************** ****************/
/* T R A I T E M E N T S D' I N T E R R U P T I O N */
/****************************** ****************************** ****************/
#pragma code high_vector_section=0x8
void high_vector (void)
{
_asm
GOTO Traiter_ItHaute
_endasm
}
#pragma code
#pragma interrupt Traiter_ItHaute
void Traiter_ItHaute (void)
{
if(PIR1bits.TMR1IF) // traite l'interruption due à TMR1
{
PORTCbits.RC2=1; // Sortie passe à 5V
TMR1H=0xEC; TMR1L=0x78; // Reinitialise le compteur pour 20mS
PIR1bits.TMR1IF=0;
}
if(PIR1bits.CCP1IF) // traite l'interruption du au CCP
{
PORTCbits.RC2=0; // Sortie passe à 0V
PIR1bits.CCP1IF=0;
}
} // Fin de la fonction de traitement d'interruption
/****************************** ****************************** ****************/
/* F O N C T I O N P R I N C I P A L E */
/****************************** ****************************** ****************/
void main(void)
{
TRISCbits.TRISC2=0; //Configure le pin 2 du port C en sortie
PORTCbits.RC2=0;
T3CONbits.T3CCP1=0; //configure ccp1 avec timer1 et non timer3
INTCONbits.GIE=1; //autorisation globale
PIE1bits.CCP1IE=1; //autorisation de l interruption ccp
PIE1bits.TMR1IE=1; //Autorise interruption du au débordement de TMR1
Init_compare(); // Initialise les registres en mode comparaison
T1CONbits.TMR1ON=1; // Active le Timer 1
Config_Rapport_cyclique(0xED72 ); // Servo à gauche
//Config_Rapport_cyclique(0xEDEF ); // Servo au centre
//Config_Rapport_cyclique(0xEE6C ); // Servo à droite
while(1);
}
void Init_compare(void)
{
TMR1H=0xEC; TMR1L=0x78; // Initialisation de TMR1
// 0xEC78=65536-20000µS/4µS
CCPR1H=0xED; CCPR1L=0xEF; // Initalisation du servo au centre
CCP1CON=0b00001010; // Si comparaison réussie CCP1IF passe à 1
T1CON=0b00000000; // choix de la prédivision
}
void Config_Rapport_cyclique(unsign ed int iRap_Cyc)
{
CCPR1L=iRap_Cyc & 0xFF; // Copie l'octet bas de iRap_Cyc dans CCPR1L
CCPR1H=iRap_Cyc>>8; // Décale l'octet haut de iRap_Cyc dans son octet bas,
} // et copie dans CCPR1H.
MERRRCCI
-----