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
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
D'une maniere generale , quand on utilse un flag "utilisateur" ( distingo par rappport au flag MCU !)
on l'initialise en debut de programme
on le positionne à 1 ou a 0 via une evenement generant une interruption (donc modifié dans l'interruption desirée)
puis on le traite dans le main programme.
orientation du programme en fonction de l'etat de ce flag.
D'une maniere generale , quand on utilse un flag "utilisateur" ( distingo par rappport au flag MCU !)
on l'initialise en debut de programme
on le positionne à 1 ou a 0 via une evenement generant une interruption (donc modifié dans l'interruption desirée)
puis on le traite dans le main programme.
orientation du programme en fonction de l'etat de ce flag.
Sleep Mode avec un PIC16F18345
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 !
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 : 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 = 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){
}
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités