Interruption PIC: pb de comparaisons.
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Interruption PIC: pb de comparaisons.



  1. #1
    maxpeigne

    Interruption PIC: pb de comparaisons.


    ------

    Bonsoir,

    je suis en train de m'initier aux PIC avec MPSim et je me heurte à un problème.

    Mon programme est simple, à chaque appui sur RB0, je souhaite lancer une intérruption qui incrémente un CHAR. Lorsque celui ci devient supérieur a 5 et que mon buzzer est éteint, je le déclenche. Puis une fois déclencher je dois appuyer 3 fois pour l'arreter.

    Voici mon code:


    Code:
    #include "pic.h"		// vos headers associés
    #include "pic168xa.h"		// à vos projets
    
    //#include <stdio.h> 
    
    #define bit(x) (1<<(x))
    
    // __CONFIG(HS & WDTDIS &  BOREN &  LVPDIS );
    
    
    void init (void)
    {
    	TRISB = 0xFF;	//Port B en entree
    	TRISC = 0x00;	//Port B en sortie
    	PORTC = 0;
    	OPTION = 0b00100000;	//Int du port B en front descendant (bit 6) INTEDG
    	INTCON = 0b10011000;	//RB0 en interruption (bit 4) INTE
    }
    
    void buzzer_off (void)
    {
    	RC2 = 0;
    }
    
    void buzzer_on (void)
    {
    	RC2 = 1;
    }
    
    // ******************** INTERRUPTIONS ********************
    void interrupt BP_S3 (char compteur_appui) 
    {
    	if (INTF && INTE) // interruption RB0
    	{
    		compteur_appui++;
    		if (compteur_appui>0x04 && RC2==0)      /* !!! Impossible de rentrer !!! */
    		{
    			buzzer_on();
    			compteur_appui=0;
    		}
    		if 	(compteur_appui>0x02 && RC2==1)  /* !!! Impossible de rentrer !!! */
    		{
    			buzzer_off();
    			compteur_appui=0;
    		}
    		INTF=0; // acquittement de l’interruption RB0
    	}
    }
    
    
    void main(void)
    
    {
    	char compteur_appui=0x0A;
    	init();
    	while(1);
    }
    Mon problème est que je n'arrive à rentrer dans mes IF uniquement lorsque je mets ma comparaion de compteur_appui en commentaire. Je me doute que le probème vient de ma syntaxe mais je ne trouve pas.

    Quelqu'un pourrait m'aiguiller?

    Merci.

    -----

  2. #2
    maxpeigne

    Re : Interruption PIC: pb de comparaisons.

    Je me permets un petit UP du matin.

  3. #3
    Forhorse

    Re : Interruption PIC: pb de comparaisons.

    Tu as certainement un problème de rebond...
    L'interruption doit être appelée plusieurs fois a cause du mauvais contact (pas forcement visible) lors de l’appui sur le bouton. Il faut mettre un anti-rebond matériel (cellule RC, ou bascule RS par exemple) entre le bouton et l'entrée RB0
    Et puis passer par une interruption pour compter le nombre d'appuis sur un bouton c'est un peu "luxe" (sauf si bien entendu c'est a but didactique pour comprendre le mécanisme des interruptions)

  4. #4
    maxpeigne

    Re : Interruption PIC: pb de comparaisons.

    Merci de ta réponse.

    Effectivement ce programme est a but pédagogique, ce qui explique ce fonctionnement de "luxe"

    En ce qui concerne l'antirebond j'utilise stimulus, donc je ne pense pas que ce soit ca.
    Quelque chose de bizarre est que dans ma boucle, la variable compteur_appui++; ne s'incremente pas, ce la a certainement un rapport mais bon...

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

    Re : Interruption PIC: pb de comparaisons.

    Ah tu fais de la simulation dans MPLAB, dans ce cas le debuggage devrait être simple...
    Déjà est-ce que le programme rentre dans la boucle d'interruption ?
    Ensuite, si ton incrémentation s’exécute, tu devrais voir les registres correspondant évoluer (chargement de la valeur de compteur_appui dans W, incrémentation de W, transfert de la valeur de W dans compteur_appui)
    Sinon, vu que ta variable compteur_appui est un char, essayes peut-être d'écrire directement les instructions en assembleur ça peut donner une piste et au moins valider ce bout de programme (j'y connais rien au C, je ne sais pas si on peut ajouter des instructions en assembleur dans un programme en C, mais en Basic, avec le compilateur que j'ai je le fais souvent)

  7. #6
    Aurélien

    Re : Interruption PIC: pb de comparaisons.

    L'abus de parenthèse ne nuisant pas à la santé, je te propose d'essayer de remplacer :
    if (compteur_appui>0x04 && RC2==0)
    par if ((compteur_appui>0x04) && (RC2==0))

    et idem pour l'autre test

    Aurélien

  8. #7
    Forhorse

    Re : Interruption PIC: pb de comparaisons.

    Moi j'aurais tout bonnement simplifié le test en virant la partie de la comparaison de RC2, quand il y a plusieurs variables dans une équation, on ne sais jamais laquelle est en cause.
    Mais bon, là vu qu'il dit que son compteur ne s’incrémente même pas, le problème doit être ailleurs.

  9. #8
    maxpeigne

    Re : Interruption PIC: pb de comparaisons.

    Effectivement je pense qu'une fois que j'aurai résolu le problème de mon compteur qui ne s'incremente pas, le reste en découlera . . .

    Je vois le simulateur qui passe devant la ligne compteur_appui++; et celle ci qui ne s'incrémente pas, j'imagine bien un problème de pointeur (en plus de débuter dans les PIC, je debute aussi en C ). Lorsque je veux modifier une variable dans une fonction, ne dois-je pas passer par un pointeur?

    Merci de votre aide.

  10. #9
    Aurélien

    Re : Interruption PIC: pb de comparaisons.

    ah mais c'est tout con en fait, ta variable compteur est définie comme locale dans le char, ainsi aucune autre fonction ne la connait. ça se trouve tu écris ailleurs dans la mémoire.
    déclares ta variable en globale (hors fonction) et ça roulera.
    et ne sois pas radin en parenthèses lors des tests "if"

  11. #10
    RISC

    Re : Interruption PIC: pb de comparaisons.

    Salut,

    ATTENTION .....
    Une fonction d'interruption ne recoit AUCUN PARAMETRE et ne retourne AUCUN PARAMETRE car elle n'est pas appelée...
    Tu dois éclarer ta variable en globale et surtout avec volatile devant

    Code:
    volatile unsigned char compteur_appui =0;
    
    void main(void)
    a+
    Dernière modification par RISC ; 27/04/2012 à 23h04.

  12. #11
    maxpeigne

    Re : Interruption PIC: pb de comparaisons.

    Merci pour votre aide, effectivement déclarer ma variable en global et volatile a réglé tous mes problèmes.

    Merci à tous ceux ayant pris le temps de s'attarder sur mon problème.

Discussions similaires

  1. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  2. Interruption PIC
    Par warior31 dans le forum Électronique
    Réponses: 1
    Dernier message: 01/06/2011, 19h34
  3. probleme 2 interruption pic 18f4550 pic ->plante
    Par invite4ec38ea0 dans le forum Électronique
    Réponses: 5
    Dernier message: 28/08/2010, 07h51
  4. Réponses: 1
    Dernier message: 17/07/2010, 06h34
  5. interruption pic 18f4520
    Par bird12358 dans le forum Électronique
    Réponses: 19
    Dernier message: 25/07/2009, 22h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.