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

Interruption sur pic 18F



  1. #1
    Fredryck

    Interruption sur pic 18F


    ------

    Bonjour à tous !

    Un petit problème se pose à moi, et j'aurais besoin de quelques lumières

    Voilà, j'utilise un PIC 18F45k22 sur lequel est branché 8 boutons poussoirs. Ils sont tous relié à une porte XOR de façon à ce que si l'un des boutons est pressé, l'état du port qui gère les interruptions change d'état. Tout fonctionne bien (en tout cas pour le reste du système ), seulement, je n'arrive pas à comprendre comment faire fonctionner les interruptions sur mon petit programme (J'utilise MikroC).. Ce qui est fort embêtant car tout le reste du programme dépend de ces interruptions..

    Vous comprendrez donc que montrer mon programme ne sert à rien puisque la partie interruption est vide

    -> je ne sais pas si tout est clair donc résumé de ce que j'essaie de faire :
    J'aimerais qu'à chaque appuis sur une touche, le programme se stop et relève le port (parmi les boutons) qui est à l'état haut.


    voilà, Merci à ceux qui savent comment m'aider ^_^'

    -----

  2. Publicité
  3. #2
    spown

    Re : Interruption sur pic 18F

    Bonjour/bonsoir est bienvenu sur FUTURA,

    Je connais pas MikroC, mais pour utiliser une interruption, il faut bien s'assurer du syntaxe de la fonction qui fait l’appel, sans oublier bien sur d'activer l'interruption dans le main pour l'interface désirée ( Timer, I2C, UART ... )

    (Note :il faut toujours remettre le flag à zéro dans la fonction de l’interruption )

  4. #3
    Fredryck

    Re : Interruption sur pic 18F

    Bonsoir et merci =)

    Oui j'ai cru comprendre qu'il fallait activer l'interruption sur le pic mais alors cela voudrait dire qu'il faut que je me tape les 560 pages du Datasheet pour connaitre le bon registre a appeler ?

    D'apres l'aide de mikroC sur les interruptions ( interrupts ) mon code devrait ressembler à cela :

    void interrupt() {
    if (INTCON.TMR0IF) <- Zone où à été déclenché l'interruption ?
    {
    counter++; <-Action sans rapport
    TMR0 = 96; <- Action avec rapport ?
    INTCON.TMR0IF = 0; <-Remise à zéro pour la prochaine interruption
    }
    }


    Alors c'est pas que je sois mauvais en anglais (Qui, moi ? pffff) Mais je pige pas trop ce qu'ils me demandent pour que ça fonctionne ^_^' ..

  5. #4
    vincent66

    Re : Interruption sur pic 18F

    Bonjour,
    Quel pin du pic est utilisé pour générer l'interruption ?
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    paulfjujo

    Re : Interruption sur pic 18F

    bonjour,

    je suupose que tes 8 boutons sont relies sur un port ex: port D
    pour pouvoir lire quel bit a changé
    et que la sortie xor est relié à RB0 (entree interrupt)


    Code:
    //--------- test si interrupt via RB0 --------------
     if ((INTCONbits.INT0IE==1) &&(INTCONbits.INT0IF==1))
     { 
       INTCONbits.INT0IF = 0;
       INTCONbits.INT0IE=0;
         Traite_BPs(); 
        INTCONbits.INT0IF=0;
    }
    montre ton schema et code !

  9. #6
    al-pac

    Re : Interruption sur pic 18F

    bonjour, bonjour,

    voila je m'incruste dans votre conversation je pense avoir trouvé quelque chose qui pourrait bien t'aider c'est tiré de la datasheet de ton micro
    =>
    External interrupts on the RB0/INT0, RB1/INT1 and
    RB2/INT2 pins are edge-triggered. If the corresponding
    INTEDGx bit in the INTCON2 register is set (= 1), the
    interrupt is triggered by a rising edge; if the bit is clear,
    the trigger is on the falling edge. When a valid edge
    appears on the RBx/INTx pin, the corresponding flag
    bit, INTxF, is set. This interrupt can be disabled by
    clearing the corresponding enable bit, INTxE. Flag bit,
    INTxF, must be cleared by software in the Interrupt
    Service Routine before re-enabling the interrupt.
    All external interrupts (INT0, INT1 and INT2) can wakeup
    the processor from Idle or Sleep modes if bit INTxE
    was set prior to going into those modes. If the Global
    Interrupt Enable bit, GIE/GIEH, is set, the processor
    will branch to the interrupt vector following wake-up.
    Interrupt priority for INT1 and INT2 is determined by
    the value contained in the interrupt priority bits, INT1IP
    and INT2IP of the INTCON3 register. There is no priority
    bit associated with INT0. It is always a high priority
    interrupt source.

    voila et tu irra fouiller dans les pages 116 et 117 tu as le détaille des registre conserné, tu 'a plus qu'a écrire la valeur hexa correspondante car c'est deux registre son accesible a l'écriture.

    ps, bonne chance

  10. Publicité
  11. #7
    r4ph

    Re : Interruption sur pic 18F

    Si tu n'as pas envie de te taper des datasheets, je te suggère un arduino, mais il faudra te taper l'appentissage puis la compréhension de fonctions que d'autres personnes ont développé et qui ne font pas nécessairement ce que tu veux. Mais jamais tu n'auras besoin d'écrire ou lire un registre... Entre nous ctrl F dans un pdf c'est pas si difficile

  12. #8
    luc_1049

    Re : Interruption sur pic 18F

    Bonjour

    Le databook comprend les données constructeurs utiles voire indispensables pour le développeur de logiciel embarqué.
    Ignorer son existence en refusant de s'y plonger en cherchant l'information et en lisant certains chapîtres fondamentaux c'est rédhibitoire si on veut coder un logiciel embarqué !
    cdlt

  13. #9
    Fredryck

    Re : Interruption sur pic 18F

    Merci à tous pour vos réponses !

    voici un schéma simplifié du montage :
     Cliquez pour afficher


    la sortie de la porte XOR est reliée au port RB0/INT0

    C'est justement parce que rechercher dedans à été un échec lamentable et que j'en suis sorti avec plus de questions que lorsque j'y suis rentré que je suis venu demander de l'aide ^^'

    (116 et 117 ? je saute voir ça !)

  14. #10
    r4ph

    Re : Interruption sur pic 18F

    On va te laisser chercher un peu, puisque c'est comme ça qu'on apprend, tu peux très bien te passer de ta porte xor externe. Cherche interrupt on change dans la datasheet... C'est là le gros avantage de lire la doc pour utiliser le hardware interne et limiter ainsi le nombre de composants en plus du uC.

  15. #11
    Fredryck

    Re : Interruption sur pic 18F

    Je ne vois pas comment faire sans une porte logique en plus..
    Si je ne l'utilisais pas, je ne pourrais pas distinguer quel bouton j'ai pressé !

  16. #12
    r4ph

    Re : Interruption sur pic 18F

    À priori tous les pics possédant des interruptions possèdent une interruptions on-change sur au moins un port. Donc une porte interne au pic déclenche l'interruption. La lecture du dit port permet, par comparaison avec l'ancienne valeur de savoir quel bouton a été pressé. Donc: datasheet, ctrl+f, interrupt on-change et tout ceci n'aura plus de secret pour toi! Lire aussi le passage sur les ports et les interruptions.

  17. Publicité
  18. #13
    gabuzo

    Re : Interruption sur pic 18F

    Les interrupt on change c'est sur la moitié d'un port (portb 4 à 7).
    Je suis Charlie

  19. #14
    paulfjujo

    Re : Interruption sur pic 18F

    bonjour,


    au lieu de relier les boutons sur les ports B et D
    tu as meilleur compte de les relies sur un seul PORT D (si disponible)
    il suffit de lire le PORT D dans le traitement de l'interrupt RB0


    Code:
    volatile unsigned char Etat_BP;
    
    void interrupt() { 
    if (INTCON.INT0IF) 
    {
    Etat_BP=PORTB & 0xFC + PORTD & 0x03;;
    INTCON.INT0IF=0;
    }

    PORT D seul
    Code:
    volatile unsigned char Etat_BP;
    
    void interrupt() { 
    if (INTCON.INT0IF) 
    {
    Etat_BP=PORTD;
    INTCON.INT0IF=0;
    }
    Traiter ensuite Etat_BP dans le main programme

  20. #15
    r4ph

    Re : Interruption sur pic 18F

    Citation Envoyé par gabuzo Voir le message
    Les interrupt on change c'est sur la moitié d'un port (portb 4 à 7).
    Ha ben zut! Tu as bien raison! Seulement 4 bits pour les 18f. Dommage, les 16f en ont 8, porta 0à3 et portb 4à7...

  21. #16
    vincent66

    Re : Interruption sur pic 18F

    Reste la possibilité d'utiliser les 4 interrupts on pin state change en faisant une matrice 2x4 ...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  22. #17
    gabuzo

    Re : Interruption sur pic 18F

    Citation Envoyé par r4ph Voir le message
    Ha ben zut! Tu as bien raison! Seulement 4 bits pour les 18f. Dommage, les 16f en ont 8, porta 0à3 et portb 4à7...
    Ben il me semble que pour les IOC c'est pareil sur les 16Fxx, portb 4à7, ceux que je connais du moins. Sinon la solution de Vincent66 résoud le problème
    Je suis Charlie

  23. #18
    Fredryck

    Re : Interruption sur pic 18F

    Bonsoir

    Merci pour vos réponses

    -> paulfjujo

    Effectivement, ça aurait été bien pratique de les réunir tous sur le même port cependant ce n'est pas possible (à cause des autres éléments du montages..)

    J'ai voulu tester, sous le logiciel ISIS, une interruption (rien que ça !)
    voici donc le schéma le plus simple possible : le pic 18f45k22 et un bouton relié à sa pin RB0/INT0
     Cliquez pour afficher


    Accompagné du code suivant :
    Code:
    void interrupt()
    {
      if (INTCON.INT0IF)
      {
       portc.f5 = 1;    // Passe le port RC5 à l'état haut si l'interruption se produit
       INTCON.INT0IF=0; 
      }
     }
     
    void main() 
    {
       TRISC =1;
       INTCON.INT0IF=0;
       while(1);
    }
    Bien évidement, ce n'est aussi facile que ça (sinon on ne s'amuse pas n'est-ce pas ?)

    voyons ce que dit la doc :
    "Les interruptions externes sur les broches RB0/INT0 , RB1/INT1 et RB2/INT2 sont déclenchées par des fronts.
    Si le bit correspondant à INTEDGx dans le registre de l'INTCON2 est = 1, l'*interruption est déclenchée par un front montant;
    si le bit est nul, elle est déclenchée par un front descendant.
    Il n'y a pas de bit de priorité pour la broche INT0 car celle-ci est toujours en priorité haute."

    parfait je dois donc vérifier le registre INTCON2 page 117.

    c'est là que ne comprend plus grand choses

    ce que dit le registre :
     Cliquez pour afficher


    j'ai essayé pleins de combinaison différente, j'ai tenter de déchiffrer la doc mais rien n'y fait, cette fichue interruption ne veut pas venir..

    -> R4ph, vincent66, gabuzo
    La carte est déjà réalisé, je ne peux pas la modifier..
    Je dois me plier au problème de générer une interruption au port RB0/INT0 puis de vérifier quel bouton a été pressé..

  24. Publicité
  25. #19
    gabuzo

    Re : Interruption sur pic 18F

    Citation Envoyé par Fredryck Voir le message
    -> R4ph, vincent66, gabuzo
    La carte est déjà réalisé, je ne peux pas la modifier..
    Je dois me plier au problème de générer une interruption au port RB0/INT0 puis de vérifier quel bouton a été pressé..
    Ca c'est ballot ! Mais valider un hard avec un soft qui n'est pas au point c'est un peu chercher les ennuis.

    Pour le reste c'est bien de configurer le registre INTCON2 mais si le registre INTCON ne l'est pas ça ne risque pas de fonctionner.
    Je suis Charlie

  26. #20
    Fredryck

    Re : Interruption sur pic 18F

    Oui c'est sur, mais je n'avais vraiment pas le choix.. enfin bref

    Encore faudrait-il que je sache configurer l'INTCON2.
    ça reste le même problème, aussi bien de configurer l'un que l'autre.
    Je ne comprend pas comment ça fonctionne.

  27. #21
    Fredryck

    Re : Interruption sur pic 18F

    J'ai retenté encore une fois !

    voici ce que ça donne :
    Code:
    void interrupt() iv 0x0008 ICS_AUTO
    {
     if(INTCON.INT0IF == 1) 
     {
      PORTC.F6 = 1;          // Passe le port RC6 à l'état haut
      INTOCON.INTOIF = 0;    // INT0 External interrupt flag bit
     }
    }
    
    void main()
    {
     TRISC = 1;
     RCON.IPEN = 1;
     INTCON.GIE_GIEH = 1;    // when IPEN = 1 -> Enables all hight piority interrupts 
     INTCON.INT0IE = 1;      // Enables the INT0 external interrupt
     INTCON2.INTEDG0 = 1;    // Interrupt on rising edge
    while(1);
    }

    Mais malgré tout ça ne fonctionne toujours pas..

    Lorsque je force INTCON.INT0IF à 1, je constate que les lignes qui passe RC6 à l'état haut sont bien exécutées.
    Pourtant le changement d'état au port INT0 ne semblent pas vouloir provoquer l'interruption

  28. #22
    gabuzo

    Re : Interruption sur pic 18F

    Essayer de programmer sans savoir configurer un registre c'est sûr que ça aide pas.

    Pour intcon le bit<7> active ou désactive toutes les interruptions, donc dans ton cas il doit être à 1 (enable).
    le bit<6> active les interruptions périphériques (timers, usart etc), donc tu laisses à 0 (disable) si les périphériques ne sont pas utilisés
    le bit<5> c'est le debordement du timer0 donc tu mets à 0
    le bit<4> active les interruptions externes, c'est le cas avec ton bp donc tu mets le bit à 1
    le bit<3> active les interrupt on change (portb4 à portb7), si inutile le mettre à 0
    le bit<2> c'est le flag du timer, il ne sert à rien donc on laisse à 0
    le bit<1> c'est le flag d'interruption externe, il est impératif de le mettre à 0 et de le remettre à 0 après chaque interruption
    le bit<0> c'est le flad interrupt on change, le laisser à 0 si inutile

    Ca donne, je suis pas sûr de la syntaxe en C mais ça doit être dans ce goulag
    Code:
    intcon=ob10010000;
    Pour intcon2 je te laisse chercher un poil.
    Je suis Charlie

  29. #23
    Fredryck

    Re : Interruption sur pic 18F

    Oui c'est ce que j'ai cru comprendre, et normalement pour l'INCON2, il n'y a que l'INDEG0 à mettre à 1.
    Seulement ici, tu as activé GIE/GIEH sur l'INCON alors qu'il faut aussi activer l'IPEN de l'RCON non ?

  30. #24
    gabuzo

    Re : Interruption sur pic 18F

    IPEN c'est pour gérer les priorités des interruptions. Si tu n'as qu'une seule source d'interruption tu veux qu'elle soit prioritaire sur quoi ?
    Je suis Charlie

  31. Publicité
  32. #25
    paulfjujo

    Re : Interruption sur pic 18F

    Effectivement, ça aurait été bien pratique de les réunir tous sur le même port cependant ce n'est pas possible (à cause des autres éléments du montages..)
    regarde au post#14
    il y a aussi l'exemple avec des entrees sur 2 ports differents
    il suffit de traiter les ports consideres avec un masque
    pour recuperer un etat global des 8 boutons poussoirs ...

    attention à bien devalider les entrees analogiques des ports
    Code:
    ANSELB=0;
    ANSELD=0;

  33. #26
    Fredryck

    Re : Interruption sur pic 18F

    Il est écrit :

    GIE/GIEH: Global Interrupt Enable bit
    When IPEN = 0:
    1 = Enables all unmasked interrupts
    0 = Disables all interrupts including peripherals
    When IPEN = 1:
    1 = Enables all high priority interrupts
    0 = Disables all interrupts including low priority

    je ne me suis pas senti conserné par les interruption masqué.
    Et comme INT0 est toujours une interruption de priorité élevée, je pensais qu'il était impératif que IPEN = 1 pour que l'interruption fonctionne ..

    Merci Pauljujo, j'avais oublié ce petit détail, maintenant l'interruption fonctionne (Youpii ! )

    Avec ceci l'interruption au port RB0/INT0 fonctionne parfaitement :
    Code:
    void main() 
    {
       Trisc =1;
       ANSELB=0;
       intcon=0b10010000  ;
       intcon2=0b01000000;
       while(1);
    }
    void interrupt() iv 0x0008 ics ICS_AUTO {
     
     INTCON.INT0IF=0;
    }
    Il ne me reste plus qu'à traiter les ports =)
    Et il me semble que ceci répond à ma demande :

    Code:
    volatile unsigned char Etat_BP;
    
    void interrupt() 
    { 
     Etat_BP=PORTB & 0xFC + PORTD & 0x03;
     INTCON.INT0IF=0;
    }
    Bien que je ne vois pas trop encore comment en extraire l'information utile..

    si je fais :

    Code:
    switch(Etat_BP)
    {
    case PORTD & 0x01 : // Action si port RD0 est à l'état haut
    case PORTD & 0x02 : // Action si port RD1 est à l'état haut
    case PORTB & 0x03 : // ...
    //...
    //...
    }
    ça fonctionnerait ?

  34. #27
    r4ph

    Re : Interruption sur pic 18F

    Citation Envoyé par gabuzo Voir le message
    Ben il me semble que pour les IOC c'est pareil sur les 16Fxx, portb 4à7, ceux que je connais du moins. Sinon la solution de Vincent66 résoud le problème
    C'est bien possible, la série 16f631-690 en à 8, c'est ceux avec lesquels j'ai le plus joué. Comme quoi, il ne faut jamais rien prendre pour acquis... Et lire les datasheets...

  35. #28
    paulfjujo

    Re : Interruption sur pic 18F

    test Etat_BP pas les bits individuels de port
    qui entre temps on changé

    Code:
    switch(Etat_BP)
    {
    case Etat_BP & 0x01 : // Action si BP0 est à l'état haut
    case Etat_BP & 0x02 : // Action si BP1 est à l'état haut
    case Etat_BP & 0x03 : // ...          BP2
    //...
    //...
    }

  36. #29
    Fredryck

    Re : Interruption sur pic 18F

    Mais où est alors la différence de port ?
    si j'écris "Etat_BP & 0x02" à "Etat_BP & 0x08", comment reconnaitre qu'il s'agit du port B et non du port D ?

  37. #30
    paulfjujo

    Re : Interruption sur pic 18F

    bonjour,


    La finalité est de reconnaitre quel bouton a été appuyé !
    peut importe que ce soit le port D ou B
    dans le byte Etat_BP sont rassemblés , au moment de l'interruption, tous les etats des Port D et B concernés
    (dans la foulée, rajoute un "s" à la déclaration de Etat_BPs ,puisqu'il s'agit de tous les BP)

    tu peux utiliser un define pour affecter la definition de chaque bouton
    et ainsi mieux commenter ton programme

    exemple
    Code:
    #define BP1 Etat_BPs & 0x01
    #define BP2 Etat_BPs & 0x02
    #define BP3 Etat_BPs & 0x04
    #define BP4 Etat_BPs & 0x08
    #define BP5 Etat_BPs & 0x10
    #define BP6 Etat_BPs & 0x20
    #define BP7 Etat_BPs & 0x40
    #define BP8 Etat_BPs & 0x80
    
    
    
    switch(Etat_BPs)
    {
    case BP1 : // Action si BP1 est à l'état haut
    case BP2 : // Action si BP2 est à l'état haut
    case BP3 : // ...          BP3
    
    
    case BP8;
    ..
    //...
    }

Page 1 sur 2 1 DernièreDernière

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 I2C pic 18F
    Par jum0034 dans le forum Électronique
    Réponses: 11
    Dernier message: 05/04/2012, 14h46
  3. Interruption en C
    Par Trantor dans le forum Électronique
    Réponses: 5
    Dernier message: 02/12/2010, 14h49
  4. interruption
    Par frenchy dans le forum Électronique
    Réponses: 3
    Dernier message: 09/09/2010, 10h03
  5. interruption sur pic
    Par alainav1 dans le forum Électronique
    Réponses: 4
    Dernier message: 02/08/2009, 20h13
Découvrez nos comparatifs produits sur l'informatique et les technologies.