[Programmation] Interruption BP PIC16F1455
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Interruption BP PIC16F1455



  1. #1
    invite928ea98e

    Interruption BP PIC16F1455


    ------

    Bonjour a tous,

    Je bute sur un probleme assez simple , j'essaye de gerer une interruption provenant d'un Bp ( PUll UP a l'etat de repos ) donc sur front descendant sur la pin RC0 de mon PIC16F1455. Une lED doit changer d'etat RC3 lorsque le BP est appuyé.

    Mais malheuresement lorsque j'appuie sur le BP l'interruption n'est pas geré

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <xc.h>
    // PIC16F1455 Configuration Bit Settings
    // CONFIG1
    #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
    #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    #pragma config IESO = OFF // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
    #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
    
    // CONFIG2
    #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
    #pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection Bit (NO CPU system divide)
    #pragma config USBLSCLK = 48MHz // USB Low SPeed Clock Selection bit (System clock expects 48 MHz, FS/LS USB CLKENs divide-by is set to 8.)
    #pragma config PLLMULT = 3x // PLL Multipler Selection Bit (3x Output Frequency Selected)
    #pragma config PLLEN = DISABLED // PLL Enable Bit (3x or 4x PLL Disabled)
    #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
    #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled)
    
    #define _XTAL_FREQ 16000000
    
    void interrupt (){
        if (INTF){
           INTF=0;
           RC3=!RC3;
        }
    }
    
    void initINT (void){
        INTCONbits.INTF=0; //Borrar bandera 
        INTCONbits.INTE=1; //Habilitar interrupcion externa
        OPTION_REGbits.INTEDG=0; //interrupcion en flanco de bajada
        ANSELC = 0b00000000;
        ANSELA = 0b00000000;
        RC3 = 1 ;
    }
    
    int main (void){
        OSCCON=0b01111110; //PLL disable, 3xPLL, 16Mhz, Osc Interno
        TRISC=0b11010111;
        TRISA=0b11010010;
        initINT();
        INTCONbits.GIE=1; //Habilitar interrupciones Globales
        while(1){
        }
    }
    Voyez vous un probleme ( le programme a été recuperer sur le forum microchip qui est censé marcher) ?

    Je vous remercie

    -----
    Dernière modification par Antoane ; 26/04/2020 à 15h35. Motif: remplacement des balises quote par code

  2. #2
    invite5637435c

    Re : Interruption BP PIC16F1455

    Bonjour,
    as-tu mis un pull-up (ou pull-down) sur ton entrée BP?
    Un schéma?

  3. #3
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Bonjour,

    Oui il y a une resistence de pull up sur le BP entrée RC0 a +3.3V (verifier au multimetre , passe a 0 lors de l'appuie sur le BP )
    Sortie led avec resistance sur la sortie RC3

  4. #4
    invite5637435c

    Re : Interruption BP PIC16F1455

    Ok, sortie led sur résistance reliée à quoi (Vcc ou Gnd)?

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

    Re : Interruption BP PIC16F1455

    Code:
    RC3 = 1 ;
    
    à priori au Vcc donc, elle est éteinte avec un 1 dans la phase d'init.

  7. #6
    invite5637435c

    Re : Interruption BP PIC16F1455

    Quel quartz as-tu mis sur ta carte?
    Faut tout demander....

    Et poste un schéma.

  8. #7
    invite5637435c

    Re : Interruption BP PIC16F1455

    Sauf erreur, il semble bien qu'il n'y ait pas d'interruption sur RC3 de prévu... seulement sur portA et portB
    Il faut lire la doc...

  9. #8
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Voici un schema :

    En fait j'avais commencé par le cablage sur la PIN RA0 du BP, mais ca ne marche pas non plus :

    Nom : 2020-04-23 18_18_04-Document1 - Word.png
Affichages : 117
Taille : 8,1 Ko

    J'ai choisis d'allumer la led pendant mon initialisation , car sur un autre PIC lorsque j'active les interruption INTCONbits.INTF=0; INTCONbits.INTE=1 , le pic se mettait a deconner , donc meme la led pendant l'intialisation n'etait pas active.

    Je n'ai pas de quartz , j'utilise le quartz interne avec #pragma config FOSC = INTOSC et #define _XTAL_FREQ 16000000

  10. #9
    invite5637435c

    Re : Interruption BP PIC16F1455

    Quand on gère un bouton il faut faire un anti-rebond soft, sinon ça ne fonctionnera pas bien, voir pas du tout.
    Il faut que restes sur une entrée interruptive, par exemple RA0 c'est correct.
    Ensuite il faut que tu modifies la direction du portA (le mettre en entrée):
    Code:
    TRISA=0b11010010;
    par ça:
    Code:
    TRISA=0b11010011;
    Et il faut faire un anti-rebond, sans quoi ton interruption, vu la vitesse de ton horloge, va claquer à chaque fois au moindre rebond.

    Essaye déjà comme ça et diminue ta vitesse d'horloge pour au moins tester, par exemple à 4MHz.
    Tu as vraiment besoin de pédaler aussi vite?
    Si vraiment tu n'as rien du tout alors je te ferai une routine anti-rebond simple.

  11. #10
    invite5637435c

    Re : Interruption BP PIC16F1455

    Tu peux essayer ça:



    Code:
    //tu déclares une variable volatile
    
    volatile unsigned char test;
    
    //puis dans l'interruption
    
    void interrupt (){
    if (INTF){
    INTF=0;
    test = 1;
    }
    
    void initINT (void){
    INTCONbits.INTF=0; //Borrar bandera
    INTCONbits.INTE=1; //Habilitar interrupcion externa
    OPTION_REGbits.INTEDG=0; //interrupcion en flanco de bajada
    ANSELC = 0b00000000;
    ANSELA = 0b00000000;
    RC3 = 0 ; // ta led doit être éteinte à l'init
    }
    
    
    //puis dans main()
    
    int main (void){
    OSCCON=0b01111110; //PLL disable, 3xPLL, 16Mhz, Osc Interno
    TRISC=0b11010111;
    TRISA=0b11010011;
    initINT();
    INTCONbits.GIE=1; //Habilitar interrupciones Globales
    while(1){
    if(test) RC3=1; // si tu passes bien dans l'interruption => tu allumes ta led, elle restera allumée, ça permet de tester si tu entres bien dans l'interruption
    }
    }
    

    Tu testes ça et tu reviens en n'oubliant pas de déposer le soft que tu as testé.
    Et s'il te plait utilises les balises [code] [*/code] (tu enlèves l'astérisque) pour poster ton programme.


  12. #11
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Merci mais c'est bien ca le probleme , c'est que je n'arrive pas a rentrer dans la boucle d'interruption.

    J'ai quand meme essayé le meme code

    Code:
    //tu déclares une variable volatile
    
    volatile unsigned char test;
    
    //puis dans l'interruption
    
    void interrupt ()
    {
    if (INTF){
    INTF=0;
    test = 1;
    }
    }
    
    void initINT (void){
    INTCONbits.INTF=0; //Borrar bandera
    INTCONbits.INTE=1; //Habilitar interrupcion externa
    OPTION_REGbits.INTEDG=0; //interrupcion en flanco de bajada
    ANSELC = 0b00000000;
    ANSELA = 0b00000000;
    RC3 = 0 ; // ta led doit être éteinte à l'init
    }
    
    
    //puis dans main()
    
    int main (void){
    OSCCON=0b01111110; //PLL disable, 3xPLL, 16Mhz, Osc Interno
    TRISC=0b11010111;
    TRISA=0b11110011;
    initINT();
    INTCONbits.GIE=1; //Habilitar interrupciones Globales
    while(1){
    if(test) RC3=1; // si tu passes bien dans l'interruption => tu allumes ta led, elle restera allumée, ça permet de tester si tu entres bien dans l'interruption
    }
    }
    La led ne s'allume pas , donc l'interruption n'est pas reconnue , ou il ne rentre pas dans la boucle.

    Sur Mplab il m'indique "unexpected token" sur la boucle , cela pourrais venir de la synthaxe de la boucle ?

    2020-04-28 10_19_26-Window.png
    Images attachées Images attachées  

  13. #12
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Je precise que avec ce code ou je test l'appuie sur le bouton

    Code:
    int main (void){
    OSCCON=0b01111110; //PLL disable, 3xPLL, 16Mhz, Osc Interno
    TRISC=0b00000000;
    TRISA=0b11110011;
    initINT();
    INTCONbits.GIE=1; //Habilitar interrupciones Globales
    while(1){
    if(RA0 == 0) RC3=1; // appuie ur BP , Led on
    }
    }
    La led s'allume bien

  14. #13
    Unitrode

    Re : Interruption BP PIC16F1455

    C'est quoi ton compilateur exactement?
    Si c'est XC8 le déclaratif de la routine d'interruption est (si mon souvenir est bon) quelque chose dans ce style:
    Code:
    void interrupt () my_isr (void) {
    }
    As-tu au moins regardé le manuel de ton compilateur?
    Ta carte d'essais c'est quoi?
    Ca manque vraiment d'infos ton truc.

  15. #14
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Oui le compileur est xc8 v2.1 avec mplabx v5.20

    Apres ma questions sur le forum , j'ai fais des recherches sur la routine d'interruption.

    Il semblerais que ca soit ca en utilisant le standard c99

    Code:
    void __interrupt() my_isr(void){
    }
    mais sans succes non plus apres

    Code:
    void interrupt () my_isr (void) {
    }
    serait pour le standart c90

    J'utilise une plaquette de test ou le pic est directement dessus , il est alimenté par le PICkit3 directement en +3.25V

  16. #15
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Voici mon dernier test sans succes :

    J'ai egalement rajouté INTCONbits.PEIE=1; Qui active les interuptions par les peripheriques externes

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <xc.h>
    // PIC16F1455 Configuration Bit Settings
    
    // CONFIG1
    #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
    #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    #pragma config IESO = OFF // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
    #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
    
    // CONFIG2
    #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
    #pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection Bit (NO CPU system divide)
    #pragma config USBLSCLK = 48MHz // USB Low SPeed Clock Selection bit (System clock expects 48 MHz, FS/LS USB CLKENs divide-by is set to 8.)
    #pragma config PLLMULT = 3x // PLL Multipler Selection Bit (3x Output Frequency Selected)
    #pragma config PLLEN = DISABLED // PLL Enable Bit (3x or 4x PLL Disabled)
    #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
    #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled)
    
    #define _XTAL_FREQ 16000000
    
    
    
    
    //tu déclares une variable volatile
    
    volatile unsigned char test;
    
    //puis dans l'interruption
    
    void __interrupt() my_isr(void)
    {
    if (INTF)
    {    
    INTF = 0;
    test = 1;
     }
    }
    
    void initINT (void){
    INTCONbits.INTF=0; //Borrar bandera
    INTCONbits.INTE=1; //Habilitar interrupcion externa
    OPTION_REGbits.INTEDG=0; //interrupcion en flanco de bajada
    INTCONbits.PEIE=1;
    ANSELC = 0b00000000;
    ANSELA = 0b00000000;
    RC3 = 0 ; // ta led doit être éteinte à l'init
    }
    
    
    //puis dans main()
    
    int main (void){
    OSCCON=0b01111110; //PLL disable, 3xPLL, 16Mhz, Osc Interno
    TRISC=0b00000000;
    TRISA=0b11110011;
    initINT();
    INTCONbits.GIE=1; //Habilitar interrupciones Globales
    while(1){
    if(test) RC3=1; // si tu passes bien dans l'interruption => tu allumes ta led, elle restera allumée, ça permet de tester si tu entres bien dans l'interruption
    }
    }

  17. #16
    umfred

    Re : Interruption BP PIC16F1455

    sur ce PIC, la pin d'interruption lié au bit INT, c'est RC1, et le port A est peut générer une interruption sur changement (IOC)
    Si tu mets la détection sur RA0, tu attends donc un front négatif (1->0), donc c'est le bit IOCANbits.IOCAN0 (nom à vérifier) à mettre à 1 et le IOCAFbits.IOCAF0, son flag à 0 (paragraphes 8 et 13 de la datasheet du PIC)

  18. #17
    invite928ea98e

    Re : Interruption BP PIC16F1455

    Waouhh ! Super merci beaucoup c'etait bien ca le probleme.

    J'ai du donc activer :

    Code:
    IOCANbits.IOCAN5=1;
    IOCAFbits.IOCAF5=0;
    INTCONbits.IOCIE=1;
    INTCONbits.IOCIF=0;
    J'ai deplacé le BP sur la Pin RA5

    Merci beaucoup a tous pour votre contribution !!!

Discussions similaires

  1. PIC : interruption externe et interruption on change ?
    Par invitea3277f60 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 13h41
  2. interruption I2C pic 18F
    Par inviteec13c33a dans le forum Électronique
    Réponses: 11
    Dernier message: 05/04/2012, 15h46
  3. interruption
    Par invite2da25054 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/09/2010, 11h03
  4. interruption SPI
    Par inviteac09f73c dans le forum Électronique
    Réponses: 0
    Dernier message: 12/04/2009, 18h22
  5. Interruption RB0
    Par invite91a05f0b dans le forum Électronique
    Réponses: 5
    Dernier message: 12/04/2007, 11h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...