programme qui ne part pas en interruption
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

programme qui ne part pas en interruption



  1. #1
    invitec35bc9ea

    programme qui ne part pas en interruption


    ------

    Bonjour,
    avec un 16F84A, je cherche à afficher un segment d'un 7 segments à chaque fois que j'appuis sur un bouton relié à RB0.
    j'ai autorisé l'interruption RBO mais le uC reste indifferent à mon appui ou pas:
    Code:
        errorlevel    -302    ; supprime l'alerte sur les banks
     
    ;*******************************************************************
    ; configuration du compilateur
    ;*******************************************************************
        list    p=16F84        
        include <p16F84.inc>    
     
    ;*******************************************************************
    ; configuration du registre d'état du microcontroleur
    ;*******************************************************************
        __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
        
     
     
    ;*******************************************************************
    ; definition des variables
    ;*******************************************************************
        cblock    0x0c    ; adresse de debut de la RAM pour les variables
        temp0:1
        temp1:1
        index:1
        sauvegarde_W:1
        sauvegarde_S:1    
        endc
     
    ;*******************************************************************
    ; definition des macros
    ;*******************************************************************
    bank0    macro
        bcf    STATUS,RP0    ; sélectionne la page0
        bcf    STATUS,RP1    
        endm
     
    bank1    macro
        bsf    STATUS,RP0    ; sélectionne la page1
        bcf    STATUS,RP1    
        endm
     
    ;*******************************************************************
    ; Vecteur de reset
    ;*******************************************************************
        org    0x00        ; vecteur de reset
         goto    debut        ; sauter au programme principal
     
    ;*******************************************************************
    ; Vecteur d'interruption
    ;*******************************************************************
        org    0x04        ; vecteur d'interrruption
        goto interrupt
     
    ;*******************************************************************
    ; interruption
    ;*******************************************************************
        org 0x05
    interrupt
        movwf    sauvegarde_W         
        swapf    STATUS,W            
        movwf    sauvegarde_S        
        bcf        INTCON,2            
     
     
        incf    index,1
     
     
        swapf    sauvegarde_S,w        
        movwf    STATUS                
        swapf    sauvegarde_W,1
        swapf    sauvegarde_W,w    
        bsf        INTCON,2    
        retfie        
     
     
     
     
     
    ;*******************************************************************
    ; Programme principal
    ;*******************************************************************
        org    0x40
    debut    
        call    init
    boucle
        movf    index
        ;movlw    0x03
        call    table
        movwf    PORTB
        
        goto    boucle
    ;*******************************************************************
    ; initialisation
    ;*******************************************************************
    init    
        bank1
        movlw    0b00000000    ;
        movwf    TRISA        
        movlw    0b00000000    ; 
        movwf    TRISB        ;
        movlw    0b00000000    ;
        movwf    OPTION_REG    
        movlw    0b10010000    ;
        movwf    INTCON
        bank0
        clrf    PORTB        ; 
        clrf    PORTA
        movlw    0x00
        movwf    index
        return            ;
     
     
    ;********************************************************************
    ; table de convertion
    ;********************************************************************
    table    
        addwf    PCL,F        ; incrémente le pointeur programme
        retlw    b'11111110'    
        retlw    b'11111101'
        retlw    b'11111011'
        retlw   b'11110111'
        retlw    b'11101111'    
        retlw    b'11011111'
        retlw    b'10111111'
        retlw   b'01111111'
     
     
        
     
        end            ; fin du programme

    -----

  2. #2
    Gérard

    Re : programme qui ne part pas en interruption

    Tu n'as pas initialisé INTCON, le bit GIE est par défaut à 0 --> jamais d'interruption.

    Voir aussi les autres bit de ce registre.

  3. #3
    invitec35bc9ea

    Re : programme qui ne part pas en interruption

    il me semblait que oui:
    movlw 0b10010000 ;
    movwf INTCON

  4. #4
    Gérard

    Re : programme qui ne part pas en interruption

    TRISx = 0 --> tout est en sortie.
    RB0 doit être en entrée.

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

    Re : programme qui ne part pas en interruption

    Woops!
    j'ai corrigé mais ça ne change rien. d'ailleur j'ai egalement essayé avec une interruption timer mais pareil, l'etat de PORTB ne change pas

  7. #6
    invite7a49d0d5

    Smile Re : programme qui ne part pas en interruption

    hi,

    je crois qu'il faut aussi clearer le bit 1 de INTCON (INTF)...
    pour "re-activer" l'interruption...

    bcf INTCON,1

    cf datasheet 16f84, section 6.8.1, page 29

    vede
    ;O]

  8. #7
    Gérard

    Re : programme qui ne part pas en interruption

    Effectivement, dans la routine d'interruption, il faut écrire :
    bcf INTCON, INTF
    toi tu mets le bit 2 (T0IF) à 0

  9. #8
    invitec35bc9ea

    Re : programme qui ne part pas en interruption

    En effet, j'ai modifié le INTCON dans l'initialisation mais pas dans l'interruption
    toutefois ça ne change rien
    avec RB0:
    Code:
        org 0x05
    interrupt
        movwf    sauvegarde_W         
        swapf    STATUS,W            
        movwf    sauvegarde_S        
        bcf        INTCON,1
    
    
        incf    index,0
    
    
        swapf    sauvegarde_S,w        
        movwf    STATUS                
        swapf    sauvegarde_W,1
        swapf    sauvegarde_W,w    
        retfie    
    [...]
    init    
        bank1
        movlw    0b00000000    ;
        movwf    TRISA        
        movlw    0b00000001    ; 
        movwf    TRISB        ;
        movlw    0b00000000    ;
        movwf    OPTION_REG    
        movlw    0b10010000    ;
        movwf    INTCON
        bank0
        clrf    PORTB        ; 
        clrf    PORTA
        movlw    0x00
        movwf    index
        return            ;
    avec TMR0:
    Code:
        org 0x05
    interrupt
        movwf    sauvegarde_W         
        swapf    STATUS,W            
        movwf    sauvegarde_S        
        bcf        INTCON,2
    
    
        incf    index,0
    
    
        swapf    sauvegarde_S,w        
        movwf    STATUS                
        swapf    sauvegarde_W,1
        swapf    sauvegarde_W,w    
        retfie    
    [...]
    init    
        bank1
        movlw    0b00000000    ;
        movwf    TRISA        
        movlw    0b00000001    ; 
        movwf    TRISB        ;
        movlw    0b00000111    ;
        movwf    OPTION_REG    
        movlw    0b10100000    ;
        movwf    INTCON
        bank0
        clrf    PORTB        ; 
        clrf    PORTA
        movlw    0x00
        movwf    index
        return            ;

  10. #9
    invite7a49d0d5

    Smile Re : programme qui ne part pas en interruption

    bonsoir,

    rien ne se passe...
    cad rien du tout?

    tu es sur du cablage?
    peut-etre rajoute
    "allumer une led sur RA3"
    au début de ton code, pour être
    sur qu'il n'y a pas de probléme
    de ce côté là...

    vede
    ;O]

  11. #10
    invitec35bc9ea

    Re : programme qui ne part pas en interruption

    bonsoir,

    rien ne se passe...
    cad rien du tout?
    aucun segment ne s'allume
    tu es sur du cablage?
    peut-etre rajoute
    "allumer une led sur RA3"
    au début de ton code, pour être
    sur qu'il n'y a pas de probléme
    de ce côté là...
    dans mo programme si je commente la ligne
    movf index
    et que je decommente
    movlw x3
    j'ai bien le segment 3 qui s'affiche
    c'est donc la valeur index qui ne change pas, comme c'est dans l'interruption que j'increment index, c'est là que devrait etre le ptrobleme

  12. #11
    invite7a49d0d5

    Smile Re : programme qui ne part pas en interruption

    re ;O]

    essayes en mettant le code de l'interruption juste
    aprés le org 0x04... au lieu de faire un goto 0x05?
    parce que la version RB0 parait bien...

    sinon un probléme de pull up/down au niveau du bouton...
    avec INTEDG (OPTION_REG<6>) = 0 (par défaut), l'interruption se
    déclenche sur un front descendant...
    et
    avec RBPU (OPTION<7>) = 0 (par défaut), les pull-up internes sont désactivées...

    sinon...l'alim...
    essaye de faire allumer tous les segments d'un coup via le pic...
    voir si ça suit...

    vede
    ;O]

  13. #12
    invite36492e34

    Re : programme qui ne part pas en interruption

    salut,

    dans ta boucle principale, ton instruction movf index correspond à movf index,F. Fais un test avec movf index,W
    Assure toi aussi que, dans ta routine d'interruption, l'instruction d'increment est bien incf index,F et non incf index,W...

  14. #13
    invitec35bc9ea

    Re : programme qui ne part pas en interruption

    Bonjour,
    j'ai suivi vos instructions: nada
    dans MPLAB, je mets un stimulus interrution mais l'execution ne saute pas à org0x04
    voici le code
    Code:
        errorlevel    -302    ; supprime l'alerte sur les banks
    
    ;*******************************************************************
    ; configuration du compilateur
    ;*******************************************************************
        list    p=16F84        
        include <p16F84.inc>    
    
    ;*******************************************************************
    ; configuration du registre d'état du microcontroleur
    ;*******************************************************************
        __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
        
    
    
    ;*******************************************************************
    ; definition des variables
    ;*******************************************************************
        cblock    0x0c    ; adresse de debut de la RAM pour les variables
        temp0:1
        temp1:1
        index:1
        sauvegarde_W:1
        sauvegarde_S:1    
        endc
    
    ;*******************************************************************
    ; definition des macros
    ;*******************************************************************
    bank0    macro
        bcf    STATUS,RP0    ; sélectionne la page0
        bcf    STATUS,RP1    
        endm
    
    bank1    macro
        bsf    STATUS,RP0    ; sélectionne la page1
        bcf    STATUS,RP1    
        endm
    
    ;*******************************************************************
    ; Vecteur de reset
    ;*******************************************************************
        org    0x00        ; vecteur de reset
         goto    debut        ; sauter au programme principal
    
    ;*******************************************************************
    ; Vecteur d'interruption
    ;*******************************************************************
        org    0x04        ; vecteur d'interrruption
        goto interrupt
    
    ;*******************************************************************
    ; interruption
    ;*******************************************************************
    interrupt
        movwf    sauvegarde_W         
        swapf    STATUS,W            
        movwf    sauvegarde_S        
        bcf        INTCON,1
    
    
        incf    index,f
    
    
        swapf    sauvegarde_S,w        
        movwf    STATUS                
        swapf    sauvegarde_W,1
        swapf    sauvegarde_W,w    
        retfie        
    
    
    
    
    
    ;*******************************************************************
    ; Programme principal
    ;*******************************************************************
        org    0x40
    debut    
        call    init
    boucle
        movf    index,w
    ;    movlw    0x04
        call    table
        movwf    PORTB
        
        goto    boucle
    ;*******************************************************************
    ; initialisation
    ;*******************************************************************
    init    
        bank1
        movlw    0b00000000    ;
        movwf    TRISA        
        movlw    0b00000001    ; 
        movwf    TRISB        ;
        movlw    0b01000000    ;
        movwf    OPTION_REG    
        movlw    0b10010000    ;
        movwf    INTCON
        bank0
        clrf    PORTB        ; 
        clrf    PORTA
        movlw    0x03
        movwf    index
        return            ;
    
    
    ;********************************************************************
    ; table de convertion
    ;********************************************************************
    table    
        addwf    PCL,F        ; incrémente le pointeur programme
        retlw    b'11111110'    
        retlw    b'11111101'
        retlw    b'11111011'
        retlw   b'11110111'
        retlw    b'11101111'    
        retlw    b'11011111'
        retlw    b'10111111'
        retlw   b'01111111'
    
    
        
    
        end            ; fin du programme

  15. #14
    invite36492e34

    Re : programme qui ne part pas en interruption

    salut,

    j'ai tester sur MPLAB, j'ai eu des warnnings au niveau des instructions MOVLW 0B00000001
    la bonne syntaxe est MOVLW b'00000001' par exemple.
    Apres simulation, le programme boucle bien dans la routine d'interruption lorsqu'il y a un front montant sur RB0...

  16. #15
    invitec35bc9ea

    Re : programme qui ne part pas en interruption



    c'etait bien ça.
    j'enchaine avec une autre question:
    C'est quoi la defference entre un call et un goto? certain codes marchent correctement avec call mais pas avec goto et inversement

  17. #16
    sdec25

    Re : programme qui ne part pas en interruption

    Bonjour,
    Citation Envoyé par einstein Voir le message
    C'est quoi la defference entre un call et un goto? certain codes marchent correctement avec call mais pas avec goto et inversement
    Toutes les instructions sont expliquées dans la datasheet du PIC.
    Call sert à appeler une fonction, donc l'adresse de l'instruction en cours est sauvegardée. Il faut utiliser l'instruction Return pour sortir de la fonction.

Discussions similaires

  1. Recommencer le programme au début après une interruption (PIC16f84A)
    Par invite4386a656 dans le forum Électronique
    Réponses: 8
    Dernier message: 17/05/2008, 14h58
  2. [Blanc] Lave-Vaisselle Brandt Vm300 A100 AAclass eau stagnante interruption programme
    Par inviteca31fbed dans le forum Dépannage
    Réponses: 2
    Dernier message: 15/02/2008, 09h45
  3. [Blanc] Interruption programme lave-linge arthur AWW1407
    Par invited6851462 dans le forum Dépannage
    Réponses: 0
    Dernier message: 19/10/2007, 12h09
  4. [Blanc] bouton programme qui tourne pas
    Par invite1b7dec00 dans le forum Dépannage
    Réponses: 6
    Dernier message: 01/08/2007, 22h17
  5. Réponses: 18
    Dernier message: 03/10/2005, 09h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...