Aller au contenu


Photo
- - - - -

utiliser le timer0 sur pic 16F690


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 cynox

cynox

    Nouveau membre

  • Membres
  • 3 messages

Posté 24 août 2009 - 03:09

Bonjour a tous,

Je crois que tout est dans le titre. Sachant que je viens de debuter la programmation des PIC, je souhaite utiliser le module timer0 afin de creer une interruption toutes les x secondes.

Jutilise le pic 16F690 dont voici le datasheet datasheet pic16f690

Les infos sur le timer sont page 83-85.

Jutilise mikroC pour programmer en C.

En gros je souhaite compter le nombre d'interruptions et allumer des leds sur le port A apres un certain nombre d'interruptions. Mais sans succes, dapres ce que le debugger mindique lors de lexecution la variable temp nest jamais incrementé, comme si il ny avait pas dinterruption.

De plus, comment calcule t-on le temps entre deux interruptions en fonction du prescaler et de l'horloge?



voici mon code:


void interrupt(void);

void init()

{



// interrupts

INTCON.F7=1; //1 = Enables all unmasked interrupts

INTCON.F6=0;

INTCON.F5=1; //1 = Enables the Timer0 interrupt

INTCON.F4=0;

INTCON.F3=0;

INTCON.F2=0; // timer0 flag (reset)

INTCON.F1=0;

INTCON.F0=0;

OPTION_REG.F7=0;

OPTION_REG.F6=0;

OPTION_REG.F5=0; //0 = Internal instruction cycle clock (FOSC/4)

OPTION_REG.F4=0;

OPTION_REG.F3=0; //0 = Prescaler is assigned to the Timer0 module

OPTION_REG.F2=1; //prescaler rate 1:256

OPTION_REG.F1=1;

OPTION_REG.F0=1;





}



void interrupt(void)

{



temp=temp+1;



INTCON.F2=0;



}

///////////////////////////////////////////////////////////////////////////////

//variables



double temp=0;









void main()

{

init();

if(temp>100)

{

PORTA = 0b00001111;

}

}



[/code]



Pouvez vous m'aider?

merci d'avance

Cédric



#2 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 07 septembre 2009 - 09:55

L'initialisation me semble bonne...

Mais il te manque pas une boucle dans le main?

Pour le temps tu prend la fréquence de l'oscillateur interne (4MHz par défaut) divisé par 4 (1MHz) ce qui donne 1us. Le timer0 étant un compteur de 8 bits après 256us* le prescaler le compteur est plein. dans ton exemple 256*256us=65ms




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users