Interruptions simultanées PIC 16F877A
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Interruptions simultanées PIC 16F877A



  1. #1
    maximilien

    Interruptions simultanées PIC 16F877A


    ------

    Bonjour à tous!

    J'ai parcouru plusieurs discussions traitant du sujet mais je voudrai être sûr de la réponse...

    Je suis en train de développer un programme pour un 16F877A. Dans celui ci il y aura deux sources d'interruptions:
    - une issue du TIMER0
    - une issue de RB0

    Si une de ces deux interruptions se produit alors que l'autre est en train de s'exécuter que se passe t-il?

    J'ai lu sur le forum que la deuxième va s'exécuter après l'autre, est ce vrai?

    Je ne peut pas perdre l'interruption RB0.

    Je me pose donc cette question puisque dans la doc du 16F877A page 154...
    il est dit que lors d'une int le bit GEI est mis donc la deuxième passe à la trappe ou pas?

    Merci.

    -----

  2. #2
    sdec25

    Re : Interruptions simultanées PIC 16F877A

    Salut.
    Si une de ces deux interruptions se produit alors que l'autre est en train de s'exécuter que se passe t-il?
    Quand une interruption est en train d'être exécutée, le bit GIE est désactivé jusqu'à la fin de l'irq donc il ne peut pas y avoir de 2ème interruption en même temps (sauf s'il y a plusieurs priorités d'interruptions).

    il est dit que lors d'une int le bit GEI est mis donc la deuxième passe à la trappe ou pas?
    Le bit GIE est mis à 1 automatiquement, et effacé manuellement.
    GIE = (TMR0IE . TMR0IF) + (RB0IE . RB0IF) + ...
    Conclusion : on ne peut pas rater une interruption à moins de l'effacer manuellement.
    D'ailleurs on peut tester plusieurs drapeaux d'interruptions pendant l'interruption.
    Dernière modification par sdec25 ; 25/07/2009 à 11h28.

  3. #3
    sdec25

    Re : Interruptions simultanées PIC 16F877A

    Il y a une petite erreur dans ce que j'ai dit :
    Le bit GIE est mis à 1 automatiquement, et effacé manuellement.
    GIE = (TMR0IE . TMR0IF) + (RB0IE . RB0IF) + ...
    Il ne s'agit pas de GIE mais de l'interruption :
    Interruption = (IE.IF) + ...
    Le bit GIE est désactivé automatiquement lors de l'interruption, et réactivé avec l'instruction RETFIE.
    Par contre les bits IF sont bien mis à 1 automatiquement et à 0 manuellement, donc la conclusion est la même.

  4. #4
    maximilien

    Re : Interruptions simultanées PIC 16F877A

    Merci de ta réponse;
    J'en conclus que:
    Citation Envoyé par maximilien Voir le message
    Si une de ces deux interruptions se produit alors que l'autre est en train de s'exécuter que se passe t-il?
    alors la deuxième passe à la trappe.

    Le mieux est donc de faire des routines d'interruptions les plus courtes possibles.

    Merci.

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

    Re : Interruptions simultanées PIC 16F877A

    Citation Envoyé par maximilien Voir le message
    alors la deuxième passe à la trappe.
    Pas exactement. Elle est juste retardée.

    Sur les PIC18 il y a 2 priorités d'interruption. Les irq de haute priorité peuvent interrompre les autres. Il y a peut-être la même chose sur les PIC16F.
    Si on programme en assembleur il y a sûrement moyen de sauvegarder les bons registres pour réactiver les interruptions dans la routine.

  7. #6
    maximilien

    Re : Interruptions simultanées PIC 16F877A

    D'accords; donc c'est ok.
    Si deux intérruptions sont pseudo simultannées alors elles seront traitées l'une après l'autres.

    Je me demande comment est ce traiter dans le micro? (vu le bit GEI mis à 0...).

    bon, je reste un peu sur ma faim.

    Il faudrait peut être faire un Test pour être sur...
    je réfléchis à ça...

  8. #7
    sdec25

    Re : Interruptions simultanées PIC 16F877A

    Je me demande comment est ce traiter dans le micro? (vu le bit GEI mis à 0...).
    Comment les interruptions sont traitées ?
    Par exemple tu es dans la routine d'irq pour un dépassement du Timer 0. Pendant le traitement, RB0 change mais il n'y a pas d'irq parce que GIE est à 0.

    Là on a 2 solutions : tester plusieurs cas dans la routine d'interruption, par ex :
    Code:
    while(irq1 || irq2 || ...) {
    traiter irq1 ou irq2
    }
    Ou bien attendre une nouvelle interruption (c'est plus lent à cause du temps de sauvegarde des registres).
    Dans ce 2ème cas, à la fin de la première irq (instruction RETFIE), GIE est remis à 1. Dès que GIE est à 1 une interruption est déclenchée car le bit RB0IF est à 1 (source : datasheet d'un PIC, section Interruptions. Il y a un schéma avec les portes logiques pour toutes les interruptions).

    Si tu veux tu peux tester au simulateur.

  9. #8
    sdec25

    Re : Interruptions simultanées PIC 16F877A

    Regarde la figure 14-10 page 155 de la datasheet du PIC16F877A

  10. #9
    maximilien

    Re : Interruptions simultanées PIC 16F877A

    Oui, je sais (lire).
    C'est justement comment expliquer la deuxième interruption peut elle être traitée et même détectée vu que GEI=0.

    Je vais tester...

  11. #10
    freepicbasic

    Re : Interruptions simultanées PIC 16F877A

    les interruptions sont faites pour gérer des événement en temps réel.
    C'est à dire que les événements ne doivent en aucun cas arriver plus vite que le temps maximum de traitement.

    Lorsque GIE est à 0 , interruptions interdites, le µc enregistre la ou les interruption en position le flag correspondant.
    Lorsque GIE est autorisé, si l'un des flag est positionné est levé , le programme est dérouté vers la procédure d'int ORG 0X0004.
    A ce moment GIE est automatiquement mis à 0 , on ne peut plus être dérouté vers l'int , logique puisqu'on y est déjà.
    Il faudra lorsqu'on est dans la routine tester tous les flags susceptibles d'avoir été bougés pour traiter l'interruption correspondante, puis nettoyer le flag par soft pour relancer l'int.
    Si l'on traite une seule interruption alors qu'il y en a plusieurs les suivantes seront alors plantées puisque le flag correspondant ne sera pas nettoyé.
    Lorsque l'on fait le retfie le GIE est à nouveau autoriser GIE=1.

    Le rythme des interruptions ne devra pas être plus rapide que le temps de traitement total de toute les interruptions en cascade, cas le plus défavorable.
    Sinon on risque au meilleur de raté des int au pire de planter la routine correspondante.
    La procédure d'int devra donc être la plus courte possible.
    Si un traitement long est nécessaire , le mieux est de positionner un flag personnel et de le gérer dans le programme principale.
    Mais la contrainte temps réel existera toujours, a vous de savoir si c'est acceptable ou non ou gérable.
    Par exemple en réception USART , l'int devra recevoir tout les caractères afin de ne pas se planter, et le progr principal interprètera le message et décidera l'on arrête momentanément de recevoir , couche de programme supérieur, l'int ne prendra pas de décision et se contentera simplement de lire ce qui arrive.
    A+, pat

  12. #11
    maximilien

    Re : Interruptions simultanées PIC 16F877A

    oui les flags!!!
    Je ne savais pas qu'ils étaient positionnés même si GEI=0!

    Très bonne explication!!

    Merci à vous deux!

Discussions similaires

  1. pic 16F877A
    Par invite636b8579 dans le forum Électronique
    Réponses: 22
    Dernier message: 01/04/2009, 15h00
  2. CAN pic 16f877A
    Par invite85bfc8b3 dans le forum Électronique
    Réponses: 1
    Dernier message: 11/08/2008, 13h39
  3. PIC interruptions simultanées
    Par invite85bfc8b3 dans le forum Électronique
    Réponses: 4
    Dernier message: 16/06/2008, 12h45
  4. pic 16f877a
    Par invited2ae1532 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/02/2008, 10h49
  5. interruptions PIC 18F452
    Par invite86ad2abe dans le forum Électronique
    Réponses: 3
    Dernier message: 09/03/2005, 19h37
Découvrez nos comparatifs produits sur l'informatique et les technologies.