Assembleur: Interruption Externe sur PIC18F4685
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Assembleur: Interruption Externe sur PIC18F4685



  1. #1
    invite8d6da28a

    Assembleur: Interruption Externe sur PIC18F4685


    ------

    Bonjour,

    Après avoir fait "joujou" avec mon PIC18F avec des fonctions basiques je voudrais creuser un peu plus ce PIC en utilisant les interruptions externes. Depuis deux jours je rame pour le programmer en interruption externe et je ne trouve pas d'où vient mon problème.
    Sachant que mon code fonctionne en simulation (debugg) mais pas quand j'envoie le code dans le PIC. En simulation (avec MPLABX) quand je change le bit RB0 mon programme va bien exécuter l'interruption externe (je le vois en faisant du step by step). Alors que quand le programme est dans le PIC18F4685, je met un signal sur RB0 (à l'aide d'un GBF, signal carré 1KHz 2vpp) rien ne se passe sur la broche de sorti qu'elle devrait faire changé d'état (RD1 dans mon code). RD1 reste à 5v en entrée (Pull-up actif).
    Je pense pourtant avoir configuré les registres nécessaire à sont bon fonctionnement (page 115-128 datasheet)

    Si une âme charitable pouvait m'aider à trouver l'erreur ou me donner des éléments de réponse ça m'aiderait grandement,

    Merci d'avance!

    LIST P=18F4685 ;directive to define processor
    #include <P18F4685.INC> ;processor specific variable definitions

    ;***************************** ****************************** *******************
    ;Configuration bits


    ; Oscillator Selection:
    CONFIG OSC = IRCIO67 ; Oscillateur principal (LP,XT,HS,RC,EC,ECIO,HSPLL,RCI O,IRCIO67)
    CONFIG IESO = OFF ; Oscillator Switchover mode disabled
    CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled

    CONFIG PWRT = OFF ; Délai au démarrage (ON/OFF)
    CONFIG WDT = OFF ; Mise en service watchdog (ON/OFF)
    CONFIG BOREN = OFF ; Brown-out Reset disabled in hardware and software
    CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
    CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
    CONFIG DEBUG = OFF ; Debugger hors service (laisser sur OFF)


    ;***************************** ****************************** *******************
    ; Vecteur de reset
    ; Ce code sera executé quand un reset aura lieux

    ORG 0x0000
    goto MainInit



    ;***************************** ****************************** *******************
    ; Routine d'interruption
    ORG 0x0008

    ; *** Interruption Priorité "haute" ***
    bcf INTCON,INT0IF ; Efface le flag
    bcf INTCON,T0IF ;
    bsf INTCON,GIE_GIEH
    btg PORTD,1
    return


    ;***************************** ****************************** *******************
    ; Début des initialisation
    ; Le code d'initiailisation est placé ici
    MainInit:
    ;Init Clock Intern
    movlw b'11110111' ; OSCCON<6:4> = 111 8MHz, 110 4MHz, etc...
    movwf OSCCON ;

    ;Init I/O
    movlw 0x0E
    movwf ADCON1

    clrf PORTA
    movlw 0xB0 ; 0x1011 0000 RA7 Input, RA6 Output
    movwf TRISA

    clrf PORTB
    movlw 0xFF ; ALL Input
    movwf TRISB

    clrf PORTD
    movlw 0x00 ; ALL Output
    movwf TRISD

    ;Initialisation Interruption Externe sur RB0
    bsf RCON,IPEN ; Active toutes les priotités "high"
    bcf INTCON,PEIE_GIEL;Désactive les priorités "low"
    bsf INTCON,RBIE ; Active les interruptions PORTB
    bsf INTCON,INT0IE ; Active l'interuption INT0 sur RB0
    bcf INTCON,T0IF ;
    bsf INTCON,T0IE ;
    bcf INTCON2,RBPU ; Active toutes les pull-up PORTB
    bcf INTCON2,INTEDG0 ; Interruption sur front descendant INT0 RB0
    bsf INTCON2,RBIP ; Priorité "High" du PORTB
    bsf INTCON,GIE_GIEH ; Bit d'activation Global d'Interruptions

    ;***************************** ****************************** *******************
    ; Début du programme principal
    ; Le code du programme principal est placé ici
    Main:

    bra Main


    ;***************************** ****************************** *******************
    ;Fin du programme

    END

    -----

  2. #2
    RISC

    Re : Assembleur: Interruption Externe sur PIC18F4685

    Salut,

    As-tu bien lu la datasheet et le manuel du programmeur ?
    L'instruction de retour d'une interruption n'est pas return....Ca c'est la mort assurée ;=)
    Regardes du coté de RETFIE...
    Il y a peut-être d'autres erreur mais celle là doit être corrigée.

    D'autre part, méfies toi du simulateur de MPLAB X. Il n'est pas opérationnel pour la totalité des périphériques. Mieux vaut travailler sur ta carte directement si tu en as une.

    Y a-t-il une raison pour que tu t'imposes l'utilisation de l'assembleur alors que tu peux travailler avec le langage C ( compilateur XC8 ) ?

    Si tu veux absolument faire de l'assembleur, regardes l'excellent cours de Bigonoff en français et aussi le PIC18 Reference Manual.

    a+

  3. #3
    paulfjujo

    Re : Assembleur: Interruption Externe sur PIC18F4685

    bonsoir,


    il ne faut surtout pas rearmer GIE dans l'interruption
    c'est retfie qui s'en charge
    Il faudrait aussi verfier que c'est bien le flag INTOIF qui declenche cette interrupt.
    et que INT0IE est bien autorisé..
    meme si il n'y en a pas vraiment besoin pour ce test.

    Code:
    ORG 0x0008
    
    ;	*** Interruption Priorité "haute" ***
    bcf	INTCON,INT0IF ; Efface le flag
    btg PORTD,1
    retfie
    il n'y a pas double emploi entre les 2 instrutions

    Code:
    bcf	INTCON,INT0IF ; Efface le flag 
    bcf INTCON,T0IF ;
    Dernière modification par paulfjujo ; 12/08/2014 à 18h36.

  4. #4
    invite8d6da28a

    Re : Assembleur: Interruption Externe sur PIC18F4685

    Merci de vos réponse,
    J'ai compris et fait les différents changement que vous m'avez dit, en effet je ne savais pas qu'il y avait une fonction return qui permet de réactivé le flag GIE!
    Je travail sur ma maquette d'essai, le mode simulation était juste pour essayer de débugg!
    Je vais persévérer et regarder plus en détaille dans les registres PIE/PIR si c'est utile d'activer différents bits inclue dedans, encore merci d'avoir pris le temps de me lire et de me répondre!

    Donc mon programme ressemble à ça maintenant pour le moment:

    LIST P=18F4685 ;directive to define processor
    #include <P18F4685.INC> ;processor specific variable definitions

    ;***************************** ****************************** *******************
    ;Configuration bits

    ; Oscillator Selection:
    CONFIG OSC = IRCIO67 ; Oscillateur principal (LP,XT,HS,RC,EC,ECIO,HSPLL,RCI O,IRCIO67)
    CONFIG IESO = OFF ; Oscillator Switchover mode disabled
    CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled

    CONFIG PWRT = OFF ; Délai au démarrage (ON/OFF)
    CONFIG WDT = OFF ; Mise en service watchdog (ON/OFF)
    CONFIG BOREN = OFF ; Brown-out Reset disabled in hardware and software
    CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
    CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
    CONFIG DEBUG = OFF ; Debugger hors service


    ;***************************** ****************************** *******************
    ; Vecteur de reset
    ; Ce code sera executé quand un reset aura lieux

    ORG 0x0000
    goto MainInit



    ;***************************** ****************************** *******************
    ; Routine d'interruption
    ORG 0x0008

    ; *** Interruption Priorité "haute" ***
    bcf INTCON,INT0IF ; Efface le flag
    btg PORTD,1
    retfie


    ;***************************** ****************************** *******************
    ; Début des initialisation
    ; Le code d'initiailisation est placé ici
    MainInit:
    ;Init Clock Intern
    movlw b'11110111' ; OSCCON<6:4> = 111 8MHz, 110 4MHz, etc...
    movwf OSCCON ;

    ;Init I/O
    movlw 0x0E
    movwf ADCON1

    clrf PORTA
    movlw 0xB0 ; 0x1011 0000 RA7 Input, RA6 Output
    movwf TRISA

    clrf PORTB
    movlw 0xFF ; ALL Input
    movwf TRISB

    clrf PORTD
    movlw 0x00 ; ALL Output
    movwf TRISD

    ;Initialisation Interruption Externe sur RB0
    bsf RCON,IPEN ; Active toutes les priotités "high"
    bcf INTCON,PEIE_GIEL;Désactive les priorités "low"
    bsf INTCON,RBIE ; Active les interruptions PORTB
    bsf INTCON,INT0IE ; Active l'interuption INT0 sur RB0
    bcf INTCON,T0IF ;
    bsf INTCON,T0IE ;
    bsf INTCON2,RBPU ; Desactive toutes les pull-up PORTB
    bsf INTCON2,INTEDG0 ; Interruption sur front montant INT0 RB0
    bsf INTCON2,RBIP ; Priorité "High" du PORTB
    bsf INTCON,GIE_GIEH ; Bit d'activation Global d'Interruptions

    ;***************************** ****************************** *******************
    ; Début du programme principal
    ; Le code du programme principal est placé ici
    Main:

    bra Main


    ;***************************** ****************************** *******************
    ;Fin du programme

    END

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

    Re : Assembleur: Interruption Externe sur PIC18F4685

    Salut,

    Pour progresser rapidement sur les PIC18 en assembleur, télécharges le cours de Bigonoff en particulier la partie 5.
    Il montre l'utilisation de certaines macros indispensables (liées aux changements de banques) et explique en détail ce qui concerne les interruptions et bien d'autres choses.

    a+

  7. #6
    invite8d6da28a

    Re : Assembleur: Interruption Externe sur PIC18F4685

    Merci pour votre aide j'ai enfin trouvé mon erreur. Ça venait du btg PORTD,1 de mon interruption! Il allait bien dans mon interruption mais le btg ne faisait rien, il fallait simplement changer le PORTD par LATD.... => btg LATD, 1


    @bientôt et merci.

Discussions similaires

  1. Problème avec l'interruption externe du microcontrolleur.
    Par invitec9a2d093 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/04/2013, 09h22
  2. Problème avec interruption externe sur PIC24F08KA102
    Par invite73e352e5 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/07/2012, 20h19
  3. PIC : interruption externe et interruption on change ?
    Par invitea3277f60 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 13h41
  4. interruption IRQ,NMI,... pour mon horloge assembleur
    Par invite5969de42 dans le forum Électronique
    Réponses: 3
    Dernier message: 26/01/2010, 10h17
  5. Interruption en assembleur sur C167
    Par invitea46278c1 dans le forum Électronique
    Réponses: 0
    Dernier message: 31/01/2008, 18h25
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...