Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 37

Interruption avec 16f84



  1. #1
    plastik

    Interruption avec 16f84

    Bonjour à tous,
    je débute la programmation du PIC 16f84A en Basic avec mikrobasic.
    J'ai déjà fait quelques petit programme tout simple pour m'entrainer.
    Je souhaiterai maintenant créer un programme qui lorsque l'on appuie sur un bouton poussoir allume une LED.
    J'ai mis le bouton poussoir sur RB4 et la LED sur RB0.
    Je me suis déjà un peu renseigné en parcourant les forum un peu partout sur le net et j'ai cru comprendre qu'il fallait utiliser une instruction qui s'appelle "INTCON"?? J'ai essayé beaucoup de chose mais rien à faire je n'y arrive pas.
    Est-ce que quelqu'un pourrait m'en dire plus à propos de cette instruction??
    Merci pour votre aide.

    -----


  2. Publicité
  3. #2
    HULK28

    Re : Interruption avec 16f84

    Salut,

    en fait INTCON n'est pas une instruction mais le registre des interruptions.
    Tout est bien qui finit.

  4. #3
    plastik

    Re : Interruption avec 16f84

    ah ok. Et est-ce que tu aurais un exemple de programme ou une petite explication à me fournir sur ce registre qui puisse m'aider pour mon petit programme??

  5. #4
    Gérard

    Re : Interruption avec 16f84

    Bonjour,
    Pour le 16F84, tu devrais lire Bigonoff.
    http://www.abcelectronique.com/bigonoff/
    Le cours 1 traite du 84, c'est de l'assembleur mais les explications sont très bien faites.
    Bonnes lectures.

  6. #5
    HULK28

    Re : Interruption avec 16f84

    Le principe est le suivant:

    B.P sur RB4, B.P est relié à la masse par exemple avec une resistance de pull-up de 10K.

    1/Il faut positionner le portB en entrée avec TRISB.
    2/Il faut configurer le registre INTCON pour que l'interruption soit détectée.

    Dans INTCON les bits suivants vont nous intéresser:

    bit0:RBIF
    C'est le drapeau qui passe à 1 dès que RB input (RB4~RB7) change d'état.
    On le positionne à l'initialisation à 0.
    Il n'est actif que si RBIE est activé.

    bit3:RBIE mis à 1 pour autoriser une interruption sur RB4~RB7.

    bit7: GIE (Global Interrupt Enable): il permet d'interdire ou de valider toute les interruptions.

    Donc il faut déclarer INTCON=0b10001000;

    Ensuite lorsqu'une interruption est détectée, RBIF passe à 1, on déclenche à ce moment l'action que doit exécuter le µC (par exemple mettre RB0 à 1 pour allumer une led), puis une fois fait on remet RBIF à 0 pour attendre une nouvelle interruption (dont l'action associée sera alors d'éteindre la led par exemple).
    J'espère t'avoir un peu éclairé.
    @+
    Tout est bien qui finit.

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

    Re : Interruption avec 16f84

    En C ça donnerait ça:

    Code:
    void init_pic(void)
    {
    TRISB=0b00010000; //RB4 en entrée, le reste en sortie
    PORTB.F0=0; // Led sur RB0 (330 Ohms + led à la masse), on positionne à 0 la sortie
    INTCON=0b10001000; (voir post précédent pour les affectations des bits)
    }
    
    void main(void)
    {
    while(1) // boucle infini, le programme tourne dans cette boucle
    }
    
    void interrupt(void)  // routine d'interruption
    {
    if (RBIF==1) // Une interruption sur le portB est détectée
       {
       PORTB.F0=~PORTB.F0;  // Toggle sur RB0
       RBIF=0; // On repositionne le flag à 0 avant de quitter la routine d'interruption
       }
    }
    Pas testé mais ça doit fonctionner, il te reste à traduire en basic.
    Tout est bien qui finit.

  9. Publicité
  10. #7
    plastik

    Re : Interruption avec 16f84

    Citation Envoyé par HULK28 Voir le message
    Le principe est le suivant:

    B.P sur RB4, B.P est relié à la masse par exemple avec une resistance de pull-up de 10K.

    1/Il faut positionner le portB en entrée avec TRISB.
    2/Il faut configurer le registre INTCON pour que l'interruption soit détectée.

    Dans INTCON les bits suivants vont nous intéresser:

    bit0:RBIF
    C'est le drapeau qui passe à 1 dès que RB input (RB4~RB7) change d'état.
    On le positionne à l'initialisation à 0.
    Il n'est actif que si RBIE est activé.

    bit3:RBIE mis à 1 pour autoriser une interruption sur RB4~RB7.

    bit7: GIE (Global Interrupt Enable): il permet d'interdire ou de valider toute les interruptions.

    Donc il faut déclarer INTCON=0b10001000;

    Ensuite lorsqu'une interruption est détectée, RBIF passe à 1, on déclenche à ce moment l'action que doit exécuter le µC (par exemple mettre RB0 à 1 pour allumer une led), puis une fois fait on remet RBIF à 0 pour attendre une nouvelle interruption (dont l'action associée sera alors d'éteindre la led par exemple).
    J'espère t'avoir un peu éclairé.
    @+
    Woauh nickel l'explication!! Je vais de suite tester cela. Je vous tiens au courant. Merci

  11. #8
    HULK28

    Re : Interruption avec 16f84

    Il faudra ajouter une tempo certainement pour s'affranchir des rebonds du B.P, ou utiliser le timer0 par exemple, ça peu faire un bon exo d'application.
    @+
    Tout est bien qui finit.

  12. #9
    plastik

    Re : Interruption avec 16f84

    Bon je viens de tester mais ça ne marche pas
    Voilà mon programme:

    trisb.0=0
    trisb.4=1
    INTCON = %10001000
    main:
    if portb.4 = 1 then
    portb.0=1
    delay_ms(1000)
    portb.0=0
    INTCON = 0
    end if
    goto main

    C'est sur j'ai mal fait quelque chose au niveau du IF mais quoi??

    En fait la LED reste tout le temps allumée.

  13. #10
    plastik

    Re : Interruption avec 16f84

    Après avoir relu et relu les explications je réexaminé mon programme et je l'ai réecrit:

    trisb.0=0
    trisb.4=1
    INTCON = %10001000
    portb.0=0
    main:
    if INTCON.0 = 1 then
    portb.0=1
    delay_ms(1000)
    portb.0=0
    INTCON.0 = 0
    end if
    goto main
    end.

    Il me semble plus juste comme ceci mais là rien ne se passe lorsque j'appuie sur mon bouton poussoir.
    Décidément je ne comprend pas, j'ai pourtout bien suivi les explications, non??

  14. #11
    HULK28

    Re : Interruption avec 16f84

    Il te manque la routine d'interruption :

    sub procedure interrupt
    begin
    ' code
    end sub

    C'est là que tu dois placer les instructions pas dans le main.
    Tout est bien qui finit.

  15. #12
    plastik

    Re : Interruption avec 16f84

    Citation Envoyé par HULK28 Voir le message
    Il te manque la routine d'interruption :

    sub procedure interrupt
    begin
    ' code
    end sub

    C'est là que tu dois placer les instructions pas dans le main.
    Ah ok je comprend
    Merci beaucoup je vais tester ça ce-soir chez moi (je suis au boulot là)
    Je reviendrai pour dire si ça marche ou pas. Merci encore.

  16. Publicité
  17. #13
    Gérard

    Re : Interruption avec 16f84

    Bonjour,
    Tu devrais quand même lire Bigonoff.

  18. #14
    plastik

    Re : Interruption avec 16f84

    Citation Envoyé par Gérard Voir le message
    Bonjour,
    Tu devrais quand même lire Bigonoff.
    Oui je sais j'ai déjà lu mais bon c'est que de l'ASM et moi je souhaite rester en BASIC.
    Je teste d'ici quelques minutes

  19. #15
    Gérard

    Re : Interruption avec 16f84

    Citation Envoyé par plastik Voir le message
    Oui je sais j'ai déjà lu mais bon c'est que de l'ASM et moi je souhaite rester en BASIC.
    Je teste d'ici quelques minutes

    Bigonoff explique aussi les différents registres et l'organisation globale d'un programme.
    Visiblement, tu as oublié la routine d'interruption. Que ce soit en asm, Basic ou autre, la philosophie générale est la même.

  20. #16
    plastik

    Re : Interruption avec 16f84

    Citation Envoyé par Gérard Voir le message
    Bigonoff explique aussi les différents registres et l'organisation globale d'un programme.
    Visiblement, tu as oublié la routine d'interruption. Que ce soit en asm, Basic ou autre, la philosophie générale est la même.
    Oui tu as raison.
    Mais c'est là que je ne comprend pas, car je pensais qu'il fallait juste lui faire detecter l'interruption.

    Donc j'ai testé mais ça ne marche pas ça m'enerve et ça me donne envie de pleurer en même temps!!
    S'il vous plaît quelqu'un aurait un exemple de programme en BASIC qui allume une LED lorsque l'on appuie sur un BP??

  21. #17
    plastik

    Re : Interruption avec 16f84

    Voila mon programme:

    program essai16f84

    sub procedure interrupt
    portb.0=1
    delay_ms(1000)
    portb.0=0
    INTCON.0 = 0
    end sub

    main:
    trisb.0=0
    trisb.4=1
    INTCON = %10001000
    portb.0=0
    goto main
    end.

    Mais ça ne marche pas

  22. #18
    HULK28

    Re : Interruption avec 16f84

    Tu peux nous montrer ton schéma d'appli?
    Ta compli est bonne, pas d'erreur?
    Tout est bien qui finit.

  23. Publicité
  24. #19
    plastik

    Re : Interruption avec 16f84

    Pendant la compil il n'y a pas d'erreurs.
    Voilà mon schéma: (j'ai mis 2 LED mais pour l'instant j'en utilise qu'une seule)


  25. #20
    HULK28

    Re : Interruption avec 16f84

    Met plutôt des 22pF pour le quartz, sinon rien d'anormal...
    La résistance du B.P, 10K?
    Tout est bien qui finit.

  26. #21
    HULK28

    Re : Interruption avec 16f84

    Comment as-tu déclarer les bits de config dans ton programmateur?
    A tout hasard, la led est câblée dans le bon sens?
    Dernière modification par HULK28 ; 04/01/2008 à 00h57.
    Tout est bien qui finit.

  27. #22
    plastik

    Re : Interruption avec 16f84

    lol oui tout est bien configuré car d'autre programmes fonctionnent. J'ai fait des programmes tout simple comme par exemple faire clignoter les LED alternativement et tout fonctionne nickel.
    Donc selon toi mon programme dans l'état actuel devrait fonctionner??

  28. #23
    Tix

    Re : Interruption avec 16f84

    Salutations

    Tu devrais quand même lire Bigonoff.
    Mais, il ne venait pas a u momment sur le forum ? ca fait un bail je crois, que je ne l'y revois plus :'(

    en ce qui concerne l'assembleur, c'ets pas tres compliqué, et ca permet de bien comprendre comment le pic fonctionne et se comporte, si plussoiement il peut y avoir, plussoiment il y a

    ++

  29. #24
    plastik

    Re : Interruption avec 16f84

    Citation Envoyé par Tix Voir le message
    Salutations



    Mais, il ne venait pas a u momment sur le forum ? ca fait un bail je crois, que je ne l'y revois plus :'(

    en ce qui concerne l'assembleur, c'ets pas tres compliqué, et ca permet de bien comprendre comment le pic fonctionne et se comporte, si plussoiement il peut y avoir, plussoiment il y a

    ++
    Oui je suis d'accord avec toi, mais c'est chiant d'autant plus que le basic je connais déjà c'est plus simple pour moi.

    Si quelqu'un a un exemple de programme qui permette d'allumer une LED en appuyant sur un BP, je suis preneur. Histoire que je puisse voir comment ça fonctionne les interruptions en BASIC.

  30. Publicité
  31. #25
    Oncle Archibald

    Re : Interruption avec 16f84

    Citation Envoyé par plastik Voir le message
    Voila mon programme:
    program essai16f84

    sub procedure interrupt
    portb.0=1 Allumer la LED
    delay_ms(1000) Attendre une seconde
    portb.0=0 Eteindre la LED
    INTCON.0 = 0 RAZ RBIF
    end sub

    main:
    trisb.0=0 Init bit 0 de PB en sortie
    trisb.4=1 Init bit 4 de PB en entrée
    INTCON = %10001000 Init registre d’interuption
    portb.0=0 RAZ bit 0 dePB
    goto main Réinitialise tout ???
    end.
    Salut,
    A la place de "goto main" j'aurais mis une routine anti-rebond du BP bouclant sur elle-même (en attente du prochain appui sur le BP).

  32. #26
    plastik

    Re : Interruption avec 16f84

    Hum...
    Oui tu as raison. Je vais essayer.
    Merci

  33. #27
    Khawerizmi

    Re : Interruption avec 16f84

    il faut metre un '1' au bit7 du INTCON:

    Bit 7: GIE (Global Interrupt Enable) fonctionne en R/W.
    - Autorise ou non les interruptions, quelles qu'elles soient
    - Après Power On Reset: Passe à 0. Après tous les autres Resets: Passe à 0.
    - Bit=0 -> Interdit toutes les interruptions
    - Bit=1 -> Autorise toutes les interruptions non masqués
    - Il passe seul à 0 pendant le traitement interruption, il est remis à un par l'instruction RETFIE (Return From Interrupt)

    puis metre un '1' au bit4 du INTCON:

    Bit 4: INTE (Interrupt Enable) fonctionne en R/W .
    - Autorise ou non les interruptions par l'entrée RB0/INT broche 6
    - Après Power On Reset: Passe à 0.
    - Bit=0 -> Interdit l'interruption par l'entrée RB0/INT broche 6
    - Bit=1 -> Autorise l'interruption par l'entrée RB0/INT broche 6


    il faut faire celai au debut du programme puis même si une interreption surgit le programme ne fait rien car lors d'une interruption (quelconque) le PIC saute directement à l'adresse 0x004 et quand il ne trouve rien il ne fait rien , alors il doit trouvé un "call interupt" pour qu'il puisse executé t'on sous programme.
    comment faire ça en ASM je le sais mais en BASIC je ne sais pas a toi de voir.

    attention il faut remétre le FLAG INTF à 0 sinon il boucle sur l'interuption.

  34. #28
    Gérard

    Re : Interruption avec 16f84

    Bonjour,
    Je travaille avec Proton+ (compilateur Basic). Il existe une instruction spéciale pour les interruption : on_interrupt

    Dans un de mes prog, j'utilise l'irq de TMR1 (Timer1) et j'écris ce qui suis :

    ; SAUT VERS INTERRUPTION TIMER1


    on_interrupt IRQ_TMR1

    IRQ_TMR1 est une étiquette où va aller le prog pour exécuter la routine d'irq

    Peut-être que ton compilateur a aussi une instruction spéciale.

  35. #29
    Gérard

    Re : Interruption avec 16f84

    Suite ....
    Début de la routine d'irq :

    IRQ_TMR1:

    ASM
    bcf PIR1,TMR1IF ;flag irq TMR1 = 0
    bsf TMR1H,7 ;rechargement TMR1 8000h


    ......



    ENDASM
    RESTORER_CONTEXTE:
    Context Restore



    context restore est encore une instruction de mon compilateur

    asm et endasm servent à dire au compilateur que ce que se trouve entre est de l'asm (la routine d'irq est en asm)

  36. #30
    Oncle Archibald

    Re : Interruption avec 16f84

    Je viens de reprendre le datasheet du 16F84.
    Dans ton montage, tu as choisi de provoquer une interruption sur changement d’état d’un bit du port B (RB4). C’est donc, dans INTCON, le bit 3=RBIE (RB Port Change Interrupt Enable bit) qui est concerné par l’appui sur le BP et non pas le bit 4=INTE (RB0/INT External Interrupt Enable bit) comme tu l’as programmé.
    Vérifie aussi dans OPTION_REG l’incidence du bit 7=RPBU (PORTB Pull-up Enable bit) sur les MSB du port B.

Sur le même thème :

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Interruption Timer avec PIC16F876A
    Par black_is_beautiful dans le forum Électronique
    Réponses: 9
    Dernier message: 28/07/2007, 21h57
  2. PB interruption avec Pic, language C
    Par Cyrius666 dans le forum Électronique
    Réponses: 1
    Dernier message: 05/06/2006, 16h24
  3. Horloge avec PIC 16F84
    Par FandeMuse dans le forum Électronique
    Réponses: 16
    Dernier message: 13/04/2006, 23h32
  4. Interruption avec CC5x (Pour pic)
    Par joseph4008 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2005, 18h07