[Programmation] Question sur l'interruption avec un PIC16F18345
Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Question sur l'interruption avec un PIC16F18345



  1. #1
    invite78edfed4

    Question sur l'interruption avec un PIC16F18345


    ------

    Bonjour à tous,

    J'aimerais effectuer une interruption avec un bouton-poussoir et une LED mais je n'arrive pas à trouver la méthode pour créer une interruption. J'ai actuellement un programme qui tourne bien mais la fonction d'interruption est plus efficace lorsqu'on a plusieurs fonctions à effectuer. J'utilise l'outil de développement MPLAB X IDE v4.01 avec un PIC16F18345.
    Si vous pouvez m'aider, je suis preneur ! Merci d'avance !
    code actuel:
    Code:
    // CONFIG1
    #pragma config FEXTOSC = OFF        // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
    #pragma config RSTOSC = HFINT1      // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
    #pragma config CLKOUTEN = OFF       // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
    #pragma config CSWEN = ON           // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
    //#pragma config FCMEN = OFF          // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
    
    // CONFIG2
    #pragma config MCLRE = ON           // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
    #pragma config PWRTE = OFF          // Power-up Timer Enable bit (PWRT disabled)
    #pragma config WDTE = OFF           // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
    #pragma config LPBOREN = OFF        // Low-power BOR enable bit (ULPBOR disabled)
    #pragma config BOREN = SBOREN       // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)
    #pragma config BORV = LOW           // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
    #pragma config PPS1WAY = OFF        // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
    #pragma config STVREN = OFF         // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
    #pragma config DEBUG = OFF          // Debugger enable bit (Background debugger disabled)
    
    // CONFIG3
    #pragma config WRT = OFF            // User NVM self-write protection bits (Write protection off)
    #pragma config LVP = ON             // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)
    
    // CONFIG4
    #pragma config CP = OFF             // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
    #pragma config CPD = OFF            // Data NVM Memory Code Protection bit (Data NVM code protection disabled)
    
    // PORT A
    #define ICSPDAT         RA0                     // Port de programmation
    #define POWER           RA1                     // Retour d etat charge batterie
    #define MCLR            RA3                     // Port de programmation
    
    // PORT B
    #define ledR            RB7                     // +LED rouge
    
    // PORT C
    #define BP              RC5                     // Bouton poussoir
    
    #include <xc.h>
    
    #define _XTAL_FREQ  8000000                     // Oscillateur réglé à 8MHz
    
    #define ON      0                               // Led tirée au +VCC
    #define OFF     1
    
    unsigned char etat_Bp = 0;
    
    
    void main(void)
    {
    
        // Reglages des entrees/sorties
        TRISA = 0x0B;                         // Choix entrees/sorties
        LATA = 0x00;                          // RAZ des ports
        ANSELA = 0x00;                        // Choix mode analogique/numerique    
        WPUA = 0x02;                          // Resistances de pull-up interne
        
        TRISB = 0x00;                         // Choix entrees/sorties
        LATB = 0x80;                          // RAZ des ports
        ANSELB = 0x00;                        // Choix mode analogique/numerique
        WPUB = 0x00;                          // Resistances de pull-up interne 
        
        TRISC = 0x20;                         // Choix entrees/sorties
        LATC = 0xC0;                          // RAZ des ports
        ANSELC = 0x18;                        // Choix mode analogique/numerique
        WPUC = 0x20;                          // Resistances de pull-up interne
        
      
        
        while(1)   // boucle infinie
        {
           if ((etat_Bp <2 ) && (BP == 0)) // Si le bouton est appuyé => niveau 0 !
            {   
              __delay_ms(1);   // attend la fin des rebons mecaniques
               if (BP == 0)  // on confirme  si il est encore  appuyé !
                {
                   etat_Bp++;
                   ledR = ON;
                   
                    while(BP==0);    //    il faut le relacher ce BP !
                }
            } // if
           
           if ((etat_Bp >1) && (BP == 1))  // BP relaché, tiré au +VCC par Pull up
           {
               __delay_ms(1);  // attend la fin des rebons mecaniques
              if (BP == 1)  // il est bien relaché
               {
                 etat_Bp = 0;
                 ledR = OFF;         
               }
           } //if
        } //while  
    }

    -----
    Images attachées Images attachées

  2. #2
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Bonsoir,

    compte tenu de la vitesse de cette boucle, il y a de fortes chance que ça ne fonctionne pas bien du tout (à cause des rebonds).
    Le principe est toujours le même:
    -> gérer dans la routine d'interruption la détection de l'appui par changement de niveau détecté d'une entrée.
    -> traiter cet événement dans la boucle principale.

    Si vous voulez traiter l'info dans la boucle principale il va vous falloir modifier cela:
    Code:
    if ((etat_Bp <2 ) && (BP == 0)) // Si le bouton est appuyé => niveau 0 !
            {   
              __delay_ms(1);   // attend la fin des rebons mecaniques
               if (BP == 0)  // on confirme  si il est encore  appuyé !
                {
                   etat_Bp++;
                   ledR = ON;
                   
                    while(BP==0);    //    il faut le relacher ce BP !
                }
            } // if
           
           if ((etat_Bp >1) && (BP == 1))  // BP relaché, tiré au +VCC par Pull up
           {
               __delay_ms(1);  // attend la fin des rebons mecaniques
              if (BP == 1)  // il est bien relaché
               {
                 etat_Bp = 0;
                 ledR = OFF;         
               }
           } //if
    A l'init etat_bp est égal à 0.
    Lorsque vous détectez l'appui vous incrémentez de 1, mais vous retournerez dans le premier if au prochain appui vu que la condition (<2) est remplie... et la condition du 2eme if (>1) ne l'ai pas.
    Donc ça tourne peut être mais dans les faits pas vraiment.
    Dernière modification par Chtulhu ; 22/06/2018 à 23h12.

  3. #3
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Bonsoir, j'ai modifé mon code mais la led clignote sans la gestion du bouton.
    Code:
    // CONFIG1
    #pragma config FEXTOSC = OFF        // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
    #pragma config RSTOSC = HFINT1      // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
    #pragma config CLKOUTEN = OFF       // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
    #pragma config CSWEN = ON           // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
    #pragma config FCMEN = OFF          // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
    
    // CONFIG2
    #pragma config MCLRE = ON           // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
    #pragma config PWRTE = OFF          // Power-up Timer Enable bit (PWRT disabled)
    #pragma config WDTE = OFF           // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
    #pragma config LPBOREN = OFF        // Low-power BOR enable bit (ULPBOR disabled)
    #pragma config BOREN = SBOREN       // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)
    #pragma config BORV = LOW           // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
    #pragma config PPS1WAY = OFF        // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
    #pragma config STVREN = OFF         // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
    #pragma config DEBUG = OFF          // Debugger enable bit (Background debugger disabled)
    
    // CONFIG3
    #pragma config WRT = OFF            // User NVM self-write protection bits (Write protection off)
    #pragma config LVP = ON             // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)
    
    // CONFIG4
    #pragma config CP = OFF             // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
    #pragma config CPD = OFF            // Data NVM Memory Code Protection bit (Data NVM code protection disabled)
    
    // PORT A
    #define ICSPDAT         RA0                     // Port de programmation
    #define POWER           RA1                     // Retour d etat charge batterie
    #define MCLR            RA3                     // Port de programmation
    #define Vactiv          RA5                     // Grille transistor ventilateur
    
    // PORT B
    #define ledR            RB7                     // +LED rouge
    
    // PORT C
    #define BP              RC5                     // Bouton poussoir
    
    #define ON              0                       // Led tirée au +VCC
    #define OFF             1                       // Led tiréé au gnd
    
    
    //#define _XTAL_FREQ      8000000                // Oscillateur réglé à 8MHz
    
    #include <xc.h>
    
    int count = 0;
    
    void interrupt Interrupt_bp (void)
    {
           
        if(( PIE0bits.IOCIE ) && (PIR0bits.IOCIF))
            PIR0bits.IOCF = 0;        // RAZ flag IT
            count++;
            if (count==76){
                count = 0;
                ledR = ~ledR;
            }
        }
    
    
    
    void main(void)
    {
         
         // Reglages des entrees/sorties
        TRISA = 0b00001011;                         // Choix entrees/sorties
        LATA = 0b00000000;                          // RAZ des ports
        ANSELA = 0b00000000;                        // Choix mode analogique/numerique    
        WPUA = 0b00000010;                          // Resistances de pull-up interne
        
        TRISB = 0b00000000;                         // Choix entrees/sorties
        LATB = 0b10000000;                          // RAZ des ports
        ANSELB = 0b00000000;                        // Choix mode analogique/numerique
        WPUB = 0b00000000;                          // Resistances de pull-up interne 
        
        TRISC = 0b00100000;                         // Choix entrees/sorties
        LATC = 0b11000000;;                         // RAZ des ports
        ANSELC = 0b000110000;                        // Choix mode analogique/numerique
        WPUC = 0b00100000;                          // Resistances de pull-up interne
     
        //Reglage des interuptions
        INTCONbits.GIE = 1;                         // Valide les interruptions generales
        INTCONbits.PEIE = 1;                        // Valide les interruptions peripheriques
        INTCONbits.INTEDG = 0;                      // Interruption sur un front descendant                      
        
        //Reglage des peripheriques
        PIE0bits.TMR0IE = 1;                       // Valide l'interruption generee par le debordement du Timer0
        PIE0bits.IOCIE = 1;                        // Valide le changement d'etat
        PIE0bits.INTE = 1;                         // Autoise l'interruption sur un peripherique exterieur
        
        PIR0bits.TMR0IF = 0;                       // RAZ flag  IT
        PIR0bits.IOCIF = 1;                        // Activation du front descendant
        PIR0bits.INTF = 1;                         // Detection d'une interruption
        
        while (1){
            
        }
    }

  4. #4
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Voici le schéma qui pourra peut être vous aider.
    Images attachées Images attachées  

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

    Re : Question sur l'interruption avec un PIC16F18345

    Un code à adapter selon votre µC:
    Code:
    #include <xc.h>
    
    // CONFIG1H
    #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal Oscillator Block))
    
    // CONFIG2H
    #pragma config WDTEN = OFF      // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
    
    // CONFIG3H
    #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<5:0> pins are configured as digital I/O on Reset)
    
    
    // I/O
    #define BP         PORTBbits.RB4
    #define LED        PORTDbits.RD2
    
    
    
    void anti_rebond(void)
    {
        TMR0L = 0;
        T0CONbits.TMR0ON = 1;
    }
    
    void interrupt boutons(void)
    {
        if (INTCONbits.RBIF && INTCONbits.RBIE) 
          {
            if (BP) NOP();
            INTCONbits.RBIF = 0;
            anti_rebond();
          }
        
        else if (INTCONbits.TMR0IF && INTCONbits.TMR0IE) 
          {
            LED = !LED;
            T0CONbits.TMR0ON = 0;
            INTCONbits.TMR0IF = 0;
          }
    }
    
    
    void main(void)
    {
        // Ports
        TRISB = 0xFF;           // Config PORTB en entrée
        ANSELD = 0;             // Digital
        TRISD = 0;              // Config PORTD en sortie
    
        // Rb4-7 Interrupt
        IOCB = 0xFF;   // à voir selon le µC
                        
        INTCONbits.RBIF = 0;
        INTCONbits.RBIE = 1;
        
        // Tmr0 Interrupt
        T0CON = 0b01000100;     // T0OFF 8bits CLKOUT - Use Postscaler : 1/32   => Tmr0 overflow = 256*32*4/1000000 = 32,768ms
        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
            
        // Pullup
        INTCON2bits.RBPU = 0;
        
        // Init
        LED = 0;
        INTCONbits.GIE = 1;
        
        while (1) 
                {
                 .......... // votre code ici.
                }
    }
    Dernière modification par Chtulhu ; 22/06/2018 à 23h24.

  7. #6
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    On a besoin d'utiliser un Timer pour gérer une interruption ?

  8. #7
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Non, mais vous avez besoin d'un anti-rebonds.
    En mettant une tempo avec un delay_ms vous risquez de rater des événements vu que ce type de fonction est bloquante (quand votre code sera plus garni).
    Une tempo sous interruption est bien plus efficace et plus propre.

  9. #8
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Je testerais ce code lundi comme je n'ai pas le matériel sur moi mais merci d'avance ! J'ai une autre question concernant le mode veille du PIC, j'aimerais utiliser une fonction d'interruption pour gérer le mode veille avec ce bouton poussoir .

    1. J'appuie sur le bouton --> activation du mode veille
    2. 2eme appui pour revenir en mode normal

    C'est pour vérifier le niveau de consommation du PIC , si vous avez une idée pour gérer cela, je suis totalement preneur !

  10. #9
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Code:
    void interrupt Interrupt_bp (void)
    {
           
        if(( PIE0bits.IOCIE ) && (PIR0bits.IOCIF))
           { PIR0bits.IOCF = 0;        // RAZ flag IT
            count++;
            if (count==76){
                count = 0;
                ledR = ~ledR;
            }
          }
        }
    Attention à ne pas oublier des parenthèses.

  11. #10
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Vous devez mettre le µC en mode sleep.

    Après détection et validation de l'appui vous ajoutez
    Code:
    asm sleep;  // vérifier la syntaxe selon le compilateur
    puis au prochain appui (à la prochaine interruption) le µC sortira de ce mode automatiquement.

  12. #11
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    J'utilise plutôt le langage C je pense que la syntaxe est " SLEEP (); "

    Du coup, c'est la même logique de programme avec la led ?

  13. #12
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Ca dépend du compilateur C.
    Par exemple moi j'utilise MikroC et c'est:
    Code:
    asm sleep;
    Oui la commande sleep prend effet dès qu'elle est appelée, donc à mettre en sortie d'interruption.
    Dernière modification par Chtulhu ; 22/06/2018 à 23h47.

  14. #13
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    à la fin de l'interruption ?

  15. #14
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Je précise que le C ne peut gérer la commande sleep directement, c'est forcément une commande assembleur, d'où le asm devant sleep

  16. #15
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Ah bon car j'utilise le compilateur MPLAB X IDE V4.10 et j'écris toujours en C et j'ai du mal avec l'asm

  17. #16
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Citation Envoyé par Jo7 Voir le message
    à la fin de l'interruption ?
    Oui, le but est de mettre en sleep après que tout le processus de détection d'appui soit exécuté.
    Il serait plus propre d'avoir une variable dans le prog principal qui serait activée depuis l'interruption, après détection et validation de l'appui BP en interruption, et d'y mettre la commande sleep.

  18. #17
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    C'est-à-dire vous avez un exemple ?

  19. #18
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Code:
    volatile char ack_BP = 0;
    
    
    void interrupt Interrupt_bp (void)
    {
           
        if(( PIE0bits.IOCIE ) && (PIR0bits.IOCIF) && (ack_BP == 0))
           { 
              PIR0bits.IOCF = 0;        // RAZ flag IT
              
              ack_BP = 1; // validation de l'appui qui active le traitement dans le main()
           }
          
    }
    
    void main(void)
    {
    
    ..........
    
    if(ack_BP)  // la valeur de ack_BP est défini dans l'interruption
      {
       ledR = ~ledR;
       ack_BP = 0;  // on reset ack_BP 
       asm sleep; // mise en sommeil ici
      }
    .....
    }
    C'est juste une idée qui peut être mieux affinée, vous avez au moins le principe.
    Dernière modification par Chtulhu ; 23/06/2018 à 00h12.

  20. #19
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Ah je vois un peu le principe merci bien !

  21. #20
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    N'oubliez pas de découpler l'alim de votre µC avec un condensateur de 100nF minimum.
    Tous les I/O dont vous ne vous servez pas seront à positionner en sortie à 0, et pas en entrée (si pas de pull-up ou de pull-down comme je le vois sur votre platine).
    Dernière modification par Chtulhu ; 23/06/2018 à 00h24.

  22. #21
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Il est forcement obligatoire de rajouter ces resistances ?

  23. #22
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    A moins que vous activiez les pull-up internes, dans ce cas non.

  24. #23
    Chtulhu

    Re : Question sur l'interruption avec un PIC16F18345

    Pour SCL et SDA par exemple il faudra des pull-up externes et mettre des 4.7K (valeur à affiner et signaux à vérifier au scope selon la distance et le nombre de boitier I2C que vous aurez).

  25. #24
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Bonjour,
    J'ai un problème avec mon code. Je souhaiterais effectuer la mise en veille du µc en appuyant sur un bouton-poussoir afin que la LED s'allume. Le seconde appui permettrait de revenir au mode normal avec un clignotement de la LED . Pouvez-vous m'aider à résoudre ce problème ? Merci d'avance !
    Code:
    // CONFIG1
    #pragma config FEXTOSC = OFF    // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
    #pragma config RSTOSC = HFINT1  // Power-up default value for COSC bits (HFINTOSC (1MHz))
    #pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2)
    #pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
    #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
    
    // CONFIG2
    #pragma config MCLRE = ON       // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
    #pragma config WDTE = ON        // Watchdog Timer Enable bits (WDT enabled, SWDTEN is ignored)
    #pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
    #pragma config BOREN = SBOREN   // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)
    #pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
    #pragma config PPS1WAY = OFF    // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
    #pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
    #pragma config DEBUG = OFF      // Debugger enable bit (Background debugger disabled)
    
    // CONFIG3
    #pragma config WRT = OFF        // User NVM self-write protection bits (Write protection off)
    #pragma config LVP = ON         // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)
    
    // CONFIG4
    #pragma config CP = OFF         // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
    #pragma config CPD = OFF        // Data NVM Memory Code Protection bit (Data NVM code protection disabled)
    
    // PORT A
    #define ICSPDAT         RA0                     // Port de programmation
    #define POWER           RA1                     // Retour d etat charge batterie
    #define MCLR            RA3                     // Port de programmation
    #define Vactiv          RA5                     // Grille transistor ventilateur
    
    // PORT B
    #define ledR            RB7                     // +LED rouge
    
    // PORT C
    #define BP              RC5                     // Bouton poussoir
    
    //#define ON              0                               // Led tirée au +VCC
    //#define OFF             1                               // Led tiréé au gnd
    
    //#define _XTAL_FREQ  8000000                     // Oscillateur réglé à 8MHz
    #include <xc.h>
    
    unsigned char etat_Bp = 0;
    
    void interrupt Interrupt_bp (void)
    {
           
        if(( PIE0bits.IOCIE ) && (PIR0bits.IOCIF) && (etat_Bp == 0))
           { 
              PIR0bits.IOCIF = 0;        // RAZ flag IT
              etat_Bp = 1; // validation de l'appui
        }
        SLEEP();
    }
    void main(void) {
        
        OSCCON1 = 0b01100000;                       // Oscillateur interne
        OSCFRQ = 0b00000110;                        // Frequence oscillateur a 16MHz
        CPUDOZE = 0b00000000;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        VREGCON = 0b00000010;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        
         // Reglages des entrees/sorties
        TRISA = 0x0B;                         // Choix entrees/sorties
        LATA = 0x00;                          // RAZ des ports
        ANSELA = 0x00;                        // Choix mode analogique/numerique    
        WPUA = 0x02;                          // Resistances de pull-up interne
        
        TRISB = 0x00;                         // Choix entrees/sorties
        LATB = 0x80;                          // RAZ des ports
        ANSELB = 0x00;                        // Choix mode analogique/numerique
        WPUB = 0x00;                          // Resistances de pull-up interne 
        
        TRISC = 0x20;                         // Choix entrees/sorties
        LATC = 0xC0;                          // RAZ des ports
        ANSELC = 0x18;                        // Choix mode analogique/numerique
        WPUC = 0x20;                          // Resistances de pull-up interne 
        
        //Reglage des interuptions
        INTCON = 0b11000000;
      
        //Reglage des peripheriques
        PIE0bits.TMR0IE = 0;                       // Valide l'interruption generee par le debordement du Timer0
        PIE0bits.IOCIE = 1;                        // Valide le changement d'etat
        PIE0bits.INTE = 1;                         // Autoise l'interruption sur un peripherique exterieur
        
        PIR0bits.TMR0IF = 0;                       // RAZ flag  IT
        PIR0bits.IOCIF = 1;                        // Activation du front descendant
        PIR0bits.INTF = 1;                         // Detection d'une interruption
     
        
     while(1){
         if(etat_Bp){  // la valeur de ack_BP est défini dans l'interruption
      
            ledR = ~ledR;
            etat_Bp = 1;  // on reset etat_Bp 
            SLEEP(); // mise en sommeil ici
            }   // boucle infinie
     }
    }

  26. #25
    antek

    Re : Question sur l'interruption avec un PIC16F18345

    Citation Envoyé par Jo7 Voir le message
    Je souhaiterais effectuer la mise en veille du µc en appuyant sur un bouton-poussoir afin que la LED s'allume.
    Sans connaitre le C . . .

    Tu vérifies, dans un endroit approprié du programme, le niveau de l'entrée en question.
    Mais la question est tellement évidente que la vraie question est sans doute cachée . . .

    Si le but du SLEEP est d'économiser l'énergie, c'est pas une bonne idée d'allumer alors une led.

  27. #26
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Oui je comprends mais c'est pour m'indiquer que le µc est en mode veille ou pas à l'aide du bouton. Je n'arrive pas à trouver la bonne méthode pour y parvenir . Avez-vous une idée ?

  28. #27
    antek

    Re : Question sur l'interruption avec un PIC16F18345

    Citation Envoyé par Jo7 Voir le message
    Avez-vous une idée ?
    Elle est donnée #25

  29. #28
    invite78edfed4

    Re : Question sur l'interruption avec un PIC16F18345

    Je veux dire au niveau programmation, quels changements à effectuer ?

Discussions similaires

  1. [Programmation] Programme LED + BP PIC16F18345
    Par invite78edfed4 dans le forum Électronique
    Réponses: 1
    Dernier message: 19/02/2018, 19h49
  2. question interruption
    Par stephane-mecano dans le forum Électronique
    Réponses: 6
    Dernier message: 18/07/2014, 19h56
  3. Question PIC valeur PORTB avec RBO en interruption
    Par boy30 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/04/2013, 11h20
  4. Question Interruption PIC 16F877
    Par invite1cd8f19a dans le forum Électronique
    Réponses: 10
    Dernier message: 25/03/2010, 21h59
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...