Interruption portB pic
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 35

Interruption portB pic



  1. #1
    nirvo

    Interruption portB pic


    ------

    Bonjour
    je veux écrire un code qui me permet de compter le nombre d'interruption générer sur un port B <B0> d'un pic, j'utilise la routine interruption mais rien ne marche
    #include <p18fXXXX.h>

    void interrupt_IO(void);
    int compteur=0;


    /*------------------routile d'intéruption----------------------*/
    #pragma code high_vector=0x08
    void intterupt(void)
    {
    _asm goto interrupt_IO _endasm
    }
    #pragma code
    void interrupt_IO(void) // reception d'une interruption
    {
    if(INTCONbits.INT0IF) //detection
    {
    compteur++;
    }
    INTCONbits.INT0IF=0;
    }

    void main(void)
    {
    //int k =0;
    TRISB=0x01;
    PORTB=0x00;
    RCONbits.IPEN=1;
    INTCONbits.GIE=1 ; // activer les interruptions
    INTCONbits.PEIE=1 ;
    INTCON2bits.RBIP=1;
    INTCONbits.RBIE=1;
    INTCONbits.INT0IE=1;
    `
    return ;
    }
    es vous pouvez m'aider car une simple intéruption ne marche pas.
    merci

    -----

  2. #2
    invite7a49d0d5

    Cool Re : Interruption portB pic

    Salut,

    c'est quel PIC exactement ?
    tu utilises quel compilateur (quelle "version" de C)?

    si c'est CC5x il manque peut-être la sauvegarde et
    la restauration des registres dans l'interruption
    (des exemples en tapant "CC5 interruption" dans
    le champ "rechercher" de ce forum)...

    ensuite il est souvent conseillé de désactiver ADC et comparateurs... si inutilisés...
    et moi je mettrais "une boucle infinie" au lieu du "return" à la fin du main...
    (while(true) ; )

    vede
    ;O]
    _____________
    ...

    ps : à lire, les cours de Monsieur BigOnOff,
    avec ici notamment la "Part 5" (Migration 16Fxxxx > 18Fxxxx)
    et son Chapitre 8 (Interruptions, niveaux, priorités, sauvegarde registres...)...

  3. #3
    nirvo

    Re : Interruption portB pic

    bonsoir,
    merci pour la réponse, j'utilise pic18f avec MPLAB compilateur C18,
    je vais re consulter les cours de BigOnOff
    j'ai déjà utilisé des interruptions sur un timer et sa a marché bien
    peux être j'ai oublier quelques choses ou j'ai pas bien compris les interruptions sur les portB

    merci

  4. #4
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re ;O]

    ah, tu ne veux pas dire sur quel PIC tu travailles ;O] secret défense ;O]

    bon j'ai un peu regardé, t'es sur que C18 restaure les registres après l'interruption?

    (ligne "retfie FLASH" ;à trouver à la fin du code compilé[.asm ou .lst] de l'interruption)

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

    Re : Interruption portB pic

    Bonjour,
    en fait j'ai oublier de vous dire c'est un pic18f2450
    je trouve que des fichier .o dans mon répertoire mais pas .asm et .lst

    merci

  7. #6
    nirvo

    Re : Interruption portB pic

    Bonjour
    je comprends pas d'où viens le probleme, mais si le C18 ne restaure pas les registres alors sa devient impossible c sa !!!

    mais sa m'étonne car j'ai déja réussi à faire interruption sur un timer pour faire des délai seulement cette fois ci sa ne marche
    pas sur le portB
    merci de m'aider

  8. #7
    invitea5e3e6e1

    Re : Interruption portB pic

    Bonjour
    Hypothèse, déclarer le port B en numérique...il me semble qu'il est en analogique au reset.

  9. #8
    nirvo

    Re : Interruption portB pic

    bonjour;
    j'ai ajouté ADCON1 =0x03; à mon code pour avoir RB0 en digitale et toute les autre en analog mais rien n'est changé

    merci

  10. #9
    invite7a49d0d5

    Cool Re : Interruption portB pic

    Salut,

    primo : pour "voir" le fichier assemblé je crois que dans MPLab C18
    il faut aller dans un menu, style projet>view>assembly ...

    secundo : as-tu remplacé ton "return;" par une boucle infinie???
    car je vois pas bien où ton "return" devrait retourner...
    remplace le par "while(1) ;" stp...

    tertio : j'ai téléchargé la datasheet, je te commente ton code
    (où l'on voudrait utiliser l'interruption sur le Port RB0):
    RCONbits.IPEN=1; // Pourquoi tu actives les priorités???
    INTCONbits.GIE=1 ;
    INTCONbits.PEIE=1 ; // Pourquoi tu actives les interruptions périphériques???
    INTCON2bits.RBIP=1; // Pourquoi tu actives une priorité sur l'interruption RB???
    INTCONbits.RBIE=1; // Pourquoi tu actives l'interruption RB???
    INTCONbits.INT0IE=1;

    donc tu supprimes de ton code les lignes commentées ci-dessus, ça sera déjà plus clair...
    (car l'interruption "RB" n'a rien à voir avec l'interruption INT0 du Port RB0)

    quartio ;O]
    tu as bien mis une résistance de "pull-down" sur RB0?

    cinquio ;O]
    je te conseille vivement d'entièrement désactiver le convertisseur
    analogique, le temps des essais, avec la ligne :
    ADCON1 = 0b00001111;
    au début de ton code...

    tiens nous au jus...
    vede
    ;O]
    ____________
    ...



    `

  11. #10
    invite7a49d0d5

    Cool Re : Interruption portB pic

    ps : et pour la sauvegarde des registres je ne connaissait pas ce pic,
    et j'ai un peu de mal à comprendre le fonctionnement (mode FAST...)...
    penches toi sur la doc de C18 et la datasheet...

  12. #11
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re ps :

    sans un "anti-rebonds" soft ou hard, chaque pression sur le BP
    engendrera plusieurs interruptions "à la suite" (because rebonds...)...

  13. #12
    nirvo

    Re : Interruption portB pic

    bonsoir;
    vraiment je vous remercie pour toutes tes réponses, vous m'avez éclairé beaucoup de choses,
    donc tu supprimes de ton code les lignes commentées ci-dessus, ça sera déjà plus clair...
    (car l'interruption "RB" n'a rien à voir avec l'interruption INT0 du Port RB0)

    en fait maintenant je peux pas tester mais demain je vous répondrai.

    j'ai pas bien compris ce que vous voulez dire par votre dernier message, "anti - rebonds", es vous parler de la durée d'impulsion ?

    mais je vous informe que j'utilise sa pour la détection d'une trame de donnée qui est générer à une fréquence importante alors je pense que j'aurai pas de problème de détection car les impulsions sont de l'ordre de ms.

    merci

  14. #13
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re ;O]

    ok, donc tu ne devrais pas avoir de souci si ton "signal" est une "trame"...
    les rebonds c'est un "problème" spécifique aux BPs (boutons poussoirs),
    ce sont des "oscillations mécaniques indésirables", expliquées en détails ici :
    http://www.ptitrain.com/electronique...02/poussar.htm

  15. #14
    mp3dux

    Re : Interruption portB pic

    tu travailles par hasard sur la picdem2 ?
    si oui, commence déjà par enlever le cavalier led.

  16. #15
    nirvo

    Re : Interruption portB pic

    Bonjour,
    je vous remercie car je suis arrivé à faire marcher l'interruption.
    oui j'utilise la PICem 2 plus, mais j'ai pas compris pourquoi j'enlève le cavalier sur RB?


    merci

  17. #16
    nirvo

    Re : Interruption portB pic

    voila je vous transmet mon code qui permet de compter le nombre interruption généré sur le INT0(RB0)
    #pragma code high_vector=0x08
    void intterupt(void)
    {
    _asm goto interrupt_IO _endasm
    }
    #pragma code

    void interrupt_IO(void) // reception d'une interruption
    {
    if(INTCONbits.INT0IF)
    {
    c++;
    INTCONbits.INT0IF=0; //reset de flag d'intérruption
    }
    }

    void main(void)
    {
    int k=0;
    TRISBbits.TRISB0=1;
    PORTBbits.RB0=0;
    TRISAbits.TRISA0=0;
    PORTAbits.RA0=0;

    ADCON1=0x0F;
    EnablePullups(); //Pullups Activé

    INTCONbits.INT0IE=1;

    INTCON2bits.INTEDG0=0;

    INTCONbits.INT0IF=0;

    INTCONbits.GIE = 1;

    while(1);
    }
    maintenant je passe aux mesure de chaque d'urée d'impulsion et enregistrer la mesure dans un tab, pour sa je déclenche le timer 0 chaque front , alors je remplace mon bout de code dans interruption par sa :
    if(INTCONbits.INT0IF)
    {
    int i=0, TMR=0;
    if(INTCON2bits.INTEDG0==0) //front déscendant
    {
    TMR0H=0;
    TMR0L=0;
    INTCON2bits.INTEDG0=1;
    }
    else //detection sur front montant
    {
    TMR=(TMR0H<<8);
    tab[i]=TMR && TMR0L;
    i++;
    INTCONbits.INT0IF=0;
    INTCON2bits.INTEDG0=0;
    }
    }
    et ainsi la configuration de TMR 0:
    T0CON = 0x07;
    INTCONbits.TMR0IF = 0; // Initialise le flag TMR0IF d'IT INTCONbits.
    TMR0IE = 1; // Autorise les interruptions de TMR0

    mais j'ai un souci au niveau de la récupération de la valeur de TMR0 (High et Low),
    je sais pas ou est la faute

    merci
    Dernière modification par nirvo ; 28/07/2010 à 11h45.

  18. #17
    invite7a49d0d5

    Cool Re : Interruption portB pic

    Salut,

    je comprends pas bien "ta méthode" d'initialision du Timer0...
    T0CON = 0x07; // 0b00000111;
    ce qui "donne":
    - Prescaler = 256
    - résolution de 8 bits

    c'est voulu (le prescaler et la résolution)?
    si oui, ben tu trouveras simplement la valeur dans
    le registre TMR0L (TMR0H étant inutilisé en "mode 8bits")...

    si tu "passes" en 16 bits, pour "calculer" la valeur,
    je fais ainsi : varTimer16b = TMR0H*256 + TMR0L; //

    vede
    ;O]
    _______________
    ...

    ps : tin tin tin, tin tin tin tin tinnnnnn... 3001nième POST ;O]

  19. #18
    invite7a49d0d5

    Cool Re : Interruption portB pic

    ps ;O]

    je me suis gourré ;O]

    tu es bien sur 16bits (T0CON.T08BIT = 0)...

    donc pour "extraire" la valeur :

    valTimer016bits = TMR0H*256 + TMR0L;

  20. #19
    nirvo

    Re : Interruption portB pic

    bsoir,
    en fait pour cette application je sais que l'implusion est de l'ordre de 500microS, j'ai pensé que etre en 16 bits ou en 8 bits va pas influencer sur le calcul de la durée d'implusion

    je vois que ta méthode est bonne mais mon code ne rentre mème pas dans la routine interruption du timer0

    alors il y a un problème au niveau de la routine,

    voila ma routine complète, alors j'utilise un tableau pour récupérer la durée de chaque impulsion pour calculer en fin la moyenne qui va me servir de fraquence nominale :

    void interrupt_IO_Timer(void) // reception d'une interruption
    {
    if(INTCONbits.INT0IF)
    {
    int i=0;
    if(INTCON2bits.INTEDG0==0) //front déscendant
    {
    T0CONbits.TMR0ON=1;
    INTCON2bits.INTEDG0=1;
    }
    else
    {
    T0CONbits.TMR0ON=0; //arret du timer
    tab[i]=TMR0H*256 + TMR0L;
    i++;
    INTCON2bits.INTEDG0=0;
    }
    INTCONbits.INT0IF=0;
    }
    voila merci pour ton aide

    nirvo

  21. #20
    mp3dux

    Re : Interruption portB pic

    Citation Envoyé par nirvo Voir le message
    Bonjour,
    je vous remercie car je suis arrivé à faire marcher l'interruption.
    oui j'utilise la PICem 2 plus, mais j'ai pas compris pourquoi j'enlève le cavalier sur RB?


    merci
    remets le cavalier et teste de nouveau ton interruption sur RB0 tu verras.

    l'interruption est déclenchée matériellement par le passage d'un seuil à un autre, dans un sens que tu configures avec INTEDG0.
    Le cavalier des leds perturbe ce seuil. C'est pour ça que la led sur RB0 est toujours légèrement allumée...

  22. #21
    mp3dux

    Re : Interruption portB pic

    Citation Envoyé par nirvo Voir le message
    je vois que ta méthode est bonne mais mon code ne rentre mème pas dans la routine interruption du timer0

    alors il y a un problème au niveau de la routine,

    voila merci pour ton aide

    nirvo
    je dirais qu'il y a un soucis au niveau de la priorité de l'interruption du timer.

    inverse le bit de priorité.

  23. #22
    nirvo

    Re : Interruption portB pic

    bonsoir
    remets le cavalier et teste de nouveau ton interruption sur RB0 tu verras.
    vous avez raison, mais j'ai pensé que la capacité est fait pour eviter ces perturbation

    inverse le bit de priorité.
    je vais faire sa demain, mais qu'es tu pense de l'utilisation de caprture compare pour la mesure de l'impulsion

    si demain sa marchercha pas, je vais passer à instiguer sa

  24. #23
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re ;O]

    si, la résolution va influencer le résultat (la valeur TMR0)...
    et il y a aussi la fréquence de ton quartz... et le Prescaler...

    un exemple avec un Quartz 4Mhz, et Prescaler = 1, le Timer0 s'incrémente chaque us...
    si ta résolution est 8bits, tu ne pourras "compter" 500us (car 256us max...)...

    et c'est encore "pire" avec un Quartz plus "rapide"
    (@20Mhz, en 8bits, et Prescaler=1, valmax = 51us...)...

    /////////////////////////////////////////////////////////////////

    bon, et si dans ton "main()" tu actives l'interruption INT0E (et GIE)
    il n'y a aucune raison pour qu'il ne "rentre" pas dans l'interruption...

    et je vois un "problème" dans ton tableau,
    à chaque début de mesure il y a la ligne:
    int i = 0;
    ce qui fait que même avec la ligne "i++;" le
    tableau "reste" sur le même élément (tab[0])...
    mets cette ligne (int i = 0; ) au début de ton code...
    pas dans l'interruption...

  25. #24
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re re ;O]
    Citation Envoyé par nirvo Voir le message
    (...)
    mais qu'es tu pense de l'utilisation de caprture compare pour la mesure de l'impulsion
    (...)
    là je suis pas sur... du tout...
    par contre se passer de l'interruption sur le TIMER
    pourrait simplifier le codage à mon idée...
    j'envoies un pseudo-code exemple dés que possible...

  26. #25
    nirvo

    Re : Interruption portB pic

    Bonsoir;
    j'utilise le pic avec un quartz 4MHZ , alors vous avez raison pour calculer mes 5OO(environ)MicroS, il faut au moins une résulution16bits alors

    T0CON=0x00; //OFF, T016BIT, pas la peine Prescaler


    ok pour le i;
    j'envoies un pseudo-code exemple dés que possible...
    merci vraiment

  27. #26
    invite7a49d0d5

    Cool Re : Interruption portB pic

    re re re ;O]

    Citation Envoyé par nirvo Voir le message
    Bonsoir;
    j'utilise le pic avec un quartz 4MHZ , alors vous avez raison pour calculer mes 5OO(environ)MicroS, il faut au moins une résulution16bits alors

    T0CON=0x00; //OFF, T016BIT, pas la peine Prescaler


    ok pour le i;


    merci vraiment
    exactement, @4Mhz, sans prescaler, tu devrais trouver environ 500 dans le TMR0...

    bon... et "mon idée", où j'utilise juste l'interruption sur RB0, et qui "compte"
    la durée des "états bas"... et où j'utilise un "flag" (une variable) pour démarrer
    le "comptage" dans l'attente du passage de RB0 à l'état haut...

    Code:
    int TH, TL;
    int i, flag = 0;
    int tab[50];  // s'assurer que int = 16bits...
    
    void interrupt()
    {
        flag = 1;
        INTCON.INT0IF = 0;
    }
    
    void main()
    {
        ADCON1 = 0b00001111; // ADC OFF
        TRSIB.RB0 = 1;       // RB0 IN
        
        T0CON.T08BIT = 0;    // TMR0 16 bits
        T0CON.PSA = 1;       // TMR0 Prescaler = 1
        T0CON.TMR0ON = 1;    // START TMR0
        
        INTCON2.INTEDG0 = 0; // Sur flanc descendant sur RB0
        INTCON.GIE = 1;      // Active les interruptions
        INTCON.INT0IE = 1;   // Autorise interruption sur RB0
    
        while(1)
        {
    
            if (flag==1)  // si une interruption vient d'avoir lieu
            {
                INTCON.GIE = 0;      // Désactive interruptions
                TMR0L = 0;           // init. TMR0
                TMR0H = 0;
                while(PORT.RB0==0) { ; }  // attend tant que "niveau bas"
                TH = TMR0H;
                TL = TMR0L;
                tab[i] = TH*256 + TL;     // récupéres résultat
                i++;
                flag = 0;
                INTCON.INT0IF = 0;
                INTCON.GIE = 1;     // Ré-active les interruptions
            }
    
        }
    }
    bon c'est pas du C18, mais facilement "traduisible"...

  28. #27
    nirvo

    Re : Interruption portB pic

    bonsoir;
    exactement, @4Mhz, sans prescaler, tu devrais trouver environ 500 dans le TMR0...
    mais avec une résolution 16bits je peux compter 65535 MicroS en utilisant 4MHZ, et une résolution 16bits et sans préscaler, non?

    je vais m'inspirer ton code, c'est très intéressant !!

    merci

  29. #28
    invite7a49d0d5

    Cool Re : Interruption portB pic

    ps :

    bon après c'est "un peu moins pro"...

    une courte recherche sur Gogle (INTDEG0)
    retourne des exemples où ils y sont "arrivés"
    comme tu avais prévu... un exemple pioché :
    http://venus.ece.ndsu.nodak.edu/~glo...10/303_INT.pdf

  30. #29
    invite7a49d0d5

    Cool Re : Interruption portB pic

    Citation Envoyé par nirvo Voir le message
    bonsoir;

    mais avec une résolution 16bits je peux compter 65535 MicroS en utilisant 4MHZ, et une résolution 16bits et sans préscaler, non?

    je vais m'inspirer ton code, c'est très intéressant !!

    merci
    exactement, @4Mhz, sur 16bits, Prescaler 1, tu peux compter 65536us maxi...
    ;O]

  31. #30
    nirvo

    Re : Interruption portB pic

    merci
    je vous tiens au courant tommorow

    merci b1

    nirvo

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/07/2010, 06h34
  2. PORTB d'un PIC 18F : RB5 bug
    Par black templar dans le forum Électronique
    Réponses: 6
    Dernier message: 07/01/2010, 22h15
  3. Pb PORTB PIC
    Par invite24eebdfe dans le forum Électronique
    Réponses: 3
    Dernier message: 02/06/2008, 09h43
  4. interruptions portB PIC
    Par romelec dans le forum Électronique
    Réponses: 6
    Dernier message: 02/05/2004, 10h12
Découvrez nos comparatifs produits sur l'informatique et les technologies.