Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

Pic 16f887 timer0



  1. #1
    Snoopy85

    Pic 16f887 timer0

    Bonjour à tous,

    Je souhaite réaliser une commande moteur dont le mouvement est mémorisé par apprentissage.

    Je suis une vraie "bille" en programmation, mais j'aime me creuser la tete et essayer de comprendre les choses.

    Première étape, je veux déclencher mon TIMER0 à partir d'un front montant sur RB0. A chaque débordement du TIMER0, j'incrémente une variable . Au prochain front montant sur RB0, le compteur s'arrete, et je mémorise la valeur.

    J'ai farfouillé un peu partout sur le net mais j'avoue qu'à force je commence à tout mélanger...

    Voici mon code: (on ne rigole pas svp )

    void init_timer(void)
    {
    OPTION_REG=0x57; //Horloge interne, RB0 sur FRONT MONTANT, div par 256
    INTCON = 0xB0; // Activation des interruptions sur RB0
    PORTB = 0;
    TRISB = 1; // PORTB EN ENTREE
    PORTC = 0;
    TRISC = 0;
    PORTD = 0;
    TRISD = 0;
    PORTA = 0;
    TMR0=0;
    }


    void interrupt (unsigned long x)
    {
    if (INTCON.INTF) // si interruption
    { VAL_TEMPS=VAL_TEMPS++;

    INTCON.INTF=0; //RAZ du flag
    x=VAL_TEMPS+TMR0;
    }


    void main()
    { init_timer();
    }


    Merci à tout ceux qui prendront la peine de me lire!

    -----


  2. Publicité
  3. #2
    gedonet

    Re : Pic 16f887 timer0

    Bonjour
    Tu dis vouloir incrementer TIMER0 sur un front montant et tu choisis RB0, ce n'est pas la bonne solution, choisis l'entrée RA4, ensuite tu configures TIMER0 en compteur, bit TOCS=1, tu choisis le front montant, bit TOSE=0 de cette maniere chaque front montant sur RA4 incrementera TIMER0. Il te reste à reseter TIMER0 au debut du comptage, voir à choisir un eventuel prediviseur avec les bits PSA et PS2/PS0 de OPTION_REG.
    Je ne te donnerai pas de code en c, je ne pratique pas.
    Gilles

  4. #3
    Snoopy85

    Re : Pic 16f887 timer0

    Bonsoir gedonet et merci pour ta réponse.

    Je me suis mal exprimé, ce que je souhaite faire, c'est mesurer et mémoriser le temps écoulé entre 2 appuis sur un bouton poussoir.

    Concretement je commande un moteur, c'est pour mémoriser la course qu'il doit effectuer.

  5. #4
    Snoopy85

    Re : Pic 16f887 timer0

    Me revoilà j'ai avancé un petit peu: quand RB0 passe à 1, j'entre bien dans ma routine d'interruption, dans laquelle je déclenche le TIMER0, jusqu'ici tout vas bien.

    Mais où je bloque, c'est pour sortir de ma routine d'interruption lors du prochain front montant sur RB0... Je ne sais pas comment m'y prendre, je reste bloqué!

    Voici mon code tout simple:

    Code:
    unsigned int x;
    void interrupt (void)
    {    INTCON.T0IE=1;   // lancement du TIMER0
    
         if (INTCON.T0IF)
         {  INTCON.INTF=0;
            x++;
              if(x==10000)
              { PORTC=~PORTC;        // Clignotement du PORTC
                x=0;
                TMR0=0;
                INTCON.T0IF=0;}
          }
        if(INTCON.INTF){            // Et là je voudrais sortir de l'interruption lors du prochain changement sur RB0, je ne sais pas comment faire
          INTCON.INTF=0;
          INTCON.T0IF=0;
          INTCON.T0IE=0;}
         }
    
    void main(void)
    {
         ANSEL=0;
         ANSELH=0;
          OPTION_REG=0x57;      //Horloge interne, RB0 sur FRONT MONTANT, div par 256
         INTCON = 0x90;        //  Activation des interruptions   sur RB0
         PORTB = 0;
         TRISB = 0xFF;         // PORTB EN ENTREE
         PORTC = 0;
         TRISC = 0x00;         // PORTC EN SORTIE
         TMR0=0;
    do{}       while(1);    // Attentente interruption
    }
    A l'aide s'il vous plait
    Merci!

  6. #5
    HULK28

    Re : Pic 16f887 timer0

    Bonjour,

    déjà vos déclaratifs d'autorisations d'interruptions ne vont pas.
    Ce n'est pas dans l'interruptions que vous devez placer TOIE, et il faut au lancement de votre programme déclarer actives l' interruption globale (GIE), ce que vous avez bien fait visiblement dans INTCON.
    Il faut raisonner par drapeaux qui seront détectés rapidement dans l'interruption puis traités dans le programme principal et réinitialisés.
    TOIE sera a valider dans le programme principal dès que l'appui du B.P sera fait.
    Timer0 sera lancé et incrémentera une variable, puis si appui sur B.P de nouveau vous stoppez le comptage en faisant TOIF=0, et vous récupérez la variable correspondant au temps entre les 2 appuis.
    Dernière modification par HULK28 ; 07/03/2009 à 10h47.

  7. A voir en vidéo sur Futura
  8. #6
    HULK28

    Re : Pic 16f887 timer0

    Code:
    unsigned volatile int x;
    
    void interrupt (void)
    {  
         if(INTCON.TOIF==1)
          {
           TOIF=0;
          TMR0=0;
           x++;
           if(x==10000)
               {
               PORTC=~PORTC;        // Clignotement du PORTC
               x=0;
               } 
         }
    
         if (start==1 && INTCON.INTF==1) 
         {
          TOIE=0;                
         }
     }   
    void main(void)
    {
         ANSEL=0;
         ANSELH=0;
          OPTION_REG=0x57;      //Horloge interne, RB0 sur FRONT MONTANT, div par 256
         INTCON = 0x90;        //  Activation des interruptions   sur RB0
         PORTB = 0;
         TRISB = 0xFF;         // PORTB EN ENTREE
         PORTC = 0;
         TRISC = 0x00;         // PORTC EN SORTIE
         TMR0=0;
         x=0;  // init variable
          while(1);    // programme principal
        {
        if(INTCON.INTF == 1 && start == 0)
          {
            INTCON.TOIE=1; //interruption Timer0 autorisée
            start=1; // comptage autorisé
            INTCON.INTF=0; // flag interruption réinitialisé
          }    .........
       } 
    }
    A tester.

  9. Publicité
  10. #7
    Snoopy85

    Re : Pic 16f887 timer0

    Merci beaucoup pour votre aide.

    J'ai testé votre code, je rentre bien dans ma boucle d'interruption après un appui sur B.P, mais le timer ne se déclenche pas.

    J'ai l'impression que dès que le flag INTF passe à "1" on rejoint directement la boucle d'interruption, sans se soucier de ce qu'il y a ensuite dans le main:

    Code:
    if(INTCON.INTF == 1 && start == 0)
          {
            INTCON.TOIE=1; //interruption Timer0 autorisée
            start=1; // comptage autorisé
            INTCON.INTF=0; // flag interruption réinitialisé
          }    ..
    Petite remarque sur la variable "start": je l'ai défini en char, et je la met à "0" avant la boucle while(1) (comme la variable x), peut-etre ai-je mal fait?

    Merci encore!

  11. #8
    HULK28

    Re : Pic 16f887 timer0

    Citation Envoyé par Snoopy85 Voir le message
    Petite remarque sur la variable "start": je l'ai défini en char, et je la met à "0" avant la boucle while(1) (comme la variable x), peut-etre ai-je mal fait?
    Vous avez très bien fait, il fallait déclarer la variable start et l'initialiser.

    Lorsque vous appuyer sur le BP il y a des rebonds qui font entrer de suite dans l'interruption.
    Il faut filtrer ces rebonds pour éviter cela.
    Code:
    if(INTCON.INTF == 1 && start == 0)
          {
            INTCON.INTE=0; // on bloque l'interruption INT
            INTCON.T0IE=1; //interruption Timer0 autorisée
            start=1; // comptage en interruption du Timer0 autorisé        
            Delay_ms(200); // à affiner selon le B.P ici 200ms        
            INTCON.INTF=0; // flag interruption réinitialisé
            INTCON.INTE=1; // on autorise de nouveau INT
          }    .........

  12. #9
    HULK28

    Re : Pic 16f887 timer0

    Quelle est la valeur de votre quartz?

    Si c'est 4MHz la variable x va s'incrémenter toutes les 65536µs donc la led ne clignotera que toutes les 655s/2=5mn...

    Il vaut mieux mettre la led à clignoter à chaque incrémentation de x soit toutes les 120ms environ (8Hz) pour visualiser que le comptage est en cours.

    Code:
    void interrupt (void)
    {  
         if(INTCON.TOIF==1)
          {
           TOIF=0;
           TMR0=0;
           x++;
           PORTC=~PORTC;
           }
    
         if (start==1 && INTCON.INTF==1) 
         {      
          TOIE=0;                
         }
     }

  13. #10
    Snoopy85

    Re : Pic 16f887 timer0

    J'utilise un quartz de 8MHz. En fait je fais mes tests sur la platine de développement easypic5, et je code avec mikroC.

    J'ai suivi vos précieux conseils concernant l'antirebond de mon bouton poussoir.

    Malheureusement je reste toujours bloqué dans ma boucle interrupt. Mon portC change bien d'état à chaque débordement du timer, mais lorsque j'appuis à nouveau sur mon B.P, rien ne change.

    Code:
    unsigned int x;
    char start;
    void interrupt (void)
    {
         if(INTCON.T0IF==1)
          {
           INTCON.T0IF=0;
           TMR0=0;
           x++;
           PORTC=~PORTC;
           }
    
         if (start==1 & INTCON.INTF==1)
         {
          INTCON.T0IE=0;
         }
     }
    
    void main(void)
    {
         ANSEL=0;
         ANSELH=0;
         OPTION_REG=0x57;      //Horloge interne, RB0 sur FRONT MONTANT, div par 256
         INTCON = 0x90;        //  Activation des interruptions   sur RB0
         PORTB = 0;
         TRISB = 0xFF;         // PORTB EN ENTREE
         PORTC = 0;
         TRISC = 0x00;         // PORTC EN SORTIE
         TMR0=0;
         x=0;                  // init variables
         start=0;
          while(1);    // programme principal
        {
    
        if(INTCON.INTF == 1 & start == 0)
          {
            INTCON.INTE=0; // on bloque l'interruption INT
            INTCON.T0IE=1; //interruption Timer0 autorisée
            start=1; // comptage en interruption du Timer0 autorisé
            Delay_ms(200); // à affiner selon le B.P ici 200ms
            INTCON.INTF=0; // flag interruption réinitialisé
            INTCON.INTE=1; // on autorise de nouveau INT
         }
        }
    }
    Petite info: si je supprime la condition dans la boucle infinie, cela n'a aucune incidence

  14. #11
    Snoopy85

    Re : Pic 16f887 timer0

    petite faute de copier/coller: jai mis des "&" au lieu de "&&" dans mes conditions "if()" .suite à différents test et jai oublier de les remettre.

  15. #12
    HULK28

    Re : Pic 16f887 timer0

    Bonjour,

    comment avez-vous câblé votre B.P?
    Il faut qu'il soit entre INT0 et la masse, la résistance de pull-up interne faisant le tirage au Vcc.
    L'interruption se fera non pas à l'appui mais au relachement du B.P.
    Merci de confirmer ce point.

  16. Publicité
  17. #13
    HULK28

    Re : Pic 16f887 timer0

    Le code à implanter et bien vérifier les cavaliers de la carte Easypic.
    Ca doit tourner.
    Code:
    unsigned volatile int x;
    char start;
    
    void interrupt (void)
    {  
         if(INTCON.T0IF==1)
          {
           T0IF=0;      
           x++;
           if(x==10000)
               {
               PORTC=~PORTC;        // Clignotement du PORTC
               x=0;
               } 
         }
    
         if (start==1 && INTCON.INTF==1) 
         {
          T0IE=0;                
         }
     }   
    void main(void)
    {
         ANSEL=0;  // I/O en digital.
         ANSELH=0;
         OPTION_REG=0xC7;      //Horloge interne, RB0 sur FRONT MONTANT, prescaler 256
         INTCON = 0x90;        //  Activation des interruptions   sur RB0
         TRISB = 0xFF;         // PORTB EN ENTREE
         PORTC = 0;
         TRISC = 0x00;         // PORTC EN SORTIE
         TMR0=0;
         x=0;  // init variable
         while(1)    // programme principal
        {
        if(INTCON.INTF == 1 && start == 0)
          {
            INTCON.T0IE=1; //interruption Timer0 autorisée
            start=1; // comptage autorisé
            INTCON.INTF=0; // flag interruption réinitialisé
          }    .........
       } 
    }
    Dernière modification par HULK28 ; 09/03/2009 à 11h15. Motif: OPTION_REG mis à sa bonne valeur

  18. #14
    Snoopy85

    Re : Pic 16f887 timer0

    Bonjour,

    Voici le lien vers le manuel d'utilisateur de ma platine:
    http://www.mikroe.com/pdf/easypic5/easypic5_manual.pdf
    Ca se situe en page 20 et 21.

    En fait mon B.P est entre VCC et INT0 (J17 est sur VCC). Quand j'appuie sur le BP, j'ai 5V sur INT0. Quand je relâche, j'ai 0V (J2 est sur GND).
    Pour résumer je suis dans la même config que la fig.25 page 21 (tous mes switchs sont ON).

  19. #15
    HULK28

    Re : Pic 16f887 timer0

    Vous déclarez les pull-up du PIC et vous mettez un pull-down avec J2...
    Dans ce cas il faut dévalider les pull-up en mettant RBPU à 1 dans OPTION_REG (bit7) -> OPTION_REG=0xC7.

  20. #16
    Snoopy85

    Re : Pic 16f887 timer0

    Oups la boulette je croyais qu'il fallait mettre RBPU à 0...

    Voilà qui est rectifié mais on en est toujours au même point, c'est à se demander si c'est réellement possible.

    En plus quand j'enlève l'instruction INTCON.T0IE=1, le compteur du timer0 se déclenche quand même . Je nage complètement

  21. #17
    HULK28

    Re : Pic 16f887 timer0

    Curieux ça devrait fonctionner pourtant.
    Je vais regarder en mode debugger et je vous tiens au courant.

  22. #18
    Snoopy85

    Re : Pic 16f887 timer0

    Merci infiniment pour votre aide!

  23. Publicité
  24. #19
    HULK28

    Re : Pic 16f887 timer0

    Code:
    unsigned volatile int x;
    unsigned volatile char start;
    
    void interrupt ()
    {
         if(INTCON.T0IF == 1)
           {
           x++;
           PORTC = ~PORTC;
           TMR0 = 0;
           INTCON.T0IF = 0;
           }
    
         if(start == 1 && INTCON.INTF == 1)
           {
           INTCON.T0IE = 0;
           }
     }
     
    void main()
    {
         x=0;
         start=0;
         ANSEL  = 0;  // I/O en digital.
         ANSELH = 0;
    
         OPTION_REG = 0xC7;  //bit7-> RBPU=1 (off), bit6 -> INTEDG=1 (front montant)
                             //bit5-> T0CS=0 (fosc/4), bit4-> TOSE=0
                             //bit3-> PSA=0 (prescaler timer0), bit<3:0> 111 -> :256
                             // => OPTION_REG=0x11000111=0xC7
         
         INTCON = 0x90;      //bit7-> GIE=1, bit6-> PEIE=0, bit5-> T0IE=0
                             //bit4-> INTE=1, bit3-> RBIE=0, bit2->T0IF=0
                             //bit1-> INTF=0, bit0-> RBIF=0
                             // => INTCON=0x10010000=0x90
                             
         TRISB = 0xFF;       // PORTB tout en entrée
         PORTC = 0;
         TRISC = 0x00;       // PORTC tout en sortie
         TMR0=0;
              
         while(1)    // programme principal
              {
              if(INTCON.INTF == 1 && start == 0)
                {
                INTCON.INTE = 0; // on bloque l'interruption INT
                INTCON.T0IE = 1; //interruption Timer0 autorisée
                start = 1;       // comptage en interruption du Timer0 autorisé
                Delay_ms(200); // à affiner selon le B.P ici 200ms
                INTCON.INTF = 0; // flag interruption réinitialisé
                INTCON.INTE = 1; // on autorise de nouveau INT
                }
              }
    }
    Tout semble correct, essayer ce code et dites moi ce que ça donne.
    @+

  25. #20
    Snoopy85

    Re : Pic 16f887 timer0

    Toujours pas de résultats!

    Je commence à me demander si le probleme ne viendrait pas de mikroC !
    Je ne peux meme pas activer le mode in circuit debugger pour voir ce qui bloque et où ça bloque.

    Je vous fait confiance si vous dites que votre code est correct. Je vais me pencher sur mon matériel

  26. #21
    HULK28

    Re : Pic 16f887 timer0

    Je n'ai pas de cible 887 mais je peux essayer sur ma EasyPIC avec un 877 dès que j'aurais 5mn.
    Il y a surement une bonne raison à votre problème, mais ça ne vient pas du compilo c'est sûr, j'arrive à debugger de mon coté.
    Quelle version de mikroC avez-vous?
    Pour moi c'est la 8.2.

    @+

  27. #22
    Snoopy85

    Re : Pic 16f887 timer0

    J'ai la version 8.2.0.0 également. Je n'ai jamais réussi à me mettre en mode debugger, pourtant c'est un mode bien utile!

    Vous avez également une easypic5?

  28. #23
    HULK28

    Re : Pic 16f887 timer0

    Oui et une BigPic5 pour les gros 18F.

    Pour le debugger vous sélectionnez "Debugger" puis "select debugger" et "MikroICD debugger", vous faites un Build en cliquant sur l'icône dans la barre verticales à droite de votre IDE (bord d'écran droite mi-hauteur).
    N'oubliez pas de mettre des points d'arrêts et allez-y en mode pas à pas.
    Il faut cliquer également sur "Run" et F9 pour lancer le debugger.
    Lisez bien le manuel c'est assez clair.
    Votre PC est bien équipé d'USB 2.0?
    Sans quoi ça ne fonctionnera pas en 1.1.
    @+

  29. #24
    Snoopy85

    Re : Pic 16f887 timer0

    Mon pc est bien équipé de ports usb 2.0

    Quand je lance le debugger, j'ai ce message d'erreur:

    "Build type Release, ICD required for debugging"

    En sachant que dans la partie "build type" de "project setup" je ne peut pas cocher la case "mikroICD debug" car je n'ai que la case "Release"...

    @+

  30. Publicité
  31. #25
    Snoopy85

    Re : Pic 16f887 timer0

    Vous n'allez peut-etre pas me croire mais... Je crois que ça fonctionne!!!

    J'appuie sur mon BP, ça lance mon timer en mode compteur. J'appuie à nouveau sur mon BP, mon compteur s'arrete et je sors de ma boucle d'interruption!!!

    Voici mon (ou plutot NOTRE code):

    Code:
    unsigned volatile int x;
    unsigned volatile char start;
    
    void interrupt ()
    {
         if(INTCON.T0IF)
           {
           x++;
           PORTC = ~PORTC;
           TMR0 = 0;
           INTCON.T0IF = 0;
           }
          if(INTCON.INTF && start==0)   // 1er appui sur B.P
          {PORTC=0xFF;
          INTCON.INTE=0;}
          if(INTCON.INTF && start==1)   //2eme appui sur B.P
          {PORTC=0xFF;
          start++;
          INTCON.INTE=0;}
          
    
     }
    
    void main()
    {
         x=0;
         start=0;
         ANSEL  = 0;  // I/O en digital.
         ANSELH = 0;
    
         OPTION_REG = 0xC7;  //bit7-> RBPU=1 (off), bit6 -> INTEDG=1 (front montant)
                             //bit5-> T0CS=0 (fosc/4), bit4-> TOSE=0
                             //bit3-> PSA=0 (prescaler timer0), bit<3:0> 111 -> :256
                             // => OPTION_REG=0x11000111=0xC7
    
         INTCON = 0x94;      //bit7-> GIE=1, bit6-> PEIE=0, bit5-> T0IE=0
                             //bit4-> INTE=1, bit3-> RBIE=0, bit2->T0IF=0
                             //bit1-> INTF=0, bit0-> RBIF=0
                             // => INTCON=0x10010000=0x90
    
         TRISB = 0xFF;       // PORTB tout en entrée
         PORTC = 0;
         TRISC = 0x00;       // PORTC tout en sortie
         TMR0=0;
    
         while(1)    // programme principal
              {
              if (start==0 && INTCON.INTF){
                    INTCON=0x80;
    
                    PORTC=0x00;
                    delay_ms(600);
                    start=1;
                    INTCON=0xB0;
                }
              if (start==2 && INTCON.INTF){
                    INTCON=0x80;        // Interdit toute interruption
                    PORTC=0x00;         // Leds éteintes
                    delay_ms(600);      // antirebonds
                    INTCON=0x80;
                    start=0;            // Prêt à recommencer
                    }
              }
      }
    Une première barrière semble avoir été franchie!

  32. #26
    HULK28

    Re : Pic 16f887 timer0

    Citation Envoyé par Snoopy85 Voir le message
    Mon pc est bien équipé de ports usb 2.0

    Quand je lance le debugger, j'ai ce message d'erreur:

    "Build type Release, ICD required for debugging"

    En sachant que dans la partie "build type" de "project setup" je ne peut pas cocher la case "mikroICD debug" car je n'ai que la case "Release"...

    @+
    Pour les infos générales sur l'IDE de MikroC:
    http://www.lextronic.fr/P200-compila...-pour-pic.html

    Pour être en mode debugger il faut configurer le bit de config qui va bien dans "Project" puis "Edit project" et cocher le bit debug_on.
    @+

  33. #27
    HULK28

    Re : Pic 16f887 timer0

    Bravo pour l'avancée.

    Dites moi si ce code tourne sur votre appli:

    Code:
    unsigned volatile int x;
    unsigned volatile char start;
    
    void interrupt ()
    {
         if(INTCON.T0IF == 1)
           {
           x++;
           PORTC = ~PORTC;
           TMR0 = 0;
           INTCON.T0IF = 0;
           }
    
          if(INTCON.INTF)
            {
            INTCON.INTE = 0;
            if(start == 0)   // 1er appui sur B.P
              {
              INTCON.T0IE = 1;
              start+=1;
              }
            if(start == 2)   // 2eme appui sur B.P
              {
              INTCON.T0IE = 0; // stop interrupt Timer0
              start = 0;
              PORTC = 0xFF;
              }
            INTCON.INTF = 0;
            }
     }
    
    void main()
    {
         x = 0;
         start = 0;
         ANSEL  = 0;  // I/O en digital.
         ANSELH = 0;
    
         OPTION_REG = 0xC7;  //bit7-> RBPU=1 (off), bit6 -> INTEDG=1 (front montant)
                             //bit5-> T0CS=0 (fosc/4), bit4-> TOSE=0
                             //bit3-> PSA=0 (prescaler timer0), bit<3:0> 111 -> :256
                             // => OPTION_REG=0x11000111=0xC7
    
         INTCON = 0x94;      //bit7-> GIE=1, bit6-> PEIE=0, bit5-> T0IE=0
                             //bit4-> INTE=1, bit3-> RBIE=0, bit2->T0IF=0
                             //bit1-> INTF=0, bit0-> RBIF=0
                             // => INTCON=0x10010000=0x90
    
         TRISB = 0xFF;       // PORTB tout en entrée
         PORTC = 0;
         TRISC = 0x00;       // PORTC tout en sortie
         TMR0 = 0;
    
         while(1)    // programme principal
              {
              if (start == 1)
                 {
                 PORTC = 0;
                 start = 2;
                 INTCON.INTE = 1;
                 delay_ms(600);
                 }
    
              }
      }

  34. #28
    Snoopy85

    Re : Pic 16f887 timer0

    Effectivement votre code tourne parfaitement et il est bien optimisé. Le seul petit soucis c'est que j'ai un problème de rebonds: parfois lors de l'appui sur le BP (le premier appui), le compteur se déclenche puis sarrete aussitot, donc on sort de l'interruption.

    Je ne sais pas où placer un petit "delay" pour contrer ce phénomène.

    Le INTCON=0x94 je l'ai remis à 0x90, j'avais oublié de le remettre suite à différents essais.

    Petite question: quelle différence entre: start+=1 et start++ ?

    Je vais réfléchir maintenant pour mémoriser le temps "x", et le reproduire lors d'un appui sur un autre BP. (Le but final et encore lointain étant de mémoriser la course d'un moteur, et ensuite reproduire cette meme course à chaque utilisation)

  35. #29
    HULK28

    Re : Pic 16f887 timer0

    Citation Envoyé par Snoopy85 Voir le message
    Petite question: quelle différence entre: start+=1 et start++ ?
    start+=1 est équivalent à start=start+1 et à start++;

  36. #30
    HULK28

    Re : Pic 16f887 timer0

    Oui normal, la tempo n'est pas bien placée.

    Code:
    unsigned volatile int x;
    unsigned volatile char start;
    
    void interrupt ()
    {
         if(INTCON.T0IF == 1)
           {
           x++;
           PORTC = ~PORTC;
           TMR0 = 0;
           INTCON.T0IF = 0;
           }
    
          if(INTCON.INTF)
            {
            INTCON.INTE = 0;
            if(start == 0)   // 1er appui sur B.P
              {
              INTCON.T0IE = 1;
              start+=1;
              }
            if(start == 2)   // 2eme appui sur B.P
              {
              INTCON.T0IE = 0; // stop interrupt Timer0
              start = 0;
              PORTC = 0xFF;
              }
            INTCON.INTF = 0;
            }
     }
    
    void main()
    {
         x = 0;
         start = 0;
         ANSEL  = 0;  // I/O en digital.
         ANSELH = 0;
    
         OPTION_REG = 0xC7;  //bit7-> RBPU=1 (off), bit6 -> INTEDG=1 (front montant)
                             //bit5-> T0CS=0 (fosc/4), bit4-> TOSE=0
                             //bit3-> PSA=0 (prescaler timer0), bit<3:0> 111 -> :256
                             // => OPTION_REG=0x11000111=0xC7
    
         INTCON = 0x94;      //bit7-> GIE=1, bit6-> PEIE=0, bit5-> T0IE=0
                             //bit4-> INTE=1, bit3-> RBIE=0, bit2->T0IF=0
                             //bit1-> INTF=0, bit0-> RBIF=0
                             // => INTCON=0x10010000=0x90
    
         TRISB = 0xFF;       // PORTB tout en entrée
         PORTC = 0;
         TRISC = 0x00;       // PORTC tout en sortie
         TMR0 = 0;
    
         while(1)    // programme principal
              {
              if (start == 1)
                 {
                 PORTC = 0;
                 start = 2;             
                 delay_ms(600);
                 INTCON.INTE = 1;
                 }
    
              }
      }
    *****************

Sur le même thème :

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Problème Timer0 PIC
    Par guijac92 dans le forum Électronique
    Réponses: 14
    Dernier message: 01/11/2008, 10h06
  2. frequence du timer0 sur pic
    Par alainav1 dans le forum Électronique
    Réponses: 1
    Dernier message: 27/10/2008, 10h43
  3. programmation PIC (TIMER0)
    Par houcemgo dans le forum Électronique
    Réponses: 4
    Dernier message: 28/06/2008, 11h48
  4. Programmer un 16f887 en jdm ?
    Par uranie-mc dans le forum Électronique
    Réponses: 3
    Dernier message: 18/04/2008, 19h04
  5. PIC 16f876 et son Timer0 ...
    Par LaMouche dans le forum Électronique
    Réponses: 1
    Dernier message: 03/04/2006, 23h24