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

Probléme avec interruption INTCON.RBIE sur 16F88...



  1. #1
    vede

    Cool Probléme avec interruption INTCON.RBIE sur 16F88...


    ------

    Bonjour à tous,

    voici enfin mon premier thread ;O]

    j'essaie d'utiliser l'interruption RBIE pour
    compter des impulsions sur le PortB.7

    ça fonctionne, mais mal, car chaque impulsion
    déclenche 2 fois l'interruption... au lieu d'une...

    pour le cablage, j'ai mis un BP sur le PortB.7
    configuré en entrée, et 7 leds sur les ports
    PortB.0:6 configurés en sorties, leds pour
    visualiser en binaire le comptage des impulsions...

    ci-dessous, le code complet, en MikroBasic...

    merci d'avance pour tous vos eclaircissements,

    vede
    ;O]

    Code:
    program testint
    
    dim i, compteur as byte
    
    sub procedure interrupt
      PortB =compteur              ' allume des leds
      inc(compteur)                   ' incrémente le compteur
      Delay_ms(200)                 ' délai avant re-activation interruption
      INTCON =%10001000      ' GIE = 1; RBIE = 1; RBIF = 0;
    end sub
    
    main:
    OSCCON=%1110000                        ' choix oscillateur interne, à 8Mhz
    while testbit(OSCCON,IOFS)=0 wend ' attente stabilisation oscillateur
    
    ANSEL =%00000000                ' met tous les ports en numérique
    TrisA =%00000000                  ' met tous les ports A en sorties
    TrisB =%10000000                  ' met RB7 en entrée, autres ports RBx en sorties
    PortA =%00000000                 ' met tous les ports A à 0
    PortB =%00000000                 ' met tous les ports B à 0
    
    i =0
    compteur =0                       ' init compteur
    INTCON =%10001000        ' GIE = 1; RBIE = 1; RBIF = 0;
    while i =0 wend                   ' boucle infinie
    
    end.

    -----

  2. Publicité
  3. #2
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    PS :

    le PortB.7 en entrée, est connecté à VSS via une resistance de 10K (Pull Down),
    et il est connecté au Bouton Poussoir, qui "commute" sur VDD...le temps d'une pression...

    je vais tenter en inversant (PortB7 connecté à VDD via resistance (Pull Up) et BP commutant VSS...)...

    sinon ça n'est pas non plus un probléme de rebond, vu la temporisation de 200ms
    imposée avant re-activation de l'interruption...

  4. #3
    endavan

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    salut
    je ne vois pas la remise à 0 du flag RBIF

  5. #4
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Citation Envoyé par endavan Voir le message
    salut
    je ne vois pas la remise à 0 du flag RBIF
    bonsoir,

    je pense que je le fait en faisant

    INTCON =%10001000

    je me trompe?

    vede
    ;O]

  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
    Gérard

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Dans le main, après i = 0, tu écris compteur = 0, c'est normal ?

  9. #6
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Citation Envoyé par Gérard Voir le message
    Dans le main, après i = 0, tu écris compteur = 0, c'est normal ?
    Bonsoir Gerard,

    oui, c'est normal,
    j'initialise 2 variables,

    i ...qui sert à rien (juste dans la boucle sans fin)...
    et
    compteur... qui me permet de visualiser le nombre d'impulsion...

    ensuite j'active l'interruption
    et je met une boucle sans fin...

    ça fonctionne, mais à chaque appui, le compteur avance
    de 2 au lieu de 1, comme si l'interruption s'éxecutait 2 fois...

    vede
    ;O]

  10. Publicité
  11. #7
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Bonsoir à tous,

    bon ben...
    toujours pas glop ;O[

    j'ai ajouté INTCON=%00000000
    au début de mon interruption...
    sans aucun resultat...(toujours le même probléme)

    Code:
    sub procedure interrupt
      INTCON =%00000000
      PortB =compteur
      inc(compteur)
      Delay_ms(200)
      INTCON =%10001000
    end sub
    puis j'ai inversé le Pull Down en Pull Up avec
    le BP "commutant" sur VSS au lieu de VDD...
    toujours sans resultat...(toujours le même probléme)

    je comprends vraiment pas d'où vient le probléme...
    merci d'avance si vous avez une piste...

    vede
    ;o]

    ps : l'interruption "parait" s'executer 2 fois d'affilée...
    au lieu d'une fois, à chaque impulsion (pression sur BP)...
    allumage des leds, incrémentation puis délai de 200ms...

    Re, qq minutes + tard...

    bon ben ça fonctionne si je met les leds sur le PortA...
    mais c'est pas mon but...
    Code:
    sub procedure interrupt
      INTCON =%00000000
      PortA =compteur
      inc(compteur)
      Delay_ms(200)
      INTCON =%10001000
    end sub
    et ça fonctionne si je met la temporisation de 200ms avant
    tout dans le code de l'interruption...
    mais c'est pas mon but non plus...
    (et j'ai pas le temps...200ms c'est ENORME...
    ai tésté avec 50 et 100ms...ça passe pas...)
    Code:
    sub procedure interrupt
      INTCON =%00000000
      Delay_ms(200)
      PortB =compteur
      inc(compteur)
      INTCON =%10001000
    end sub
    comment ce fait ce que parce que j'assigne les sorties du PortB aprés
    avoir désactivé l'interruption, cela engendre une interruption???
    si je n'ajoute pas une temporisation de 200ms...(100ms mini...)...

    hein?

    comment ce fait ce ?

    ;O]


    encore merci d'avance pour vos eclaircissements,
    vede
    ;O]

  12. #8
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    re

    je pense que ça bug sur le flag de l'interruption...RBIF...
    y faut que je le scrute en permanence...demain...

    en attendant un retour d'expérience...

  13. #9
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Citation Envoyé par vede Voir le message
    re

    je pense que ça bug sur le flag de l'interruption...RBIF...
    y faut que je le scrute en permanence...demain...

    en attendant un retour d'expérience...
    euhhhhh...

    des retours d'experiences ;O)

    bonn'nnuit @ tous ;O)
    vede
    ;O)

  14. #10
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Bonsoir à tous,

    bon ben c'est toujours pas glop...

    entre temps j'ai fait des essais en utilisant l'interruption INTE
    (INTCON=%10010000)... et là ça fonctionne impecc... avec
    le BP sur RB0....

    le probléme est que je voulais
    utiliser RB7 en entrée et RB0:6 en sorties (leds),
    plutot que RB0 en entrée et RB1:7 en sorties (leds)...

    aidez moiiiiiiiiiiiiiiiiiiiiiiiiii ;O]
    vede
    ;O]

  15. #11
    maximilien

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Une idée vite fais en passant...

    Sur RB0 on peut choisir sur quel front on déclenche.
    Mais pas sur l'INT RB4-7. Si??

    Ça expliquerai les doubles int...

  16. #12
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Bonsoir Maximilien,

    non, je ne crois pas que l'on puisse choisir quel front déclenche
    l'interruption sur RB4:7...là je suis sur RB7 branché en Pull Down,
    avec le BP qui commute sur VDD...

    mais bon, théoriquement, une fois déclenchée, l'interruption met le
    drapeau (flag) RBIF à 1, ce qui devrait empêcher son re-declenchement
    tant que le drapeau RBIF n'est pas remit à 0, dans mon code... non?

    sinon j'ai ait des essais, en mettant la temporisation de 200ms avant
    d'assigner le PortB avec le compteur (allumer des leds), et bien ça fonctionne...

    mais bon, une temporisation pareille est inimaginable dans mon projet...

    vede
    ;O)

  17. Publicité
  18. #13
    RISC

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Salut,

    Lis bien la datasheet....section 5.2.
    Les broches RB4 a RB7 sont des "IOC" (Interrupt On Change) c'est à dire qu'il y a une interruption sur CHAQUE front...

    De plus il faut utiliser une procédure spéciale pour nettoyer le flag d'interruption RBIF :
    * Il faut IMPERATIVEMENT lire ou écrire le registre PORTB pour pouvoir nettoyer le flag RBIF dans l'interruption.

    a+
    Dernière modification par RISC ; 31/10/2009 à 22h19. Motif: correction

  19. #14
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Salut RISC,

    ok je veux bien, donc vu qu'un appui sur un BP engendre 2 fronts
    (un montant et un descendant), cela engendre 2 interruptions...
    donc c'est normal?

    dans ce cas me suffira-t-il d'ajouter une variable drapeau/état
    afin de detecter et anhilier cette seconde interruption intempestive?
    intempestive pour moi ;O]

    parce que pour moi, le premier front (disons montant), devrait
    engendrer une interruption, donc mettre à 1 le drapeau RBIF, et
    donc "cacher"/"desactiver" la seconde interruption, vu que je remet
    pas à zéro le drapeau RBIF tout de suite...

    où c'est que je me trompe dans ma logique?

    vede
    ;O]

  20. #15
    RISC

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Salut,

    Avec un drapeau tu peux effectivement executer une fois sur 2 le code de l'interruption...mais attention !

    Si tu n'as pas prévu d'anti-rebond logiciel ou matériel c'est pas 2 interruptions par appui sur le bouton poussoir que tu vas avoir mais des dizaines...

    Qu'as-tu prévu pour l'anti rebond ?

    a+

  21. #16
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    ..Bonsoir à tous,

    >Qu'as-tu prévu pour l'anti rebond ?

    rien de special, a part la temporisation logicielle en mode test...

    au final, l'interruption sur RB7 sera générée par un autre pic, donc sans rebonds...

    générée avec un code du style
    PortA.0 =1
    NOP
    PortA.0=0

    avec PortA.O en sortie du "PIC MAITRE"
    connecté à RB7 en entrée du "PIC ESCLAVE"

    bon mais sans ça, ça m'enerve, donc je vais partir
    sur l'interruption INTE de RB0 en attendant de comprendre...
    pourquoi le BP engendre 2 interruptions sur RB7 avec RBIE...

    vede
    ;O]

  22. #17
    schmo

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    salut,

    L'interruption RBIF se fait donc sur un changement d'etat des entrées de portB. C'est à dire qu'une premiére lecture du registre portB défini l'état de départ. On aurras une interrutions si une des entrées vient à changer d'état (dans ton cas il y a que RB7). RBIF sera réactivé tant que cette différence d'état existera. Ou qu'un nouvel état de départ soit pris en compte. Ce qui peut arriver si on utilise les instructions :
    MOVF PORTB, BSF .., BCF .., ANDWF .. ou IORWF ..

    Il faudrait vérifier que l'instruction basic 'PORTB = COMPTEUR' n'est pas compilée en utilisant une des instructions assembleurs citées.
    Ce qui pourrait expliquer que ça marche quand tu utilise le portA.
    et avec PORTB ca donne:
    le 1er changement d'état déclenche l'interruption, la commande PORTB=COMPTEUR entraine une nouvelle lecture de l'etat de RB7, donc lorsque tu relache le BP, RB7 rechange d'etat donc une nouvelle interruption est déclenché..

    .. Je sait pas si je suis trés clair dans mes explications, mais çà à l'air de coller avec les symptomes

    A+

  23. #18
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    salut schmo,

    merci pour ton aide,

    ce que je comprend pas, la premiere instruction
    executée aprés l'interruption est la desactivation
    de l'interruption (INTCON=b00000000)...

    donc pourquoi une deuxiéme interruption à lieu?
    puisque les interruptions sont désactivées...
    quel que soit l'état de PortB...

    vede
    ;O]

  24. Publicité
  25. #19
    DavidDB

    Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Salut,

    Faut déjà revoir tes bases de la programmation et tenir compte des remarques de Risc...

    Ensuite, dans l'interruption on ne réactive jamais GIE sous peine d'un sérieux bug, GIE se réarme automatiquement en sortie d'int...

    Ce qui se produit dans ton programme est on ne peut plus logique, tu réactives les INT dans la routine d'INT en même temps que tu effaces le flag, donc, tu retournes à nouveau dans la routine d'int avec cette fois là, le flag effacé correctement!

    David.

  26. #20
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Bonjour à tous,

    >Le seul moyen de trouver a été de décortiquer le code assembleur généré...

    en effet, j'en suis là...

    aprés avoir enlevé/déplacé la temporisation et la re-init. de l'int en dehors de l'int. elle-même...
    puis avec un anti-rebond hardware (RC)... sans résultats...
    merci à tous pour votre soutien...
    et je vous tiens au jus....
    quand ça fonctionnera....

    vede
    ;O]

    ps
    -il faut "lire ou écrire" le portB, avant de pouvoir re-initialiser RBIF...
    -l'interruption RBIE génére une interruption sur chaque flanc (Interrupt On Change)
    -éviter de mettre une temporisation dans une interruption....
    -éviter de re-initialiser l'interruption dans l'interruption...

    d'aprés le datasheet (paragraphes 2.3, 5.2 et 15.10.3 du 16F88)...et des avis...
    ce que je m'efforce de faire...sans succés...;O[

    pour info, mon code d'interruption actuel>

    sub procedure interruption
    inc (compteur)
    i=1
    end sub

    je peux pas faire plus court...
    d'ailleurs plus rien ne marche....
    aucune led s'allume...
    bon, bonn'nuit...
    et à demain...
    ;O]

  27. #21
    bs.amine

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    bonjour VEDE
    pour votre probleme je vais le voir apres cet apres midi mnt je dois sortir au cours
    mais j'ai deja lis une petite remarque qui dit:
    PORTB: de la meme maniere une interruption peut etre generee lors de changement de niveau d’un niveau sur une des pins RB4 à RB7. Il n’est pas possible de limiter l’interruption à une seule de ces pins. L’interruption sera effective pour les 4 pins ou pour aucune.
    donc tu genere 2 interruption je pense une en entree et l'autre quand vous allumez les led's

    reference :LA PROGRAMMATION DES PIC®
    PAR BIGONOFF

    part 1 page 112
    car d'apres une petite lecture j'ai constate que vous avez utilisez le portb en entree et sortie au meme temps et celui ci est impossible selon la remarque si vous voulez utilisé ce port pour genere des interruptions

    pour mon code je l'ai deja envoye par MP celui du code complet si je me rapelle sinon
    je peux vous le renvoyer si vous desiriez
    merci et bonne journee

  28. #22
    vede

    Cool Re : Probléme avec interruption INTCON.RBIE sur 16F88...

    Citation Envoyé par DavidDB Voir le message
    Salut,

    Faut déjà revoir tes bases de la programmation et tenir compte des remarques de Risc...

    Ensuite, dans l'interruption on ne réactive jamais GIE sous peine d'un sérieux bug, GIE se réarme automatiquement en sortie d'int...

    Ce qui se produit dans ton programme est on ne peut plus logique, tu réactives les INT dans la routine d'INT en même temps que tu effaces le flag, donc, tu retournes à nouveau dans la routine d'int avec cette fois là, le flag effacé correctement!

    David.
    Bonjour za toutes zé tous...

    comme j'ai pas zinternet la semaine en ce moment j'ai tout relu... Part1 et 2...
    et passé mes soirées sur "ce fait"...et rien à faire... cela génére 2 interruptions...
    puis j'ai réfléchis... dans eul'train eud'Lille... et je re-vais essayer cette semaine...
    avec style un compteur d'int RB4-7 et un modulo...
    mais je trouve pas ça "génial"... de générer 2 int pour en utiliser 1/2...

    sinon (hi RISC, Gérard...) mes premiers tests avec des quartz 32768Hz
    comme "base" d'horloge horaire paraissent en effet concluants...
    je vous tiens au jus quand je rentre (et que je câble mes 10 réveils atomiques
    pour vérifs ;O])

    bon ben bon'Dimanche za toutes zé tous,
    vede
    ;O]
    __________
    ...

Discussions similaires

  1. SPI multi esclaves entre 16f88 avec PICC de ccs
    Par uranie-mc dans le forum Électronique
    Réponses: 3
    Dernier message: 17/04/2012, 12h14
  2. Problème interruption sur PIC16F
    Par jolindien dans le forum Électronique
    Réponses: 7
    Dernier message: 21/01/2009, 18h26
  3. CAN avec 16F88 ne fonctionne pas
    Par demos dans le forum Électronique
    Réponses: 6
    Dernier message: 15/01/2009, 07h33
  4. Programmer avec ICprog un 16F88
    Par yuopaznn dans le forum Électronique
    Réponses: 0
    Dernier message: 31/05/2008, 20h08
  5. Registre Intcon
    Par franck1 dans le forum Électronique
    Réponses: 7
    Dernier message: 09/07/2005, 12h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.