Problème Timer0 PIC
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Problème Timer0 PIC



  1. #1
    invite8bf80359

    Question Problème Timer0 PIC


    ------

    Bonjour,
    Je souhaite réaliser un montage qui utilise le Timer0 d'un PIC16F871.

    J'ai d'abord créé un programme de test mais il ne marche pas

    Code:
    #define Led RC0
    
    #include <htc.h>
    
    char Timer0;
    
    static void interrupt inter(void)
    {
      if(T0IF)
      {
        Timer0 = 1;
        T0IF = 0;
      }
    }
    
    void main()
    {
      GIE=1;
      PEIE=1;
      OPTION=0b10000111;
      TMR0=0;
      T0IE=1;	
    
      ADCON1 = 6;
    
      TRISA=0b00000000;
      TRISB=0b00000000;
      TRISC=0b00000000;
      TRISD=0b00000000;
      TRISE=0b00000000;
    
      PORTA = 0;
      PORTB = 0;
      PORTC = 0;
      PORTD = 0;
      PORTE = 0;
    
      while(1)
      {
        if(Timer0)
        {
           Timer0 = 0;
           If(Led)
           {
             Led = 0;
           }else{
             Led = 1;
           }
        }
      }   
    }
    Je me suis inspiré de ce site : http://angeliz.free.fr/langagec/howto_timer0.htm

    Est-ce que quelqu'un pourrais m'aider à corriger mon code ?

    Merci d'avance,
    Guillaume

    PS. Mon compilateur C est HI-TECH.

    -----

  2. #2
    ElMamat

    Re : Problème Timer0 PIC

    Salut,
    je vois deux choses.
    La 1ere ta variable Timer0 doit etre declarée : volatile char Timer0;
    Et la 2eme d après la doc le registre OPTION se nomme OPTION_REG
    (cf la doc : To maintain upward compatibility with
    future PIC16F870/871 products, do not
    use the OPTION and TRIS instructions)

  3. #3
    invite8bf80359

    Re : Problème Timer0 PIC

    Merci pour votre réponse !
    J'ai modifié le OPTION en OPTION_REG et il y a une erreur de compilation : "identificateur "OPTION_REG" indefini" donc à mon avis c'est bien OPTION que je dois mettre.

  4. #4
    sdec25

    Re : Problème Timer0 PIC

    Bonjour.
    Le registre OPTION_REG se nomme bien OPTION dans le .h de HI-TECH.
    Sinon, ce serait bien d'être un peu plus précis que "il ne marche pas". On ne sait même pas ce que ce programme est censé faire.

  5. A voir en vidéo sur Futura
  6. #5
    invite8bf80359

    Re : Problème Timer0 PIC

    Le programme sert juste à faire clignoter une LED.
    Enfait le programme ne sort pas de la fonction "static void interrupt inter(void)" et donc ne retourne pas dans la fonction principale.

  7. #6
    sdec25

    Re : Problème Timer0 PIC

    Tu as testé le programme au simulateur pour savoir qu'il ne sort pas de la fonction d'interruption ? Si oui, il faudrait l'exécuter pas à pas en assembleur.

  8. #7
    invite8bf80359

    Re : Problème Timer0 PIC

    Non enfaite je le test directement en vrai (sur une plaque d'essai).
    Je ne sais pas comment faire pour le test pas à pas...

    J'ai fais comme sa pour tester :

    Code:
    #define Led1 RC0
    #define Led2 RC1 //J'ai ajouté une 2ème LED
    
    #include <htc.h>
    
    char Timer0;
    
    static void interrupt inter(void)
    {
      if(T0IF)
      {
        Led1 = 0;
        Led2 = 0; //La fonction appelée par l'interruption eteint les 2 LED
        Timer0 = 1;
        T0IF = 0;
      }
    }
    
    void main()
    {
      GIE=1;
      PEIE=1;
      OPTION=0b10000111;
      TMR0=0;
      T0IE=1;	
    
      ADCON1 = 6;
    
      TRISA=0b00000000;
      TRISB=0b00000000;
      TRISC=0b00000000;
      TRISD=0b00000000;
      TRISE=0b00000000;
    
      PORTA = 0;
      PORTB = 0;
      PORTC = 0;
      PORTD = 0;
      PORTE = 0;
    
      while(1)
      {
        if(Timer0)
        {
          Led1 = 1; //Si Timer0 == 1, c'est la 1ère LED qui s'allume
        }else{
          Led2 = 1; //Si Timer0 != 1, C'est la 2ème LED qui s'allume
        }
      }
    }
    Le problème c'est qu'aucune des 2 LED ne s'allume !

  9. #8
    invite5637435c

    Re : Problème Timer0 PIC

    Bonsoir,

    une variable utilisée en arrière plan comme en interruption doit être déclarée "volatile" donc dans ton cas "volatile char" puisque sa valeur est modifiée dans l'interruption et utilisée dans la main().

    Ensuite le problème est que cette variable n'est pas remise à 0 donc ta led s'allume et point.

    @+

    Edit: je n'avais pas lu que elMamat avais déjà répondu sur ce point...

  10. #9
    invite5637435c

    Re : Problème Timer0 PIC

    Code:
    #define Led RC0
    
    #include <htc.h>
    
    volatile char Timer0;
    
    static void interrupt inter(void)
    {
      if(T0IF)
      {
        Timer0 = 1;
        T0IF = 0;
      }
    }
    
    void main()
    {
      GIE=1;
      PEIE=1;
      OPTION=0b10000111;
      TMR0=0;
      T0IE=1;	
    
      ADCON1 = 6;
    
      TRISA=0b00000000;
      TRISB=0b00000000;
      TRISC=0b00000000;
      TRISD=0b00000000;
      TRISE=0b00000000;
    
      PORTA = 0;
      PORTB = 0;
      PORTC = 0;
      PORTD = 0;
      PORTE = 0;
    
      while(1)
      {
        if(Timer0)
        {
           Timer0 = 0;
           Led=~Led;
        }
       
      }   
    }

  11. #10
    invite8bf80359

    Re : Problème Timer0 PIC

    J'ai fais tes modifications mais la LED ne s'allume toujours pas.

  12. #11
    sdec25

    Re : Problème Timer0 PIC

    Et sans l'interruption les LED s'allument ou pas ?

  13. #12
    invite5637435c

    Re : Problème Timer0 PIC

    Faut dire qu'à 65ms tu ne risques pas de voir grand chose.

    Il faut ajouter une condition dans l'interruption:

    if(T0IF)
    {
    tick=tick+1;
    if(tick=10)
    {
    Timer0 = 1;
    tick=0;
    }
    T0IF = 0;
    }

    Je suppose que ton quartz est un 4MHz ce qui fait en gros 0,6s.
    n'oublies pas déclarer -> char tick; en tête et de l'initialiser à 0.
    @+

  14. #13
    invite5637435c

    Re : Problème Timer0 PIC

    Question bête, tu as mis ta led sur quel port et avec quelle résistance?

  15. #14
    invite8bf80359

    Re : Problème Timer0 PIC

    Et sans l'interruption les LED s'allument ou pas ?
    Oui elle s'allument.

    Je suppose que ton quartz est un 4MHz ce qui fait en gros 0,6s
    J'ai en effet un quartz de 4MHz.

    J'ai ajouté ta condition dans l'interruption et maintenant la LED s'allume au bout de 0.6 seconde mais ne s'éteint jamais.

    Question bête, tu as mis ta led sur quel port et avec quelle résistance?
    Sur le PORTC avec une résistance de 150ohm.

  16. #15
    invite8bf80359

    Re : Problème Timer0 PIC

    J'avais oublié de remettre sa : Timer0 = 0;

    Maintenant sa a l'air de marcher !
    Merci beaucoup de votre aide !!
    @+
    Guillaume

Discussions similaires

  1. frequence du timer0 sur pic
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 1
    Dernier message: 27/10/2008, 11h43
  2. programmation PIC (TIMER0)
    Par invite6a971ad3 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/06/2008, 12h48
  3. timer0: demande d'explication
    Par invite74119562 dans le forum Électronique
    Réponses: 2
    Dernier message: 11/05/2008, 17h48
  4. 4 secondes Timer0
    Par invite49060bcb dans le forum Électronique
    Réponses: 8
    Dernier message: 29/06/2006, 15h53
  5. PIC 16f876 et son Timer0 ...
    Par invite0e36b18a dans le forum Électronique
    Réponses: 1
    Dernier message: 04/04/2006, 00h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...