Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#21 Message par jo7 » mar. 3 juil. 2018 09:01 lien vers la Data-Sheet : Cliquez ici

Oui avec une interruption sur changement d'état effectivement, je vais essayer d'écrire ce code

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#22 Message par jo7 » jeu. 5 juil. 2018 13:31 lien vers la Data-Sheet : Cliquez ici

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 : Tout sélectionner

// 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>

unsigned etat_Bp;

void interrupt ISR_sleep ()
{
   if(
PIE0bits.IOCIE == && PIR0bits.IOCIF == 1)  // IT changement d'etat bouton
    
{
        
etat_Bp 0;                               // bouton appuyer
        
PIR0bits.IOCIF 0;                        // RAZ flag IT --> facultatif : mettre en commentaire ne change pas le programme
        
IOCCFbits.IOCCF5 0;                      // RAZ flag IT
        
SLEEP();
   }

}


void main(void) {
    
    
OSCCON1 0x60;                        // Oscillateur interne
    
OSCFRQ 0x07;                        // Frequence oscillateur a 32MHz
    
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
    
    //__delay_ms(5000);                     // temporisation de 5s avant d'entrer en veille
    
   //Reglage des interuptions
    
INTCON 0b11000000;                 // Autorisation des interruptions : GIE=1, PEIE=1 , INTED=0 donc sur front descendant

    
IOCCFbits.IOCCF5 0;                // RAZ flag IT
    
IOCCNbits.IOCCN5 1;                // Interruption sur la pin RC5 negative activee
    
PIE0bits.IOCIE 1;                  // Valide le changement d'etat
    

    
while(1){
     
      }         
}
 

Sleep Mode avec un PIC16F18345
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1033
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#23 Message par paulfjujo » jeu. 5 juil. 2018 17:49 lien vers la Data-Sheet : Cliquez ici

bonsoir,



Je pense que l'activation du SLEEP devrait plutot se faire dans le main programme ...
mais apres le Sleep
il faut FAIRE quelque chose
au moins pour montrer qu'on est reveillé !

C'est pas bien clair dans ton raisonnement :
L'interrupt push button ,c'est pour te mettre en mode sommeil (sleep)
ou pour te reveiller ?
il faut choisir quel est l'evenement qui te mettra en sommeil
(Evenement ou action volontaire par le programme)
et l'evenement qui te sort du sommeil ( Reveil!)
Il doit y avoir de la config à faire pour cela.

désolé, je n'ai testé que le reveil par UART ...

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#24 Message par jo7 » jeu. 5 juil. 2018 21:31 lien vers la Data-Sheet : Cliquez ici

Bonsoir,
Quand j'appui sur le bouton, cela active le mode sommeil et j'aimerais un second appui pour le réveiller et revenir en mode normal. Je n'arrive pas à trouver la bonne logique. Le watchdog peut réveiller le PIC ou une autre fonction ?

Sleep Mode avec un PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#25 Message par Jérémy » jeu. 5 juil. 2018 22:51 lien vers la Data-Sheet : Cliquez ici

JE pense que t'y prends mal .

Tu n'as pas besoin d'une action particulière pour entrer en sommeil. pas besoin de broches spécifiques, tu rentres en sommeil quand tu veux avec la fonction dédiée. ( encore faut il que le mode soit autorisé).

C'est pour sortir du mode veille qu'il faut une action spécifique ! Ça peut être le changement d'état d'une PIN un timer un la reception uART, regarde dans ta DS .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#26 Message par jo7 » jeu. 5 juil. 2018 22:55 lien vers la Data-Sheet : Cliquez ici

C'est-a dire que li'nstruction SLEEP dans l'interruption n'est pas utile et plutôt la mettre dans le programme principale à la boucle while ?

Sleep Mode avec un PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#27 Message par Jérémy » jeu. 5 juil. 2018 23:13 lien vers la Data-Sheet : Cliquez ici

jo7 a écrit :Source du message C'est-a dire que li'nstruction SLEEP dans l'interruption n'est pas utile et plutôt la mettre dans le programme principale à la boucle while ?

Presque !

Pas dans la boucle while mais par une action volontaire .
Sinon au réveil de ton pic tu retournes dans ta boucle while et tu le re-endors ! :sifflotte:

TU peux utiliser un seul bouton pour tout faire !

Un appui tu l'endors, un autre tu le réveil. mais dans ce cas il faut que le BP soit branché sur une PIN particuliére qui puisse sortir ton pic du sommeil sur changement d'état !

Cherche wake-up dans la DS
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#28 Message par jo7 » jeu. 5 juil. 2018 23:16 lien vers la Data-Sheet : Cliquez ici

Dans l'interruption je peux par exemple faire clignoter une led et ensuite revenir en mode sommeil ?

Sleep Mode avec un PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#29 Message par Jérémy » jeu. 5 juil. 2018 23:22 lien vers la Data-Sheet : Cliquez ici

L'interruption te sert a sortir du mode sommeil ,pas à y entrer !

Je ne maitrise pas trop le sujet. Mais il me semble que de toute façon c'est une INT qui fait fait sortir du sommeil; soit changement d'état, une reception UART un timer etc ... a chaque fois c'est une INT.

Si tu est en sommeil ne rien faire clignoter au contraire.

Tu fais clignoter une led dans ta boucle .
Au bout de 20 clignotement tu bascule en sommeil ( ta led devra rester allumé ou éteinte) car le pIC dors.
Tu appui sur le BP dédié et hop ca réveille le PIC et ta led clignote à nouveau !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Sleep Mode avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#30 Message par jo7 » ven. 6 juil. 2018 09:20 lien vers la Data-Sheet : Cliquez ici

Bonjour Jérémy !
J'ai modifié un peu mon code, à la mise sous tension le µc se met automatiquement en mode sommeil, c'est normal. Ensuite j'appuie sur le bouton, le µc se réveillle mais lorsque j'appuie une seconde fois, il ne se passe rien. J'aimerais lors du second appui revenir en mode sommeil sans la LED ni rien.

Code : Tout sélectionner

// 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 == && 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      
         
   
}

}



void main(void) {
    
    
OSCCON1 0x60;                        // Oscillateur interne
    
OSCFRQ 0x07;                        // Frequence oscillateur a 32MHz
    
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
 
   //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();                                   // Mise en veille du µc
    
    
while(1){
        
    }         
}
 


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités