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

Registre Intcon



  1. #1
    franck1

    Registre Intcon


    ------

    Bonjour,

    Je veux réaliser un compteur qui me servira pour le calcul de distance d'un télémètre à ultrasons. J'utilise le timer0(parce que je n'ai pas le choix); le programme que je voudrais réaliser doit compter le nombre de fois qu'il y a eu interruptions. Pour cela, j'ai vu qu'il fallait voir lorsque le bit TOIF passe à 1 ou 0. Mon problème c'est que je n'arrive pas à faire un programme (en C) avec le compilateur ccs qui contrôle l'état de ce bit.

    Pourriez-vous m'aider?
    Merci.

    -----

  2. Publicité
  3. #2
    romelec

    Re : Registre Intcon

    Salut franck, que souhaites-tu faire ?
    -Compter le nombre d'interruptions T0 ou
    -Compter le nombre de fronts descendants de T0IF ?

    Je penche pour la 1° solution: tu crées un sous_prog d'interruption qui incrémente un compteur (variable globale)
    Code:
    int cpt=0;
    #int_TIMER0
    TIMER0_isr()
    {
       cpt++;
    }
    bien sur il faudra initialiser et penser à remettre ce compteur à 0 de temps en temps...
    EDIT: et mettre le T0IF à 0 si c'est pas automatique
    EDIT2: il y a la fonction bit_test() pour tester l'état d'un bit.

    tout ceci a été fait en 30sec avec le project wizard de pcwh.
    Bye.
    Dernière modification par romelec ; 06/07/2005 à 10h35. Motif: oubli

  4. #3
    franck1

    Re : Registre Intcon

    Bonjour,

    Justement, je dois pouvoir contrôler le bit TOIF et le remettre à 0 à chaque fois, 54 fois maximum. Car le télémètre ne mesure pas plus de 6 mètres. Si je comprends bien, comme il y a une interruption toutes les 6,55ms, je voudrais savoir combien de fois est-ce qu'il y a eu interruption (pas plus de 54) pour pouvoir ensuite calculer le distance.

    Merci

  5. #4
    T-Bot

    Re : Registre Intcon

    romelec : Je suppose que en CSS la commande pour faire l'interruption est la suivante :
    TIMER0_isr()

    franck1 :
    Je te propose la chose suivante. tu mets une LED+resistance1k sur une des pattes, et dans le main, tu fais allumer quand cpt >32 et quand cpt >64, tu fais éteindre...
    Pour que TOIF monte à 1 il faut avoir positionné T0IE à 1. PEIE à 1 et GEIE à 1.
    Pour que le timer0 se mette en route, il faut le configurer, mais ca dépends du pic : tu as quoi comme pic ? (lis le datasheet)
    Ensuite quand T0IF monte, cela déclenche l'interruption. Dans cette interruption tu incrémentes ton compteur. (tu peux faire plus) : c'est le code fourni par romelec
    Dans l'interruption, la première manipulation consiste à remettre T0IF à 0 (pas fait par romelec). Ceci permettra au pic de redéclancher une interruption au prochain tour de TIMER0.

  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
    romelec

    Re : Registre Intcon

    Pour tester le valeur d'un bit il y a la fonction bit_test(), je te l'ai dit.
    Mais l'interruption (il faut bien sur la valider) du timer0 est déclenchée par le front montant de T0IF. Donc dans la routine d'interruption tu as bien T0IF=1 (il faut le remettre à 0).

    Pour la durée du comptage c'est toi qui la règle, en fonction du prédiviseur et de la valeur que tu mets dans le compteur.

    Tu as lu les cours de bigonoff, quel pic utilises-tu?

    Je me pose 2 questions: comment vas-tu relier les interruptions du timer avec la distance? comment est branché ton télémètre au pic?

    EDIT: grilled.
    la commande pour l'interruption Timer0 est #int_TIMER0
    La fonction qui suit (qqsoit son nom) est la routine d'interruption correspondante.

  9. #6
    franck1

    Re : Registre Intcon

    Bonjour,

    J'utilise le 18F458, pour pouvoir avoir une interruption toute les 6,55ms il faut : setup_timer_0(RTCC_INTERNAL|RT CC_DIV_128|RTCC_8_bit); c'est à dire mettre le timer0 sur 8 bits et avoir un prédiviseur de 128.

    Pour faire correspondre le nombre de fois qu'il y a eu interruptions à la distance, je fais comme suis: comme je sais que pour parcourir les 6 mètres il faut 349ms (donc 54 fois le registre), pour parcourir 3 mètres il faudra la moitié du temps etc.

    Pour générer mon signal de 40khz,il faut utiliser le timer2 en mode PWM, j'utilise la pin CCP1 du PIC. setup_ccp1(CCP_PWM). Pour avoir les 40khz il faut mettre: setup_timer_2(T2_DIV_BY_1,127, 1);

    Pour générer le signal, je n'ai pas de problème.

    Merci pour votre aide.

  10. Publicité
  11. #7
    T-Bot

    Re : Registre Intcon

    Ecrit en C18 pour 18F258 ca donne ceci : (pour 458 ce sera pareil)
    voir fonction start_timer0();...
    #include <p18f258.h>
    #include <timers.h>

    far unsigned char timer0_loop;

    void reset_timer0()
    {
    INTCONbits.T0IE=0;
    INTCONbits.T0IF=0;
    //T0CON=7; //prescaler à 256
    //T0CON=4; //prescaler à 32
    T0CON=3; //prescaler à 16
    TMR0L=0;
    TMR0H=0;
    timer0_loop=0;
    }

    void start_timer0()
    {
    INTCONbits.T0IE=1;
    INTCONbits.T0IF=0;
    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
    T0CONbits.TMR0ON=1;
    }

    void stop_timer0()
    {
    INTCONbits.TMR0IE=0;
    T0CONbits.TMR0ON=0;
    }

  12. #8
    franck1

    Re : Registre Intcon

    Merci T-Bot.

    @+

Discussions similaires

  1. Problème registre
    Par Fistos dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 04/09/2006, 09h23
  2. Base de registre
    Par lordgodgiven dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 16/02/2006, 20h51
  3. Base de registre
    Par JPL dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 03/09/2005, 23h17
  4. base de registre
    Par sylvainj2 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 28/01/2005, 14h39
  5. registre d'enzyme
    Par scientist dans le forum Biologie
    Réponses: 8
    Dernier message: 13/12/2004, 20h26
Découvrez nos comparatifs produits sur l'informatique et les technologies.