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.