Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Interruption RB0 (int_ext) avec compilateur CCS



  1. #1
    zied74

    Interruption RB0 (int_ext) avec compilateur CCS

    Bonsoir à Tous,

    en fait j'ai voulu essayer d'apprendre la procédure d'interruption sur la broche RB0 de mon PIC16F628A mais et malheureusement ça pas marché !!!!! malgré que j'ai bien réussi dans l'interruption Timer0
    Mon programme est simple: faire clignoter une Led verte dans le programme principal et si une interruption sur la broche RB0 est survenue une autre led rouge s'allume. Mon compilateur est le CCS.. Merci tout le monde et bon weekend à vous Tous.


    #include <16F628A.h>
    #fuses XT,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=4000000)

    int i=0;
    int j=0;
    int k=0;
    int m=1;
    int a=0;


    #int_ext

    void ext_isr()
    {
    output_high(PIN_A0);
    k=input(PIN_B0);
    k=input_b();
    }

    void main()
    {
    set_tris_A(0);
    output_A(0);
    set_tris_B(0b00000001);
    output_B(0b00000000);

    setup_comparator(NC_NC_NC_NC);

    enable_interrupts(GLOBAL);
    ext_int_edge(L_TO_H);
    enable_interrupts(INT_EXT);

    For(; { output_high(PIN_A1);delay_ms(5 00); output_high(PIN_B1); delay_ms(500); }


    }

    -----


  2. Publicité
  3. #2
    zied74

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    bonjour à Tous,

    Merci pour toute intervention .

    Bonne journée à Tous.

  4. #3
    kronanberg

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Salut,

    Ben en fait je crois voir une petite erreur dans ton programme. C'est qu'il faut faire un Reset du Flag de l'interruption externe.INTF = 0;

    void ext_isr()
    {
    output_high(PIN_A0);
    k=input(PIN_B0);
    k=input_b();
    }

  5. #4
    kronanberg

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Une petite erreur de manip !! j'ai envoyé mon texte trop tôt

    INTF = 0; // le bit INTF passe à 1 lorsqu'il y a une interruption externe et il faut le mettre à zéro logiciellement

    void ext_isr()
    {
    INTF = 0; //reset du flag d'interruption
    output_high(PIN_A0); // mise au niveau haut de la sortie pour allumer ta Led
    k=input(PIN_B0); // je ne comprend pas très bien l'intérêt de lire la valeur de l'entree ?
    k=input_b();
    }

  6. #5
    zied74

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Bonjour tout le monde,
    Merci bien pour votre intervention.

    1-INTF = 0; // le bit INTF passe à 1 lorsqu'il y a une interruption externe et il faut le mettre à zéro logiciellement : avec le compilateur CCS " le Reset" se fait automatiquement : c'est ce que j'ai lis dans le Help de CCS. Donc, et si mon interpretation est bonne du Help, on a pas besoin de remettre à zéro le Flag logiciellement avec le compilateur CCS.

    2- k=input(PIN_B0); // je ne comprend pas très bien l'intérêt de lire la valeur de l'entree ? : suivant le Help de CCS, il faut lire ou écrire un port pour enlever "le mismatch" , moi aussi je comprends pas c'est quoi ce "mismatch".

    Merci encore une autre fois pour votre aide et bonne journée.

  7. A voir en vidéo sur Futura
  8. #6
    zied74

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Merci pour toute aide et assistance.

    Bon après midi à Tous.

  9. Publicité
  10. #7
    kronanberg

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Peut être que tu peux essayer de tester dans ton programme si le bit INTF passe à 1 ou non. Ou alors ajoute un delay dans ta routine d'interruption pour savoir si tu va bien dedans ( Si tu va bien dedans tes Leds s'arrêterons de clignoter pendant le delay que tu aura mis).

    Et je me demandais aussi si la fonction "output_high(PIN_A0)" forçait bien la sortie au niveau haut tout le temps ou juste le temps de l'instruction. (dsl mais je ne connais pas très bien CCS)

  11. #8
    zied74

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Bonjour,

    Merci bien pour votre réponse.

    J'ai simulé ça avrec ISIS et aussi avec MPLAB pour voir les bits des registres INTCON et OPTION_REG. Conclusion :
    1- Le 7ème bit de INTCON j'ai oublié son nom mais je crois GIE est toujours à 1 càd qu'il passe pas à 0---> il y'a pas d'interruption malgré que le boutton poussoir est appyué.
    2- Le 4 ème bit de INTCON je crois s'appel INTE est aussi à 1.
    3- le 6 ème bit de OPTION_REG est 0 pour le front ascendant .
    4- La chose que j'ai remarqué avec ISIS et qui est bizarre à mon avis c'est que : le bit 0 de PORTB càd la broche RB0 se bloque à la 3 ème ou 4 ème appui à l'état Haut malgré que je l'ai rélié à une resistance de pull-down et aucune interruption n'est remarqué.
    Mes execuses pour tout dérangement et bonne journé à Tous.

  12. #9
    kronanberg

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Salut !!!

    Le fait que les bits GIE et INTE (registre INTCON) sont au niveau 1 et que le bit INTEDG (registre OPTION_REG) est au niveau 0 signifit bien que l'interruption est valide sur front descendant.

    Donc il faudrait que tu regardes le bit INTF (registre INTCON) et vérifié qu'il passe bien à 1 lorsque t'appuie sur ton boutton poussoir (dans la logique l'interruption se déclanchera lorsque tu relache ton boutton poussoir). Si tu le fait sous MPLAB n'oublie pas de réinitialiser INTF à 0 dans la routine d'interruption.

    Sinon pour ton bit RA0, il peut aussi être utilisé en analogique donc faudrait vérifier qu'il est bien en CMOS.

    a+

  13. #10
    zied74

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    Bonjour,

    1- avec CCS le reset de INTF se fait autmatiquement donc j'ai pas besoin de le remettre à 0.

    2- avec le PIC16F628 le PORTA est par défaut en comparateur et non en analogique et j'ai déjà supprimer le comparateur par la commande "setup_comparator(NC_NC_NC_NC) " donc il est en CMOS.
    Avec MPLAB j'ai pas réussi à faire marcher le "Stimuls" pour la simulation avec le boutton "Fire" sur le Pin RB0 pour le mettre en "Set High ou bien Set Low".

    Merci et bonne journée.

  14. #11
    kronanberg

    Re : Interruption RB0 (int_ext) avec compilateur CCS

    ben je ne n'utilise pas non plus "Stimuls" dsl mais je peux pas t'expliquer.

    Moi j'utilise un PIC16F887 avec un petit boutton poussoir et ça marche nickel.
    Pourtant j'ai a peu près les mêmes initialisations que toi à part que je dois mettre l'entrée d'interruption en numérique.

    Voici mon code si ça peut t'aider :

    void init_IntExt()
    {
    INTEDG = 1; // interruption sur front descendant
    GIE = 1; // enable global interrupts
    INTE = 1; // enable INT interrupt
    INTF = 0; // reset du flag
    }


    void interrupt isr(void)
    {
    if(INTF == 1)
    {
    if(PORTD == 0xFF)
    PORTD = 0x00; //eteind toutes les les du PORTD
    else
    PORTD = 0xFF; //allume toute les leds du PORTD
    while(RB0 == 0); //permet de suprimmer les rebonds
    INTF = 0;
    }
    }

    void main()
    {
    TRISD = 0x00; // Port D en sortie
    PORTD = 0x00; // Initialise le port D

    ANSELH = ANSELH && 0xFE; //declare la broche RB0(INT) en entree numerique
    TRISB = TRISB || 0x01; // Port B en entree

    init_IntExt();

    while(1)
    {

    }
    }

    a+

Sur le même thème :

Discussions similaires

  1. Problème avec les broches spéciales RB0/INT et RA4/T0CKI
    Par Montd'est dans le forum Électronique
    Réponses: 5
    Dernier message: 21/12/2008, 19h14
  2. 16f876A et Timer avec CCS
    Par Hipopotamus dans le forum Électronique
    Réponses: 10
    Dernier message: 28/09/2008, 21h53
  3. CCS avec mplab
    Par sdow dans le forum Électronique
    Réponses: 0
    Dernier message: 10/02/2008, 17h52
  4. Compilateur CCS C - initialiser struct bit à bit ?
    Par branqueira dans le forum Électronique
    Réponses: 4
    Dernier message: 26/11/2007, 14h37
  5. Interruption RB0
    Par Martintin dans le forum Électronique
    Réponses: 5
    Dernier message: 12/04/2007, 10h45