probleme de debordement avec pic16
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

probleme de debordement avec pic16



  1. #1
    veniroth

    probleme de debordement avec pic16


    ------

    je veux faire allumer des leds et les eteindre en 30 sec.comme le compteur n'a que 255 et d'apres mes calculs il me faut un compteur de 945 pour faire du 30 sec .comment palier ce probleme sans utiliser delay()
    ci joint le code.

    Code:
    void interrupt(){
    static unsigned short cpt=0;
    if (INTCON.TMR0IF) // si il y a eu débordement du TIMER0
    {cpt++;
    if (cpt==61)     // 2 secondes écoulées = 61x32,768ms la période de débordement du TIMER0
    {cpt=0;
    
    PORTB.F3=~PORTB.F3;
    PORTB.F5=~PORTB.F3;
    PORTC.F5=~PORTC.F5;
    PORTC.F3=~PORTC.F5;
    PORTD.F5=~PORTD.F5;
    PORTD.F3=~PORTD.F5;
    
    
    }
    INTCON.TMR0IF=0;        // on réamorce l'interruption
    
    }
    }
    
    void main() {
    PORTA=0;
    PORTB=0;
    PORTC=0;
    PORTD=0;
    PORTE=0 ;
    TRISA.F3=0;
    TRISA.F5=0;
    TRISB.F3=0;
    TRISB.F5=0;
    TRISC.F3=0;
    TRISC.F5=0;
    TRISD.F3=0;
    TRISD.F5=0;
    OPTION_REG = OPTION_REG & ~0x47; // T0CS=PSA=0 => Fréq du Timer0 = Fosc/4
    OPTION_REG = OPTION_REG | 0x07;  // PS2:PS0=111 => Fréq du Timer0 /256
    
    INTCON.TMR0IE=1;    // on valide l'interruption débordement du TIMER0
    INTCON.TMR0IF=0;  // on réamorce l'interruption, au cas où elle se soit déjà produite
    INTCON.GIE=1;      // on valide les interruptions non masquées
    TMR0=0   ;
    
    }]

    -----

  2. #2
    gabuzo

    Re : probleme de debordement avec pic16

    Si "if (cpt==61)" ça fait deux secondes....combien faut-il pour en faire 30 ?

  3. #3
    paulfjujo

    Re : probleme de debordement avec pic16

    bonjour,


    Code:
    void interrupt(){
    static unsigned short cpt=0;
    if (INTCON.TMR0IF) // si il y a eu débordement du TIMER0
    {cpt++;
    if (cpt==61)     // 2 secondes écoulées = 61x32,768ms la période de débordement du TIMER0
    {cp=0;
    ......
    
    }]
    et de plus,si tu initialises le cpt a zero a chaque interrupt
    tu n'est pas encore arrive !
    utilise un entier 16 bits pour compter jusqu'a 945
    et declare celui-ci en dehors de l'interrupt.

  4. #4
    Jack
    Modérateur

    Re : probleme de debordement avec pic16

    et de plus,si tu initialises le cpt a zero a chaque interrupt
    tu n'est pas encore arrive !
    cpt n'est pas initialisé à 0 à chaque interruption, mais bien toutes les 61 interruptions.

    utilise un entier 16 bits pour compter jusqu'a 945
    et declare celui-ci en dehors de l'interrupt.
    D'accord pour le 945, mais en gardant cpt dans la fonction, ce qui évite une variable globale comme tu le proposes. D'une manière générale, on essaie d'éviter les variables globales.

    A+

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

    Re : probleme de debordement avec pic16

    bonjour,

    Citation Envoyé par Jack Voir le message
    cpt n'est pas initialisé à 0 à chaque interruption, mais bien toutes les 61 interruptions.
    NON, J'insiste quand meme , puisque dans l'interrupt la variable cpt est initialisee à 0 des l'entree d'interrupt !
    Il n'y aura donc jamais de comptage !

    Il est aussi fort possible d'initialiser et utiliser
    volatile unsigned int cpt ;
    à l'exterieur de l'interrupt, si on veut qu'elle soit visible , aussi, dans la partie main du programme.

    Code:
    void interrupt(){
    static unsigned short cpt=0;
    if (INTCON.TMR0IF) // si il y a eu débordement du TIMER0

  7. #6
    Jack
    Modérateur

    Re : probleme de debordement avec pic16

    NON, J'insiste quand meme , puisque dans l'interrupt la variable cpt est initialisee à 0 des l'entree d'interrupt !
    Il n'y aura donc jamais de comptage !
    C'est toi qui te trompe. Renseigne-toi sur le modificateur "static".

    static permet de limiter la portée de la variable à la fonction dans laquelle elle est déclarée. Cependant, une variable statique n'est pas stockée dans la pile mais dans la zone des variables globales, ce qui fait qu'elle ne perd pas sa valeur entre 2 appels de la fonction.

    Comme il faut bien lui donner une valeur initiale lors du 1er appel de la fonction, cpt = 0 n'est exécuté qu'une seule fois quelque soit le nombre des appels suivants de la fonction.

    Volatile, c'est autre chose. On s'en sert pour indiquer au compilateur qu'un autre processus pourrait modifier la variable et qu'aucune optimisation ne doit être pratiqué sur le code utilisant cette variable.
    A+
    Dernière modification par Jack ; 05/05/2012 à 13h56.

  8. #7
    paulfjujo

    Re : probleme de debordement avec pic16

    Citation Envoyé par Jack Voir le message
    C'est toi qui te trompe. Renseigne-toi sur le modificateur "static".
    Comme il faut bien lui donner une valeur initiale lors du 1er appel de la fonction,
    cpt = 0 n'est exécuté qu'une seule fois quelque soit le nombre des appels suivants de la fonction.
    A+
    Exact , i am wrong !
    je verifiais la valeur de count dans le main, hors si cpt est declaré dans l'interrupt
    cpt n'est pas visible depuis le main, c'est pourquoi je l'initailisais en dehors de l'interrupt
    Et en effet, je me suis fais avoir sur la subtilité du static qui initialise qu'au premier passage dans l'interrupt.
    Je n'avais jamais utilisé jusqu'alors cette subtilité.

    Merci.

    A+

  9. #8
    veniroth

    Re : probleme de debordement avec pic16

    Je vous remercie , tous.j'ai mis un volatile unsigned int cpt=0 ;à l'exterieur de l'interruption et ca marche nickel.
    Je vous souhaite une bonne journée!!!!!et merci encore!!!!!

Discussions similaires

  1. migration de PIC16 vers PIC18
    Par Eki27 dans le forum Électronique
    Réponses: 13
    Dernier message: 10/02/2012, 11h03
  2. PROBLEME débordement WC par syphon du ballon d'eau
    Par invite488ea53a dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 5
    Dernier message: 17/01/2010, 19h02
  3. Problème avec MPLAB et PIC16
    Par tof41 dans le forum Électronique
    Réponses: 4
    Dernier message: 04/03/2009, 17h03
  4. VHDL - coeur PIC16
    Par Toufinet dans le forum Électronique
    Réponses: 0
    Dernier message: 17/09/2007, 18h03
  5. [Blanc] Probleme débordement Lave Linge Vedette (Egée 750trs min)
    Par invite9e8430f2 dans le forum Dépannage
    Réponses: 1
    Dernier message: 13/01/2007, 12h54
Découvrez nos comparatifs produits sur l'informatique et les technologies.