Boujour,
Je veux réaliser un échantillonnage périodique (300Hz) pour pouvoir faire un asservissement.
J'utilise donc le timer et une interuption :
configuration_timer+interuptio n :
Code:// on va créer le timer OpenTimer1(TIMER_INT_ON & T1_8BIT_RW& T1_SOURCE_INT & T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF); // On autorise toutes les interruptions INTCONbits.GIE = 1; INTCONbits.PEIE = 1;
fonction_interuption :
Code:volatile short temporisation; volatile signed int test; void MyInterrupt(void); // on déclare que lors d'une interruption #pragma code highVector=0x008 void atInterrupthigh(void) { // on doit éxecuter le code de la fonction MyHighInterrupt _asm GOTO MyInterrupt _endasm } #pragma code // retour à la zone de code // ************************ // **** Interruptions **** // ************************ #pragma interrupt MyInterrupt void MyInterrupt(void) { unsigned char sauv1; unsigned char sauv2; // on sauvegarde le contenu des registres de calcul sauv1 = PRODL; sauv2 = PRODH; // c'est le Timer1 qui a levé l'interruption if (PIR1bits.TMR1IF) { // on va réautoriser l'interruption PIR1bits.TMR1IF = 0; if (temporisation >= 65) { // on remet à 0 pour le prochain timer temporisation = 0; test = adc(POT1); } else { // on incrémente notre variable compteur temporisation++; } } // on restaure les registres de calcul PRODL = sauv1; PRODH = sauv2; }
J'utilise :
-quartz 20MHz sans PLL
-le timer1 sur 8 bit.
D'après mes calculs ma prériode devrait être de :
T=4/(20e^6)*2^8 *65= 3.33ms =>300Hz
Mais avec "STOPWATCH" le résultat me donne 865ms
Après réflexion je m'aperçoit que T=4/(20e^6)*2^16*65=851ms
Le timer est bien configuré en 8 bits mais j'ai l'impression qu'il reste quand même sur 16 bits.
Auriez-vous une idée pour résoudre mon problème ou bien une autre solution pour faire un échantillonnage ?
Merci d'avance pour votre aide.
-----