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

Interruption RB0



  1. #1
    Martintin

    Interruption RB0


    ------

    Bonjour à tous,

    Voila, je suis en train de construire une horloge à persistence rétinienne à l'aide d'un PIC16f877 en C.
    Afin de détecter une rotation de mon système j'utilise un photodétecteur (sfh9301) branché sur le port RB0.
    J'aimerais détecter par interruption un front montant sur RB0 mais je n'y arrive décidemment pas!!
    Voici mon petit programme pour l'instant:



    // Fichier test.c
    //
    // Programme de test de certaines fonctionnalités du pic16F877
    //

    #include <16f877.h>
    #include <lib_clock.h> // ma librairie

    // Horloge à 4Mhz sur le kit picdemplus
    #use delay(clock=4000000)


    void petite_aiguille(int); // fonctions sans importance pour l'instant
    void grande_aiguille(int);
    void tempo();
    void interruption_sur_b0();// ma fonction d'interruption



    // Mon interrupt*************
    #INT_EXT
    void interruption_sur_b0(){
    output_low(PIN_B1);
    output_high(PIN_B2);
    tempo();
    input(PIN_B0); // RAZ du flag???
    }



    /****************************** ****************************** **
    * Programme principal *
    ****************************** ****************************** **/



    void main()
    {
    // config des ports
    set_tris_a(0x00); // Tout le port A en sortie
    set_tris_b(0x01); // Tout le port B en sortie, sauf RB0 en entrée
    set_tris_c(0x00); // Tout le port C en sortie
    set_tris_d(0x00); // Tout le port D en sortie


    // Validation d'une IT externe sur le bit RB0
    EXT_INT_EDGE(L_TO_H);
    enable_interrupts(INT_EXT);

    // Validation des IT
    enable_interrupts(GLOBAL);


    // Initialisation (sans interet)
    grande_aiguille(0x00);
    petite_aiguille(0x00);
    output_low(led_bleue);
    output_low(led_verte);

    // DEBUT Boucle infinie
    while(TRUE){

    output_high(PIN_B1);
    output_low(PIN_B2);
    }
    }



    Je ne sais pas quelle est la syntaxe pour adresser directement les registres INTCON et OPTION_REG afin de programmer correctement les interruptions.

    Merci d'avance pour toute l'aide que vous pourrez m'apporter! Bonne soirée!

    -----

  2. Publicité
  3. #2
    kintaroOHE

    Re : Interruption RB0

    Tu t'es renseigner avec bigonoff?
    Ca explique tout.

  4. #3
    Shaiton

    Re : Interruption RB0

    Bonsoir, j'ai regardé vite fais mais je regarderai un peux plus la source...
    Quel compilateur?
    Combien de temps du tempo(); ??
    l'interruption ne doit prendre qu'un minimum de temps.
    En principe on incrémente une variable globale qu'on traite dans le main.

    a plus tard
    Le Geek Sportif !

  5. #4
    Shaiton

    Re : Interruption RB0

    pour ce qui est de l'interruption, tout dépend du compilateur.
    Il lui faut des directives spéciales. (genre #int ...)
    apres gestion des prioritée...

    Sinon pour les registres, voir la page pour le Intcon da la datasheet chap 2.2.2.3.
    on voit qu'il faut mettre le bit 7 à 1 (global interrupt)
    le bit 4 à 1 (l'interruption sur RB0)
    apres il faut gerer le flag INTF (bit 1) il passe à 1 lors d'une interruption.
    Ne pas oublier d'acquiter l'interruption en le remettant à 0.

    J'espere avoir repondu à la question...
    qu'est-ce qui n e fonctionne pas?
    erreur de compilation on d'execution?

    ...


    Bonne continuation
    Le Geek Sportif !

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

    Re : Interruption RB0

    Salut,
    Merci beaucoup pour toutes ces infos, c'est vraiment sympa! Ma tempo est la pour me permettre de voir si je rentre dedans (il est vrai que ce n'est pas forcement la meilleure méthode ).

    L'école est fermée pour cette semaine donc je pourrai faire des modifs que la semaine prochaine.

    Je pense qu'en effet l'interruption devrais durer moins longtemps.Sinon la compilation ne pose aucun problème, c'est juste que mon programme ne marche pas !?

    PS: Je programme sur MPLab avec ICD2 à l'aide de la plaquette PICDEM+.

    Merci encore pour tout!
    Ciao!

  8. #6
    Shaiton

    Re : Interruption RB0

    bonjour,
    MPLAB est un editeur, quel compilateur utilise-tu?
    CCS,.... il en existe beaucoup

    Pour ce qui ets du probleme d'execution..
    il faut tester
    tout d'abord en simplifiant la fonction d'int.

    genre

    #INT_EXT
    void interruption_sur_b0(){
    ival++;
    input(PIN_B0); // RAZ du flag???
    }

    ayant déclaré ival en global (int ival =0
    dan sle main tu fais une boucle qui allume une led si ival est compris en tel et tel valeur, l'autre led si en tel autre ou tel autre valeur...
    enfin libre cours a ton imagination!

    -un truc du genre
    Code:
    void main()
     {
     // config des ports
     set_tris_a(0x00); // Tout le port A en sortie
     set_tris_b(0x01); // Tout le port B en sortie, sauf RB0 en entrée
     set_tris_c(0x00); // Tout le port C en sortie
     set_tris_d(0x00); // Tout le port D en sortie
     
     
     // Validation d'une IT externe sur le bit RB0
     EXT_INT_EDGE(L_TO_H);
     enable_interrupts(INT_EXT);
     
     // Validation des IT
     enable_interrupts(GLOBAL);
     
     
     // Initialisation (sans interet)
     grande_aiguille(0x00);
     petite_aiguille(0x00);
     output_low(led_bleue);
     output_low(led_verte);
     
     // DEBUT Boucle infinie
          while(TRUE){
                 if(ival<200)
                         output_high(led_bleue);
                 if(ival>200 && ival<400 )
                         output_high(led_verte);     
                 if(ival>400){
                           output_low(led_bleue);
                           output_low(led_verte);
                           ival=0;
                  }
         }
     }
    c'est un truc tout simple, à amelirer surement (je n'ai pas ton system en tete) qui permet de valider la fonction interruption

    bonne continuation
    Le Geek Sportif !

  9. Publicité

Discussions similaires

  1. PIC18F4682 / INT RB0 / Mode Sleep
    Par jorg1n dans le forum Électronique
    Réponses: 24
    Dernier message: 12/12/2007, 23h24
  2. Interruption C PIC16F877
    Par Melodie Nelson dans le forum Électronique
    Réponses: 2
    Dernier message: 04/10/2007, 23h26
  3. interruption ( timer )
    Par paterson dans le forum Électronique
    Réponses: 0
    Dernier message: 13/03/2007, 20h50
  4. interruption PIC18F
    Par induc dans le forum Électronique
    Réponses: 12
    Dernier message: 19/05/2006, 17h17
  5. Interruption et PIC18F4431
    Par sylvain_c dans le forum Électronique
    Réponses: 1
    Dernier message: 09/03/2006, 15h01
Découvrez nos comparatifs produits sur l'informatique et les technologies.