Interruptions Port B0 C18
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Interruptions Port B0 C18



  1. #1
    invitead51e543

    Interruptions Port B0 C18


    ------

    Bonjour à tous,

    Voilà j'ai monté une carte très simple, avec un PIC18F45K20, quartz, quelques Leds, ...
    N'ayant jamais mis en œuvre les interruptions avec C18 (je travaille avec MPLABV8.92 et C18), je souhaitais savoir ce qui ne fonctionnait pas dans mon code.
    Je vous explique rapidement, c'est très simple.
    J'ai un bouton poussoir relié sur RB0 (=+5V quand bouton appuyé), et une led en sortie sur RA0.(led + résistance à la masse).
    Le but est d'allumer la led lors d'un appui sur bouton poussoir.
    Le soucis ne vient pas de l'icd2 (j'ai réussi à faire clignoter la led sur RA0). Les bits de config n'apparaissent pas mais sont (normalement ) bien réglés.

    Voici le bout de code.

    Code:
    #include <p18f45k20.h>
    
    void button(void);
    
    #pragma code vecteur_d_IT=0x8 // vecteur d'IT
    
    void vecteur_d_IT(void) 
    { 
       _asm goto button _endasm 
    } 
    #pragma code
    
    
    #pragma interrupt button
    void button(void)
    {
       if((PORTBbits.RB0)==1)   //A la place de cette instruction, je voulais mettre "if (INTCONbits.INT0IF==1)"
       {
          PORTAbits.RA0 = 1;
          INTCONbits.INT0IF=0;
       }
    }
    
     
    
    
    void main()
    {
       INTCONbits.GIE=1;        //autoriser interruption
       INTCONbits.INT0IE=1;   //autoriser interruption externe sur RB0
       INTCONbits.RBIE=1;
       RCONbits.IPEN=0;        //interrupt sans priorité
       INTCONbits.PEIE=1;
       INTCON2bits.INTEDG0=1;   // interrupt front montant
    
       TRISBbits.TRISB0 = 1;
       TRISAbits.RA0 = 0;
       PORTAbits.RA0 = 0;
       while(1)
       {
       }
    }
    Merci de vos précisions

    -----

  2. #2
    paulfjujo

    Re : Interruptions Port B0 C18

    bonsoir

    //A la place de cette instruction, je voulais mettre "if (INTCONbits.INT0IF==1)"
    oui c'est bien ce qu'il faut mettre.

    mais dans le main
    Code:
      RCONbits.IPEN = 1;    // Enable High interrupt priority model.
    puisque interrupt high level


    apres il faut verifier si avec ce PIC,il n'y a pas de priorité de config par defaut
    avec les voies analogiques.

    et je changerai l'ordre de l'init pour activer GIE en dernier
    et un doute sur
    Code:
     INTCONbits.RBIE
    Code:
    void main()
    {
      
     TRISBbits.TRISB0 = 1;
     TRISAbits.RA0 = 0;
     PORTAbits.RA0 = 0;
     INTCON2bits.INTEDG0=1;   // interrupt front montant
    //  INTCONbits.RBIE=1;  // <- à verifier si c'est pas l'interrupt portB bits 
     RCONbits.IPEN=1;        //interrupt High level
     INTCONbits.PEIE=1;
     INTCONbits.INT0IE=1;   //autoriser interruption externe sur RB0
     INTCONbits.GIE=1;        //autoriser interruption
       while(1)
       {
       }
    }

  3. #3
    invitead51e543

    Re : Interruptions Port B0 C18

    Problème rencontré ; la led concernée s'allume très aléatoirement par rapport aux appuis sur le bouton, on dirait qu'il y a un temps de décalage énorme.
    En plus, elle doit s'allumer 1 fois pour une dizaine d'appuis. J'avoue que je vois pas d’où peux venir le problème.

  4. #4
    invitead51e543

    Re : Interruptions Port B0 C18

    Y a t-il un ordre à respecter dans la déclaration des bits? Par exemple pour le registre INTCON, faut-il déclarer en 1er le bit de poids fort ou de poids faible?
    Mon problème peut-il venir de là?

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

    Re : Interruptions Port B0 C18

    Je viens de penser à quelque chose, dites moi si le problème peut venir de là.
    Mon interruption se déclenche sur un front montant, donc la led s'allume puis s'éteint peut-être trop rapidement, non?
    Ne faudrait-il pas que je maintienne la led allumée avec une tempo?

  7. #6
    paulfjujo

    Re : Interruptions Port B0 C18

    bonjour,

    Y a t-il un ordre à respecter dans la déclaration des bits? Par exemple pour le registre INTCON, faut-il déclarer en 1er le bit de poids fort ou de poids faible?
    NON

    essaie comme ceci , avec un flag dans le traitement IT

    Code:
    attention si ton bouton a des rebonds !
    
    
    
    #include <p18f45k20.h>
    
    void button(void);
    
    #pragma code vecteur_d_IT=0x8 // vecteur d'IT
    
    void vecteur_d_IT(void) 
    { 
       _asm goto button _endasm 
    } 
    #pragma code
    
    
    #pragma interrupt button
    void button(void)
    {
    if ((INTCONbits.INT0IE==1) && (INTCONbits.INT0IF==1))
       {
          Flag=1;;
          INTCONbits.INT0IF=0;
          INTCONbits.INT0IE=0;  // interdit autre IT
       }
    }
    
    volatile int Flag;
    
    void main()
    {
      
     TRISBbits.TRISB0 = 1;
     TRISAbits.RA0 = 0;
     PORTAbits.RA0 = 0;
     INTCON2bits.INTEDG0=1;   // interrupt front montant
     RCONbits.IPEN=1;        //interrupt High level
     INTCONbits.PEIE=1;
     INTCONbits.INT0IE=1;   //autoriser interruption externe sur RB0
     INTCONbits.GIE=1;        //autoriser interruption
      while(1)
      {
    	if (Flag==1)
    	{
    	PORTAbits.RA0 = 1;
    	Delay_ms(1000);// le temps de la voir allumée !
        PORTAbits.RA0 = 0;
    	INTCONbits.INT0IE=1;//reautorise IT RB0
    	
    	}
      }
    }
    Dernière modification par paulfjujo ; 27/06/2014 à 14h40.

  8. #7
    invitead51e543

    Re : Interruptions Port B0 C18

    Code:
    Flag=1;;
    Erreur de ta part les 2 points virgules?

    Simple question, ça ne marcherai pas si on déclare Flag seulement avec un int?

    Et ne faut-il pas remettre Flag à 0 à la fin du traitement?

  9. #8
    paulfjujo

    Re : Interruptions Port B0 C18

    Citation Envoyé par flolarajasse Voir le message

    Code:
    Flag=1;;
    Erreur de ta part les 2 points virgules? OUI..


    Simple question, ça ne marcherai pas si on déclare Flag seulement avec un int?
    sur certain compilateur il faut utiliser volatile pour que la variable puisse etre modifiee de partout..

    Et ne faut-il pas remettre Flag à 0 à la fin du traitement?
    oui, bien sur.. c'est un oubli

  10. #9
    invitead51e543

    Re : Interruptions Port B0 C18

    Il me semblait ; je vais tester tout ça et je te redis

Discussions similaires

  1. communication port USB avec PIC au lieu du port RS232
    Par invite27034424 dans le forum Électronique
    Réponses: 8
    Dernier message: 05/03/2013, 11h37
  2. Relier un interrupteur sur port parallèle (ou port série)
    Par invitedc8ebe95 dans le forum Électronique
    Réponses: 11
    Dernier message: 04/02/2013, 10h20
  3. Réponses: 3
    Dernier message: 09/12/2010, 18h10
  4. Interruptions sur changement d'état du port B
    Par Toufinet dans le forum Électronique
    Réponses: 2
    Dernier message: 29/05/2006, 22h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...