[Programmation] Sleep Mode avec un PIC16F18345
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Sleep Mode avec un PIC16F18345



  1. #1
    Jo7

    Sleep Mode avec un PIC16F18345


    ------

    Bonsoir à tous,

    J'avais une question à propos du mode veille ( SLEEP Mode) du microcontrôleur pour vérifier la consommation de celui-ci.
    Je souhaiterais simplement à l'aide de mon code activer dès la mise sous tension du PIC le mode vielle sans bouton ni d'interruption.
    Le problème c'est que le code ne fait rien et la consommation reste la même. Pouvez-vous m'indiquer mon erreur ? 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 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)
    
    #include <xc.h>
    
    // 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*/
    
    
    
    void main(void)
    {
    
            // Reglages des entrees/sorties
        TRISA = 0b00001011;                         // Choix entrees/sorties
        LATA = 0b00000000;                          // RAZ des ports
        ANSELA = 0;                                 // Choix mode analogique/numerique    
        INLVLA = 0b00000010;                        // Niveaux TTL
        WPUA = 0b00000010;                          // Resistances de pull-up interne
        TRISB = 0b01010000;                         // Choix entrees/sorties
        LATB = 0b10000000;                          // RAZ des ports
        ANSELB = 0;                                 // Choix mode analogique/numerique
        INLVLB = 0b10000000;                        // Niveaux TTL
        SLRCONB = 0b10101111;                       // Slew rate
        WPUB = 0;                                   // Resistances de pull-up interne 
        TRISC = 0b00111000;                         // Choix entrees/sorties
        LATC = 0b11000000;                          // RAZ des ports
        ANSELC = 0b00011000;                        // Choix mode analogique/numerique
        INLVLC = 0b11000111;                        // Niveaux TTL
        SLRCONC = 0b11111111;                       // Slew rate
        WPUC = 0b00100000;                          // Resistances de pull-up interne
        
           
       
    while(1){
        SLEEP();  // boucle infinie
        }

    -----

  2. #2
    antek

    Re : Sleep Mode avec un PIC16F18345

    Je ne sais pas le résultat d'une instruction SLEEP lorsque le µC y est déjà.
    Placer peut-être un NOP dans la boucle.

    Quels sont les résultats de mesure, avant et après ?

  3. #3
    Jo7

    Re : Sleep Mode avec un PIC16F18345

    bonjour,

    Dès que je lance le programme , le µc reste avec une consommation de 14mA environ, je ne comprends pas pourquoi il ne s'active pas en mode veille

  4. #4
    antek

    Re : Sleep Mode avec un PIC16F18345

    Remplace ta boucle SLEEP par une boucle NOP, cela permettra de faire la mesure de courant.
    Tu sors de la boucle (par tempo ou BP),
    exécution instruction SLEEP (pas dans une boucle),
    puis nouvelle mesure de courant.

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

    Re : Sleep Mode avec un PIC16F18345

    comme par exemple :
    Code:
      __delay_ms(100);
        SLEEP();
        
      
        while(1){
            NOP();
          }
    }

  7. #6
    Jo7

    Re : Sleep Mode avec un PIC16F18345

    J'ai testé ce code et cela ne change rien, bizarre!

  8. #7
    antek

    Re : Sleep Mode avec un PIC16F18345

    Non !

    Il faut d'abord la boucle NOP pour mesurer la consommation "standard".
    Sortir de la boucle.
    Exécuter SLEEP.
    Remesurer le courant.

    Et le "delay" ne sert à rien.

    En C je suis un bricolo, alors je ne te dirai pas comment faire . . .

  9. #8
    Jo7

    Re : Sleep Mode avec un PIC16F18345

    Il me faut un exemple pour bien comprendre la logique

  10. #9
    Jo7

    Re : Sleep Mode avec un PIC16F18345

    Bonjour, j'ai un petit problème sur mon code. Lors d'un appui, le µc se met en mode veille mais je n'arrive pas à remettre le mode normale c'est-à-dire réveiller le µc.

    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 = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
    #pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
    #pragma config BOREN = ON       // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored)
    #pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
    #pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will 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 = OFF        // Low Voltage Programming Enable bit (High Voltage on MCLR/VPP must be used for programming.)
    
    // 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      32000000              // Oscillateur réglé à 32MHz
    
    #include <xc.h>
    #include <pic16f18345.h>
    
    //int etat_Bp;
    
    void interrupt ISR_sleep ()
    {
       if(PIE0bits.IOCIE == 1 && PIR0bits.IOCIF == 1)  // IT changement d'etat bouton
        {
           //etat_Bp = 0;
           PIR0bits.IOCIF = 0;                        // RAZ flag IT --> facultatif : mettre en commentaire ne change pas le programme
           IOCCFbits.IOCCF5 = 0;                      // RAZ flag IT
           SLEEP();                                   // Mise en veille du µc
       }
    
    }
    
    
    void main(void) {
        
        OSCCON1 = 0x60;                        // Oscillateur interne
        OSCFRQ = 0x07;                        // Frequence oscillateur a 32MHz
        CPUDOZE = 0x70;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        VREGCON = 0x03;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        
        // Reglages des entrees/sorties
        TRISA = 0x37;                         // Choix entrees/sorties
        LATA = 0x00;                          // RAZ des ports
        ANSELA = 0x37;                        // Choix mode analogique/numerique    
        WPUA = 0x20;                          // Resistances de pull-up interne
        
        TRISB = 0xFF;                         // Choix entrees/sorties
        LATB = 0x00;                          // RAZ des ports
        ANSELB = 0x70;                        // Choix mode analogique/numerique
        WPUB = 0x00;                          // Resistances de pull-up interne 
        
        TRISC = 0xFF;                         // Choix entrees/sorties
        LATC = 0x00;                          // RAZ des ports
        ANSELC = 0xDF;                        // Choix mode analogique/numerique
        WPUC = 0x20;                          // Resistances de pull-up interne
     
       //Reglage des interuptions
        INTCON = 0b11000000;                 // Autorisation des interruptions : GIE=1, PEIE=1 , INTED=0 donc sur front descendant
    
        IOCCNbits.IOCCN5 = 1;                // Interruption sur la pin RC5 negative activee
        PIE0bits.IOCIE = 1;                  // Valide le changement d'etat
        IOCCFbits.IOCCF5 = 0;                // RAZ flag IT
        
        while(1){
         
          }         
    }

  11. #10
    antek

    Re : Sleep Mode avec un PIC16F18345

    La manière de sortir d'un Sleep est clairement indiquée dans la datasheet.
    Dans le programme d'interruption certains évenement ne sont pas pris en compte, voir datasheet.

  12. #11
    Jo7

    Re : Sleep Mode avec un PIC16F18345

    Bonjour,
    Le PIC que j'utilise propose trois mode de mises hors tension :mode DOZE, mode IDLE et mode veille (P113). Je souhaiterais à l'aide du bouton faire varier ces trois mode par une interruption.

    Sur ma plaque à essai, j'ai mis un bouton poussoir branché sur RC5(au repos 5V sur RC5 et si un appui sur le BP, 0V sur RC5), je souhaite donc utiliser les interruptions et les différents mode de consommation du mode sleep de mon PIC16F18345
    1/BP au repos->pas d'interruption sur RC5->PIC en mode SLEEP
    2/Appui sur BP->interruption sur RC5->PIC en mode DOZE ->Programme en fonctionnement
    3/RE Appui sur BP->interruption sur RC5->arret du programme->PIC en Mode IDLE

    Mon code actuel fait la chose suivante : mise sous tension --> mode veille, appui sur le bouton --> mode normal
    Je n'arrive pas à faire varier les différents modes. 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 = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
    #pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled)
    #pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
    #pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will 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
    
    
    #define ON              0                       // Led tirée au +VCC
    #define OFF             1                       // Led tiréé au gnd
    
    //#define _XTAL_FREQ      1000000              // Oscillateur réglé à 1MHz
    
    //int etat_Bp;                                   // Variable bouton
    
    #include <xc.h>
    #include <pic16f18345.h>
    
    void interrupt ISR ()
    {
       if(PIE0bits.IOCIE)  // IT changement d'etat bouton
        {
    
        CPUDOZEbits.IDLEN = 1;
        IOCCFbits.IOCCF5 = 0;                      // RAZ flag IT
    
       }
       else if (PIE0bits.IOCIE){
    
         CPUDOZEbits.DOZEN = 1;
         IOCCFbits.IOCCF5 = 0;                      // RAZ flag IT
          
       }
    
    }
    
    void main(void) {
        
        OSCCON1 = 0x37;                       // Oscillateur interne
        OSCFRQ = 0x06;                        // Frequence oscillateur a 16MHz
        CPUDOZE = 0x00;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        VREGCON = 0x03;                       // Choix DOZE/IDLE mode pour economie d energie en veille
        
        // Reglages des entrees/sorties
        TRISA = 0x37;                         // Choix entrees/sorties
        LATA = 0x00;                          // RAZ des ports
        ANSELA = 0x37;                        // Choix mode analogique/numerique    
        WPUA = 0x20;                          // Resistances de pull-up interne
        
        TRISB = 0xFF;                         // Choix entrees/sorties
        LATB = 0x00;                          // RAZ des ports
        ANSELB = 0x70;                        // Choix mode analogique/numerique
        WPUB = 0x00;                          // Resistances de pull-up interne 
        
        TRISC = 0xFF;                         // Choix entrees/sorties
        LATC = 0x00;                          // RAZ des ports
        ANSELC = 0xDF;                        // Choix mode analogique/numerique
        WPUC = 0x20;                          // Resistances de pull-up interne
        
        //WDTCON = 0x3C;
        
        //Reglage des interuptions
        INTCON = 0b11000000;                 // Autorisation des interruptions : GIE=1, PEIE=1 , INTED=0 donc sur front descendant
    
        IOCCNbits.IOCCN5 = 1;                // Interruption sur la pin RC5 negative activee
        PIE0bits.IOCIE = 1;                  // Valide le changement d'etat
        IOCCFbits.IOCCF5 = 0;                // RAZ flag IT
        
        SLEEP();
        
        while(1){
          }         
    }

Discussions similaires

  1. [Programmation] sortir du mode sleep avec 12f508
    Par elsena dans le forum Électronique
    Réponses: 8
    Dernier message: 04/09/2017, 19h28
  2. mode sleep sur pic
    Par alainav1 dans le forum Électronique
    Réponses: 4
    Dernier message: 08/09/2011, 07h52
  3. PIC différence entre le mode iddle et le mode sleep
    Par Fiston dans le forum Électronique
    Réponses: 4
    Dernier message: 18/01/2010, 09h30
  4. [PIC]-Mode SLEEP,IDLE
    Par jorg1n dans le forum Électronique
    Réponses: 9
    Dernier message: 28/02/2008, 17h54
  5. PIC24FJ128 & Sleep mode
    Par bouly94 dans le forum Électronique
    Réponses: 6
    Dernier message: 27/09/2007, 23h22
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...