Interruption avec PIC18F45K20
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Interruption avec PIC18F45K20



  1. #1
    *Baby*

    Interruption avec PIC18F45K20


    ------

    Salut,


    Je viens tout juste de recevoir mon PicKit 3 avec sa Demo board contenant un PIC18f45K20.

    J'ai réussi à bien tout prendre en main mais j'ai un problème avec les interruption.

    Rappel, il y a 8 leds sur le port D et un bouton sur RB0. Schéma disponible page 13 : http://ww1.microchip.com/downloads/e...Doc/41296a.pdf

    Voici mon code très basique, la led RD0 clignote bien mais l'interruption ne marche pas, le problème doit venir de la configuration du registre mais je trouve pas la solution : (Le but est qu'il y ai une led qui clignote et que l'autre puisse être allumé/éteinte par le bouton avec un interruption).

    Code:
    //---------------------------------E/S et variables generales--------------------- 
    
    #include <htc.h>
    #include "delay.h"
    
    
    
    
    
    
    //-------------------------------Fonction principale------------------------------ 
    
    
    
    void main(void) 
    { 
    // Initialisation des pattes du microcontroleur 
    OSCCON = 0b01110110;
    PORTD=0;
    
    TRISD = 0b00000000; 
    
    PORTB=0;
    
    TRISB = 0b11111111; 
    
    INTCON = 0b10001000;
    
        
    
    while(1)
    {
    RD0 = !RD0;
    DelayS(2);
    }
    
    }
    
    
    
    static void interrupt isr(void)			// Here be interrupt function - the name is
    {
    
    	if(RBIF && RB0)
    	{
    	RD7 = !RD7;
    	}		
    	RBIF = 0;	
    
    }
    Merci d'avance à ceux qui pourront m'aider.

    -----
    Dernière modification par *Baby* ; 15/06/2010 à 19h58.

  2. #2
    invite6cb8b74b

    Re : Interruption avec PIC18F45K20

    Bonjour,
    Il y a au moins 2 erreurs dans ton prog.

    1/ il faut autoriser les interruptions périphériques en positionnant PIE à 1 (INTCON=b11001000)

    2/ tu confonds 2 interruptions qui peuvent se présenter sur le PORTB : Un changement d'état sur les pins 4 à 7 du portB et les interruptions possibles sur chacune des pins 0, 1 ou 2 du portB (que l'on configure via INTCON2).

    Dans ton cas, vu que tu testes RBIF cela signifie que tu voudrais détecter un changement d'état sur une des pins de 4 à 7 du portB.
    Il faut donc que tu recables.
    Le test sur RB0 ne sert à rien dans ton cas (RBIF && RB0)
    JC

  3. #3
    invite87d208c9

    Re : Interruption avec PIC18F45K20

    Hi Baby ! (désolé, mais trop facile ...)

    Une petite remarque générale si je peux me permettre :

    Afin de t'y retrouver d'une part, et d'éviter des erreurs ou fonctionnement indésirable d'autre part, je te conseille de

    1- creer une fonction, genre "initsystem()", que tu appelles en tout début de programme, et qui contient tous les mots de configuration requises. Cette fonction, structure là de la façon suivante :

    Code:
    //D'abord,  configuration générale :
    
    OSCCON...
    ADCON0...
    etc. 
    
    //les TRISx
    
    TRISA = 0x00;      // fait les TRISx AVANT les PORTx
    PORTA = 0;
    TRISB = 0x00;
    PORTB = 0;
    TRISC = 0x07; //00000111
    PORTC = 0;
    	
    
    //ensuite tu configures tes interruptions. Premiere chose a faire, tu les DESACTIVES
    
    //Interrupt
    	
    RCONbits.IPEN = 1; //gestion des priorités ?
    	
    INTCONbits.GIEH = 0; //desactivation
    INTCONbits.GIEL = 0;
    	
    /*
    .
    .
    .
    ici toutes tes interruptions, Timer, INTx, etc...
    .
    .
    .*/
    
    
    INTCONbits.GIEL = 1;	         // et enfin tu les réactives.
    INTCONbits.GIEH = 1;
    2- Fait bien tes TRISA=..., TRISB=.... AVANT de faire PORTA=..., PORTB=... .


    Sinon plus précisement pour ton soucis :
    RB0 correspond à l'interruption INT0. Elle se configure avec INTCON2 (savoir si c'est front montant ou descendant), avec INTCON (enable ou disable). Et c'est tout.

    donc, dans la config :
    INTCONbits.INT0IE = 1; //INT0 /RB0 interrupt
    INTCON2bits.INTEDG0 = 1; //Rising Edge


    Ensuite, dans ta routine d'interrpution, tu as juste a faire le test suivant :

    if(INTCONbits.INT0IF == 1) //Front montant de RB0
    {
    INTCONbits.INT0IF = 0; //ET SURTOUT RESET DU FLAG !!!!

    Sinon ton interruption ne remontera jamais.

    }

    Tiens nous au courant, bon courage

  4. #4
    *Baby*

    Re : Interruption avec PIC18F45K20

    @JC22

    Voici le code que j'ai essayé avec un BP sur chacune des pin du port B, mais l'interruption n'est toujours pas détecté.

    Code:
    //---------------------------------E/S et variables generales--------------------- 
    
    #include <htc.h>
    #include "delay.h"
    
    
    
    //-------------------------------Fonction principale------------------------------ 
    
    
    
    void main(void) 
    { 
    // Initialisation des pattes du microcontroleur 
    OSCCON = 0b01110110;
    
    
    TRISD = 0b00000000; // Sorties
    TRISB = 0b11111111; //Entrées
    
    PORTD=0;
    PORTB=0;
    
    
    INTCON=0b11001000;
     
    
    while(1)
    {
    RD0 = !RD0;
    DelayS(1);
    }
    
    
    }
    
    
    
    static void interrupt isr(void)	// Here be interrupt function - the name is
    {
    
    
    RD7=!RD7;
    RBIF = 0; //ET SURTOUT RESET DU FLAG !!!!
    
    }


    --------------------------------------------------------------



    @Daemonight

    J'ai testé ton code sans succès avec le bouton sur RB0, interruption n'est pas détecté mais la LEd de RD7 clignote bien :

    Code:
    //---------------------------------E/S et variables generales--------------------- 
    
    #include <htc.h>
    #include "delay.h"
    
    
    
    //-------------------------------Fonction principale------------------------------ 
    
    
    
    void main(void) 
    { 
    // Initialisation des pattes du microcontroleur 
    OSCCON = 0b01110110;
    
    
    TRISD = 0b00000000; // Sorties
    TRISB = 0b11111111; //Entrées
    
    PORTD=0;
    PORTB=0;
    
    
    RCONbits.IPEN = 1; //gestion des priorités ?
    	
    INTCONbits.GIEH = 0; //desactivation
    INTCONbits.GIEL = 0;
    	
    
    INTCONbits.INT0IE = 1; //INT0 /RB0 interrupt
    INTCON2bits.INTEDG0 = 1; //Rising Edge
    
    
    
    INTCONbits.GIEL = 1; // et enfin tu les réactives.
    INTCONbits.GIEH = 1;
     
    
    while(1)
    {
    RD0 = !RD0;
    DelayS(1);
    }
    
    
    }
    
    
    
    static void interrupt isr(void)	// Here be interrupt function - the name is
    {
    
    if(INTCONbits.INT0IF == 1) //Front montant de RB0
    {
    
    RD7=!RD7;
    INTCONbits.INT0IF = 0; //ET SURTOUT RESET DU FLAG !!!!
    
    }
    
    }

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

    Re : Interruption avec PIC18F45K20

    Le problème ne viendrait il pas du port B qui est mal configuré ?

    Il faut qu'il soit configuré en I/O input.

  7. #6
    *Baby*

    Re : Interruption avec PIC18F45K20

    J'ai trouvé la solution, voici un code fonctionnel.

    Code:
    //---------------------------------E/S et variables generales--------------------- 
    
    #include <htc.h>
    #include "delay.h"
    
    
    
    //-------------------------------Fonction principale------------------------------ 
    
    
    
    void main(void) 
    { 
    // Initialisation des pattes du microcontroleur 
    OSCCON = 0b01110110;
    
    
    TRISD = 0b00000000; // Sorties
    TRISB = 0b11111111; //Entrées
    PORTD=0;
    PORTB=0;
    
    
    // Configuration des interruptions - Le plus simple sans gestion des priorités
    
    
    INTCONbits.INT0IE = 1; // Enables the INT0 external interrupt (INT0 = RB0)
    INTCON2bits.INTEDG0 = 1; // Interrupt on rising edge (Front montant)
    
    INTCONbits.GIEL = 1; // Activation des interuptions
    INTCONbits.GIEH = 1;
     
     
     
     
    ANSELH = 0x00; // Déasctivation du module Analogique sur le port B (Très important, sinon ça ne marche pas et le port B ne peut pas être utilisé en I/O logique)
    
    
    
    
    
    while(1) // On fait clignoter la LED
    {
    RD0=!RD0;
    DelayS(1);
    }
    
    
    
    
    static void interrupt isr(void)	// Fonction d'interruption
    {
    
    if(INTCONbits.INT0IF == 1) //Front montant de RB0. INTOIF est le Flag de détection d'interruption
    {
    RD7=!RD7;
    }
    
    INTCONbits.INT0IF = 0;
    
    }


    J'aurais juste une question. J'ai pas bien compris pourquoi on ne peut pas utiliser RBIF à la place de INT0IF ?

    Merci de bien vouloir répondre à cette dernière question, c'est bien plus important pour moi de comprendre mes erreurs que de réussir a faire fonction un code.

  8. #7
    invite87d208c9

    Re : Interruption avec PIC18F45K20

    bon, j'ai lue n diagonale, mais visiblement tu as trouvé la solution.
    RBIF, c'est le flag qui se déclenche sur un changement du PORTB, EN DEHORS des INTx. INTxIF, c'est le flag qui correspond aux INTx.

    Sinon, juste pour une histoire de "rigeur", ton

    INTCONbits.INT0IF = 0;

    doit etre dans le if :
    if(INTCONbits.INT0IF == 1) //Front montant de RB0. INTOIF est le Flag de détection d'interruption
    {
    INTCONbits.INT0IF = 0;
    RD7=!RD7;
    }

    et PORTB = 0 ne sert à rien, quand tu as un TRISB = 0xFF , mais c'est un détail.

    Je suppose que ton MP est antérieur à ton dernier message

    ravi que tu ai trouvé !

Discussions similaires

  1. Interruption
    Par invite28559ad9 dans le forum Électronique
    Réponses: 4
    Dernier message: 06/01/2009, 21h07
  2. Interruption en VHDL
    Par invite5320ef75 dans le forum Électronique
    Réponses: 3
    Dernier message: 11/12/2008, 22h30
  3. Interruption
    Par scls19fr dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 14h05
  4. Interruption C PIC16F877
    Par invite210e4233 dans le forum Électronique
    Réponses: 2
    Dernier message: 04/10/2007, 22h26
  5. interruption ( timer )
    Par invite42dae262 dans le forum Électronique
    Réponses: 0
    Dernier message: 13/03/2007, 19h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.