[Programmation] interruption sur pic 16f689
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

interruption sur pic 16f689



  1. #1
    invite907fd2ff

    interruption sur pic 16f689


    ------

    Bonjour ,
    je suis en train de faire un programme sur microc à l'aide des boutons poussoirs et des interrupteurs
    mais le problème l'interruption avec le changement de porta ne fonctionne pas ,

    Code:
     void interrupt (void){
     if ((INTCON.RABIF==1) && (PORTA.F0==0) && (INTCON.RABIE==1) )
    {
    
    
             PORTC.F3 = 1;
               PORTC.F4 = 0;
             INTCON.RABIF =0 ;
             Delay_ms(500);
             PORTC.F3 = 0;
               PORTC.F4 = 0;
                
    
    
      }
    
    
                           }
    
    void main() {
    
    ANSEL = ANSELH = 0;                   //all pins I/o are cofigurred as digital
    C1ON_bit = C2ON_bit = 0;              //Désactivation de deux comparateurs
    INTCON.GIE =1 ;                         // Gener al interrupt enabled
    INTCON.RABIE=1 ;
    INTCON.RABIF=0 ;
    IOCA = 1 ;                            //     PORTA cause an interrupt on lofic state change
    IOCB = 1;
    
    TRISA=1;                              // PortA  input
    TRISB=0b00010000;                     //RB4 input , others output
    TRISC=0b00000111 ;                     //portC RC0,RC1,RC2 input , others output
    PORTC.F6=0;
    PORTC.F7=0;
    PORTC.F4=0;
    PORTC.F3=0;                                                              
    
    
    
    do {
    if (PORTA.F0==1)  {
    PORTC.F3=1;
    PORTC.F4=0 ;
        }
        else if (PORTA.F1==1)  {
    PORTC.F3=0;
    PORTC.F4=1 ;
        }
    
    
    
    }while (1);
    }

    -----
    Dernière modification par Antoane ; 17/05/2016 à 12h59. Motif: Ajout balises [code]

  2. #2
    inviteeb160de1

    Re : interruption sur pic 16f689

    Ne faut il pas que tu lises d'abord les ports avant d'activer l'IT ? Il me semble que pour les IT de genre "port change" c'est ce qu'il faut faire (voir doc).
    De plus, dans ton entrée d'IT, tu mets :
    if ((INTCON.RABIF==1) && (PORTA.F0==0) && (INTCON.RABIE==1) )
    et ce n'est qu'à cette condition que tu effaces le flag.
    Or si ton flag est levé et ton IT active, mais que FA0 est à 1, tu ne l'effaces jamais et ton programme repart en IT aussitot il la quitte. D'abord tu testes le flag et l'IT, et si c'est bon ensuite tu testes ton entrée FA0 et ensuite tu effaces systematiquement le flag avant de sortir (meme si FA0==1).

  3. #3
    invite907fd2ff

    Re : interruption sur pic 16f689

    merci je l'ai changé en interruption avec timer et ça fonctionne mieux mais as tu un idée comment gérer priorité des interruptions en pic 16f

  4. #4
    inviteeb160de1

    Re : interruption sur pic 16f689

    Les 16F ne gerent pas de priorité (voir datasheet)
    Les 18F gèrent deux niveaux haut et bas
    Les 24F et autres gèrent un vecteur par source d'IT

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

    Re : interruption sur pic 16f689

    c'est à dire une interruption ne peut plus interrompre une autre interruption ça n'est pas réalisable

  7. #6
    inviteeb160de1

    Re : interruption sur pic 16f689

    en effet c'est écrit noir sur blanc.

  8. #7
    invite5637435c

    Re : interruption sur pic 16f689

    Bonjour,

    on ne met JAMAIS une tempo dans une interruption, ça n'a pas de sens...

  9. #8
    invite907fd2ff

    Re : interruption sur pic 16f689

    mais je veux le pin reste high quelques secondes puis s'annule

  10. #9
    invite5637435c

    Re : interruption sur pic 16f689

    Oui et alors?
    Une fois la détection d'interruption faite tu retournes dans ta tâche de fond pour faire le travail attendu, comme ça tu ne t'interdit pas de recevoir un autre évènement interruptif.
    De plus on ne fait pas appel à des fonctions type delay_ms() quand on se sert des interruptions.
    On fait un truc propre avec des tempos déclarées selon les usages et des décomptes à partir d'une base de temps fixe (timer0 ou autres).

  11. #10
    inviteeb160de1

    Re : interruption sur pic 16f689

    Si tu n'as pas besoin d'une precision à la microsecode, tu gères tout ça avec une state machine basique (2 états) et le flag du timer (pas besoin des IT).
    Tout dépend toujours du contexte et des autres tâches que dois effectuer ton micro. En règle générale dans un soft on évite d'utiliser des fonctions délais bloquantes pour des délais longs (le mot "long" est toujours relatif aux contraintes temps réel de ton projet), on procède par machines d'état et des compteurs de temps relatifs à chaque tâche, lesquels sont incrémentés par une IT régulière (1ms ou 10ms par exemple suivant la précision voulue)

Discussions similaires

  1. Interruption sur pic 18F
    Par invite45df8790 dans le forum Électronique
    Réponses: 30
    Dernier message: 02/05/2014, 17h05
  2. PIC : interruption externe et interruption on change ?
    Par invitea3277f60 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 13h41
  3. Interruption en C
    Par invitedf66cb3b dans le forum Électronique
    Réponses: 5
    Dernier message: 02/12/2010, 15h49
  4. interruption
    Par invite2da25054 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/09/2010, 11h03
  5. Interruption
    Par invite28559ad9 dans le forum Électronique
    Réponses: 4
    Dernier message: 06/01/2009, 22h07
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...