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 ---
- 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 ---
Modérateur : Jérémy
Sleep Mode avec un PIC16F18345
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 : 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 == 1 && 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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ...
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
Sleep Mode avec un PIC16F18345
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 .
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 .
Sleep Mode avec un PIC16F18345
Sleep Mode avec un PIC16F18345
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 !
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
Sleep Mode avec un PIC16F18345
Sleep Mode avec un PIC16F18345
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 !
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 !
Sleep Mode avec un PIC16F18345
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.
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 == 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
}
}
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){
}
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 39 invités